文章目录

  • 前言
  • 源码1
  • 源码2
  • 源码1+2

前言

老板的任务罢了-----解读源码,阐明原理,自定义展示。

源码1

以下为我负责的代码阐明部分,其中的函数均可从robocodeAPI查询,如INDEX方法

package lyx;//为方便做实验从sample的Tracker复制例程到我自己包里,仅作小部分修改
import robocode.HitRobotEvent;
import robocode.Robot;
import robocode.ScannedRobotEvent;
import robocode.WinEvent;
import static robocode.util.Utils.normalRelativeAngleDegrees;
import robocode.*;import java.awt.*;public class Testor extends  AdvancedRobot
{int count = 0; // 计数器,确切来说是标置double gunTurnAmt; String trackName;//为体现追踪特点,会记住扫描到的第一个敌人(冤种)public void run() {setBodyColor(new Color(255, 0, 0));//车体颜色稍作更改setGunColor(new Color(0, 0, 250));setRadarColor(new Color(0, 250, 0));setScanColor(Color.blue);setBulletColor(Color.white);trackName = null; // 刚开始没有目标,目标名字为nullsetAdjustGunForRobotTurn(true); // 炮和身体分离,此外还有setAdjustRadarForGunTurn(true),雷达炮管分离gunTurnAmt = 15; // 每轮炮管旋转15度while (true) {//循环体,每次都会来一遍对于cout大小的判断,具体表现为在cout足够大时,一定先左再右turnGunRight(gunTurnAmt);count++;   if (count >18) {trackName =null;//如果超过12了,则会重置目标,再次找一个第一个扫描的敌人为目标,类似饥不择食}if (count > 10) {gunTurnAmt = 30;//在count在3-11之间时,炮管转向为左,超过后以更快速度右转扫描}else if (count > 2) {gunTurnAmt = -20;//右边转完45没找到就左边转,转的快点}}}public void onScannedRobot(ScannedRobotEvent e) {if (trackName != null && !e.getName().equals(trackName)) {//有目标且扫描到的不是当前锁定目标则不作理会,选择returnreturn;}if (trackName == null) {//如果没有目标,则令目标名字等于检测到的目标,e.getName 推测为获取检测到的目标名字trackName = e.getName();out.println("Tracking " + trackName);}// 每次检测目标都会让cout归0,使得下次坦克寻找目标可以让scan线左右晃动快速搜索count = 0;//重置搜索标志,使scan能有左右扫描找到目标// 如果目标太远,适当接近目标if (e.getDistance() > 150) {//这个应该读的扫描瞬间的位置gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading()-getRadarHeading()));//稍后会作该部分解答。turnGunRight(gunTurnAmt); turnRight(e.getBearing());//在本函数范围内是车体和雷达的相对角度,范围-180-180度ahead(e.getDistance() - 140);//保持距离150以内return;}//先接近再开火gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//turnGunRight(gunTurnAmt);fire(3);//弹丸大也是一种优势,但目前没考虑弹丸问题,日后会考虑smartfire算法if (e.getDistance() < 150) {//在150单位范围内根据敌人方位适当进行调整if (e.getBearing() > -90 && e.getBearing() <= 90) {//这代表敌人前方back(40);//敌人在前半部分就后退一定距离} else {ahead(40);//敌人在屁股后就往前开,也是远离敌人}}scan();}public void onHitRobot(HitRobotEvent e) {//撞别的坦克了trackName = e.getName();//撞击坦克也会设定目标值gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//Returns the bearing to the robot you hit, relative to your robot's heading, in degrees (-180 <= getBearing() < 180),不同事件中getBearing代表的意义不同
//这个可以认为是炮台先跟车体前方对齐再按着车子的姿态角度转过去,在之前的事件中都是靠雷达发现目标,那个时候e.getBearing() + (getHeading() - getRadarHeading())对应值应该为0turnGunRight(gunTurnAmt);fire(3);back(50);//打完就跑}//嘲讽以下(doge)public void onWin(WinEvent e) {for (int i = 0; i < 50; i++) {turnRight(30);turnLeft(30);}}
}

源码2

//为做实验将crazy例程复制一份并稍作修改
package lyx;
import robocode.*;
import java.awt.*;
import static robocode.util.Utils.normalRelativeAngleDegrees;
public class Crazyor2 extends AdvancedRobot {boolean movingForward;double amt=0;public void run() {// Set colorssetBodyColor(new Color(0, 200, 0));setGunColor(new Color(0, 150, 50));setRadarColor(new Color(0, 100, 100));setBulletColor(new Color(255, 255, 100));setScanColor(new Color(255, 200, 200));//颜色和原sample中crazy例程一个色while (true) {setAhead(40000);
//设置一个大的前进路程,40000,这样以后车子会在一段时间内处于前进或者后退状态
//如果setAhead(40000)在循环之外会存在由于没撞墙撞车进入reverseDirection()重置前进后退路程情况
//所以我选择放死循环里面movingForward = true;turnRight(90);//右转90度,在setahead较小时候才会原地转,否则就表现为边走边转turnLeft(180);turnRight(180);//setTurnRight(180);//Sets the robot's body to turn right by degrees when the next execution takes place.}}public void onHitWall(HitWallEvent e) {reverseDirection();//撞墙则触发转向函数并重置前进的路程,也就是40000}public void reverseDirection() {if (movingForward) {//如果movingforward为true,则前进变后退setBack(40000);movingForward = false;} else {setAhead(40000);movingForward = true;}}public void onScannedRobot(ScannedRobotEvent e) {fire(1);}public void onHitRobot(HitRobotEvent e) {amt=normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));//计算转向角turnRight(amt);//添加撞车会转过来开炮功能fire(1);if (e.isMyFault()) {//这个英文意思是--这是我的错,字面上不好理解具体作用reverseDirection();}}

以上两个例程均有这一行代码

normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()))

getHeading() 与getRadarHeading()
在不同的函数,如onHitRobot-和其他坦克相撞,onScannedRobot-扫描到其他机器人,e.getBearing()返回值具有不同意义:

onHitRobot:
Returns the bearing to the robot you hit, relative to your robot’s heading, in degrees (-180 <= getBearing() < 180),即返回你的机器人正方向,与和你相撞机器人之间的夹角

onScannedRobot:
Returns the bearing to the robot you scanned, relative to your robot’s heading, in degrees (-180 <= getBearing() < 180),返回你的机器人与扫描到的机器人方向之间的夹角

(生怕老板看不懂)

源码1+2

抱着想尝试将两者优点合起来的想法,我把上边的代码放在一起试试,并作适当修改让效果好点

package lyx;
import robocode.HitRobotEvent;
import robocode.Robot;
import robocode.ScannedRobotEvent;
import robocode.WinEvent;
import static robocode.util.Utils.normalRelativeAngleDegrees;
import robocode.*;import java.awt.*;public class Testor2 extends  AdvancedRobot
{int count = 0;double gunTurnAmt; String trackName;boolean movingForward;public void run() {setBodyColor(new Color(255, 0, 0));setGunColor(new Color(0, 0, 250));setRadarColor(new Color(0, 250, 0));setScanColor(Color.blue);setBulletColor(Color.white);trackName = null;setAdjustGunForRobotTurn(true); gunTurnAmt = 90;movingForward = true;while (true) {setAhead(40000);turnGunRight(gunTurnAmt);count++; turnRight(30);if (count >18) {trackName =null;                    }turnLeft(30);if (count > 10) {gunTurnAmt = 90;}else if (count > 4) {gunTurnAmt = -90;}turnRight(30);}}public void onHitWall(HitWallEvent e){reverseDirection();}public void reverseDirection(){if (movingForward) {setBack(40000);movingForward = false;} else {setAhead(40000);movingForward = true;}
}public void onScannedRobot(ScannedRobotEvent e) {if (trackName != null && !e.getName().equals(trackName)) {return;}if (trackName == null) {trackName = e.getName();}count = 0;gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));turnGunRight(gunTurnAmt); fire(3);scan();}public void onHitRobot(HitRobotEvent e) {trackName = e.getName();gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading()));turnGunRight(gunTurnAmt);fire(3);if (e.isMyFault()) {reverseDirection();}}public void onWin(WinEvent e) {for (int i = 0; i < 50; i++) {turnRight(30);turnLeft(30);}}
}//如你所见就是放在一起了而已,没想象的丝滑
//

此外,编程期间遇见如:public void非法的表达式开始 需要‘;’的错误,这里的原因是花括号不一一对应出现问题

以下为battle节选,其中三个机器人对应情况如下:源码1-Testor ,源码2-Crazyor2,源码1+2-Testor2

录屏

(原来这么糊?!非常抱歉)

从中看出,源码1Testor的表现其实很稳定,但是为啥源码1+2的分数最高(如下),刚上手我也不清楚



##总结
robocode平台在调试和投入使用上还是很方便快捷有意思的,不过对于机器人如何设计以获得高分这一问题需要一步步寻找答案。同时,也希望能够就robocode多交流,以提升自身的思维和变成水平。
(老板,如果你看到这里记得给个好评,孩子还有好多事,尽力了5555)

嵌入式robocode实训-任务三相关推荐

  1. C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训

    C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训 功能演示: 版本介绍 滑动式 点击放大式 完整版 至尊版 获取方式 功能演示: 演示视频: 滑动式 点击放大式 版本介绍 分为滑动式.点击 ...

  2. C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训

    C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训 实现的全部功能: 功能演示: 版本介绍 简易版--大佬选这个 完整版--想保研.想得高分.想要装逼的同学选这个 至尊版--零基础的.想要装 ...

  3. 《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.9 TIM---输入捕获(脉冲频率测量)实验

    写在前面-- <STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>第四章4.9 TIM-输入捕获(脉冲频率测量)实验,讲解TIM输入捕获的原 ...

  4. STM32单片机开发应用教程 (HAL库版) ---基于国信长天嵌入式竞赛实训平台(CT117E-M4)教程汇总 与第一章 硬件平台简介

    写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>教程汇总,第一章将介绍国信长天嵌入式竞赛实训平台(CT117E-M4) ...

  5. 《STM32单片机开发应用教程(HAL库版)---基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第二章 软件安装与使用

    写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>系列之第二章,本章节将介绍开发软件STM32CubeMX和KEIL5的 ...

  6. 《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.3 按键控制实验

    写在前面-- <STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>第四章4.3 按键控制实验,讲述按键控制的编程方法 官方例程下载:http ...

  7. 《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.1 LED显示控制实验

    写在前面-- <STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>第四章4.1,本节将通过LED显示控制实验,学习STM32G431的开发技 ...

  8. 2048小游戏----嵌入式系统实训

    嵌入式系统设计实训 引言 本次嵌入式系统实训式设计一款2048小游戏,在Linux编译环境下及ARM Cortex-A8开发平台下的,实现2048游戏的开发,且对其进行性能分析.<2048> ...

  9. ⑤【蓝桥杯】STM32G4嵌入式竞赛实训平台(CT117E-M4)学习——定时器中断

    写在前面-- 本文将介绍嵌入式竞赛实训平台(CT117E-M4)开发板上定时器中断的使用. 目录 一.硬件平台 三.STM32G4系列定时器简介 四.配置过程 五.编写函数 六.总结 一.硬件平台 嵌 ...

  10. 苏嵌嵌入式linux实训 第1天

    本次实训教学由苏嵌教育这个机构来执行的,在学习和了解这门实训之前,我身边学长学姐甚至我身边的小伙伴他们早已在这样的嵌入式应用中"摸爬滚打",比我有更好的基础和学习经验,因为羡慕所以 ...

最新文章

  1. 【Joomla】TinyMCE - Add custom styles
  2. 安顺计算机二级考试,安顺市2020年3月计算机二级报名时间|网上报名入口【12月18日9:00开通】...
  3. java二维码生成并可以转换
  4. 汇编调用c函数为什么要设置栈
  5. openvino安装小记
  6. openwrt源码分析_openwrt 15.05.1源码
  7. 【OpenCV】OpenCV实战从入门到精通之 -- 图像对比度、亮度值调整
  8. OOA OOD OOP
  9. 真相 | 14 岁编程神童谎言坐实,除了谴责我们该反思什么?
  10. 2019-12-17 drivers/clocksource/arm_arch_timer.c
  11. js 动态生成HTML,并加载事件遇到的问题
  12. lopatkin俄大神精简中文系统Windows 8.1 Pro 19599 x86-x64 ZH-CN SM
  13. 7,Matlab实现末端轨迹跟踪
  14. 苏宁易购:苏宁小店将获4.5亿美元增资
  15. python 输出圆的面积公式_python计算圆的面积
  16. Java多线程_并发协助模型(管制法,信号灯法)
  17. Footprint 8月月报 DeFi市场多点开花,9月是否会迎来下一个爆发点
  18. python中dot函数_np.dot()函数的用法详解
  19. 在线考试题库型App
  20. 四川大学计算机专业调剂,四川大学计算机学院(软件学院)2019考研调剂信息

热门文章

  1. iOS 获取通讯录权限和权限提示弹框
  2. html原生js请求
  3. 唐宇迪学习笔记2:Python数据分析处理库——pandas
  4. 如何完整离线保存网页,包括网页完整特效?
  5. ElasticSearch 安装IK分词器
  6. qpsk调制matlab实现,QPSK调制与解调系统的MATLAB实现
  7. 思科网络设备命令大全
  8. 乐高机器人编程自学入门
  9. android studio如何重启,从Android Studio重新启动ADB(Restart ADB from Android Studio)
  10. python实现自动化打印