Robocode中一个高效雷达的学习记录
还记的刚接触到Robocode的兴奋,为Robocode比赛准备的艰辛,为写出的第一个机器人而高兴万分,为这个丰富的Robocode世界而震撼不已…
Robocode入门的门槛很低,但是要提高着实难度不小,这是我研究Robocode以来的一个不错的收获,作为告别Robocode的献礼,也为纪念我研究Robocode的日日夜夜留下点什么东西。
本雷达代码,提取自中国Robocode第一人,Wave技术的创始人iiley所写的Cigaret机器人中。
http://www.robochina.org,进入了解Robocode。
http://sourceforge.net/projects/robocode/files/ 下载Robocode
首先我们来复习Robocode世界中两个很重要的角度系统
注意,我的描述是用度为单位,代码中全使用弧度为单位。
第一, heading 角度系
如图所示,所谓heading角,即从Y轴出发,然后顺时针绕回Y轴的这么个角度区间,取值范围: [0,360]
第二, bearing角度系
所谓bearing 角,即从Y轴顺、逆时针出发,绕半圈回到Y轴所形成的两个角度区间,取值范围:顺时针[0,180) ;逆时针[0,-180]
好的,我们已近复习了两角度系,下面我们来学习这个非常高效的雷达。
首先给出代码:
public void onScannedRobot(ScannedRobotEvent e) {
//注意 这里的计算都以弧度为单位
double absBearing=0d;
//雷达转动角度
double radarTurnAngle=0d;
//得到绝对角度差
absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());
//根据absBearing角算出Radar要调整的角度
radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());
//转动雷达,注意是向右
setTurnRadarRightRadians(radarTurnAngle);
}
|
分析实例:
//得到绝对角度差
absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());
|
说明:
e.getBearingRadians(),如图中的∠FBC所示
是敌机(Enemy)与自己车头方向(你使用setAhead(正值)前进的方向即为车头方向,如BC箭头所示)所成的角,因为是以BC为Y轴的bearing角,所以这个角在这个例子中是个负值。
getHeadingRadians(),如图中∠ABC所示
是以自己的车头方向与屏幕垂直正上方为Y轴所成的heaing角。
absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());
所以absBearing角即为∠FBA,即自己与敌机的连线,与Y轴所成的bearing角,取值范围为[-180,180)。
//根据absBearing角算出Radar要调整的角度,进过sin运算,这个已经是个修正后的角度了radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());
|
∠FBE=absBearing - getRadarHeadingRadians(),在这里计算出来为负值。即雷达需要转动的角度。
最后通过Math.sin(absBearing - getRadarHeadingRadians())进行角度修正得到最终值radarTurnAngle。这个修正很关键,原理可以参照sin曲线图
因为setTurnRadarRightRadians(radarTurnAngle)是向右旋转,所以若radarTurnAngle为负则雷达向左旋转。
总结:
有以上分析,我们不难得出雷达锁定目标所要转动的角度,由absBearing和e.getRadarHeading()(雷达的heading角)来决定.
radarTurnAngle=Math.sin(absBearing-getRadarHeadingRadians());
|
所以类似的,我们如果想让炮管、车身对准敌机,那么我们就就只要将e.getRadarHeading替换成e.getGunHeading()或e.getHeading()即可。
代码如下:
gunTurnAngle=Math.sin(absBearing-getGunHeadingRadians());
|
bodyTurnAngle=Math.sin(absBearing-getHeadingRadians());
|
应用实例:
所以我们可以写成这这样的一个机器人,你可以用它来对付Walls机器人
对,正如它的名字一样,它很疯!
import robocode.AdvancedRobot;
import robocode.ScannedRobotEvent;
/**
* CrazyDog
* @author lhx
*
*/
public class CrazyDog extends AdvancedRobot {
public void run(){
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
while(true){
turnRadarRightRadians(5);
}
}
@Override
public void onScannedRobot(ScannedRobotEvent e) {
//注意 这里的计算都以弧度为单位
double absBearing=0d;
//雷达转动角度
double radarTurnAngle=0d;
double gunTurnAngle=0d;
double bodyTurnAngle=0d;
//得到绝对角度差
absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());
//根据absBearing角算出Radar要调整的角度
radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());
gunTurnAngle=Math.sin(absBearing - getGunHeadingRadians());
bodyTurnAngle=Math.sin(absBearing - getHeadingRadians());
//转动雷达,注意是向右
setTurnRadarRightRadians(radarTurnAngle);
//转动炮管
setTurnGunRightRadians(gunTurnAngle);
//转动身体
setTurnRightRadians(bodyTurnAngle);
//前进
setAhead(e.getDistance());
if(getGunHeat()<0.1)setFire(2);
}
}
|
分享到:
相关推荐
很经典的robocode 学习笔记 助你学习robocode一日千里
robocode坦克机器人编程雷达锁定原代码,即时可用
基于Jess和机器学习的Robocode策略研究与实现
Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与...
Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其 他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达...
Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与...
Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与...
robocode是一款JAVA变程学习的游戏!
2002 robocode Rumble中级组冠军代码,可以直接import
关于用游戏来学习Java技术(Robocode攻略)
好玩的Java游戏:Robocode
robocode安装包,边打游戏边学习Java
Robocode不是一个完整游戏,它是个半成品,一个专为程序员们准备的游戏。它使得你不用不面对一些无聊琐碎但又不得不做的工作,编写界面、处理图像、处理音频,。而是用一种更简单的办法,让我们享受游戏开发的乐趣。...
robot of robocode, 1990, version 0.0.1
由于网络上很多都是对java版本的有详细的介绍,但是C++版的却很少,下面就如何使用C++版本的robocode问题作进一步的说明。
一段robocode经典代码,教你如何编写robocode
JAVA-robocode
robocode.dotnet插件 支持C#,VB,C++
IBM Robocode 人工智能机器人讲义