您的位置:首页 > 其它

Robocode 编写机器人 二

2013-04-25 17:37 435 查看
很多研究Robocode的玩家都被其中的方向及坐标弄糊涂了。整个屏幕哪个是0度角,整个是坐标原点呢?顺时针与逆时针的方向如何区分?
一段英文的翻译及说明:
* heading - absolute angle in degrees with 0
facing up the screen, positive clockwise. 0 <=
heading < 360.
* bearing - relative angle to some object from
your robots heading, positive clockwise. -180 <
bearing <= 180
* heading:是机器人方向与屏幕正上方的角度差,方向在0到360之间.
*
bearing:是机器人的某个部件如雷达发现的目标与方向的角度差,顺时针为正角度在-180到180之间
几个在Robocode中很重要的概念:
* 坐标系:Robocode整个坐标系都是战场屏幕以左下角为原点
*
绝对方向系:Robocode中不管机器人在哪个方向都是以静态战场屏幕为参照的绝对角度(也即大家说的Heading),正上方为0度角。也即不管是
Robot,Gun,Radar向北为0,向东为90,向南为180,向西为270。
*
相对方向系:相对方向是Robot,Gun,Radar以机器人的动态heading角度为参照的角度差不再以整个静态屏幕为参照了,叫它相对因为机器人的heading是随着机器人移动而不停的在改变,heaing只是个相对物体。
*
顺时针和逆时针是看另一机器人是在你的Heading角度的(0,180)还是(-180,0)之间。
再次提醒:Heading是个静态角度,正上方总为0.不管是取Heading,还是取方向。Bearing是个角度差值,是由参照的Heading和发现时的Heading的差值。方向的问题就说到这,欢迎大家讨论。
我看了Robocode的基础知识,自己写了个bot,放到BattleField上却是屡战屡败……伤心。
Bot对于周围环境的了解非常有限。它可以知道其它机器人的距离、方位、方向、速度和能量等级。但是,它看不到子弹。怎么才可以有效的躲避对方的子弹呢?

Bot虽然看不到子弹,但是对方的能量等级还是可以scan到了。对方只要发射子弹就会耗损能量,并且耗损的能量介于0和3之间。根据这些线索,如何发现其它机器人正向它开炮对于“笨笨”的Bot不就易如反掌了?

当Bot检测到对方发射子弹的信息时,向左或向右移动一小步,嘿嘿,子弹就打不到咯。并且大多数Bot的瞄准方法是要么直接向目标开炮,要么试着根据
Bot的速度和方向来推算位置。如果我的Bot不移动,两种算法都会正好冲着这个Bot的当前位置开炮。哈哈哈,这时我的Bot再移动,不就全部都打不到啦。(是不是颇有武侠小说里以静制动的高手味道?)
下面是部分代码和注释:
double previousEnergy = 100;
//初始状态对方能量为100
int movementDirection = 1; //移动方向
int gunDirection = 1; //炮管方向

public void onScannedRobot(ScannedRobotEvent
e) {
//调整自己和对方之间的角度
setTurnRight(e.getBearing()+90-30*movementDirection);
//如果对方的能量损耗一定值,进行躲避动作
double changeInEnergy =
previousEnergy - e.getEnergy();
if
(changeInEnergy>0 &&
changeInEnergy<=3) {
//躲避!
movementDirection
= -movementDirection; //和上次的躲避方向相反
setAhead((e.getDistance()/4+25)*movementDirection);
}
//将炮管指向对方当前位置
gunDirection = -gunDirection;
setTurnGunRight(99999*gunDirection);
//射击
fire(1);
//重新设置对方能量
previousEnergy = e.getEnergy();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: