要制造出一个成功的Robocode机器人,您必须能够击中对手,而不是对手击中您。 让您的机器人成为对手的目标是一门精美的艺术,但是如果您的对手无法瞄准您,该怎么办? 使用简单的技巧和一些猜测,这里列出的DodgeBot向您展示了如何躲避子弹。
在向您展示技巧之前,您必须了解一些Robocode基础知识。 首先,Robocode使用单个能量存储来进行进攻和防御。 这导致了有趣的游戏决策:您必须决定何时使用自己的能量向对手射击,以及何时保留该能量以承受潜在的伤害。
其次,您的机器人对周围环境的了解非常有限。 它可以查看其他机器人的距离,方位,航向,速度和能量水平。 不,它看不到子弹,但是也许从这些线索中,您可以猜测如何检测何时发射子弹。
DodgeBot静止不动,并不断跟踪对手的先前能量水平。 当它下降一定范围时,DodgeBot假定对手被射击并且向左或向右移动。 令人惊讶的是,这将使大多数机器人的瞄准方法感到困惑。 他们要么直接向目标射击,要么尝试根据您的速度和方向来投影您的位置。 由于您的机器人没有移动,因此两种算法都将对其立即触发。 然后,您的机器人会猜到这一点,向侧面跳一小步,让子弹继续前进。 图1显示了运行中的DodgeBot。
图1. DodgeBot与Tracker(Gotcha!)
清单1显示了DodgeBot代码。 每当雷达感应到敌人时,就会执行主要的代码块。 首先,DodgeBot将自己保持成直角,并向对手倾斜30度。 保持90度角可使机器人最大能力摆脱子弹干扰。 额外的30度倾斜会导致机器人有些攻击性,并且随着时间的推移会更接近目标。 接下来是关键的代码段:如果机器人感应到的能量下降介于0.1到3.0(点火功率范围)之间,则机器人将立即切换方向并向左或向右移动。 简单。 假设它在最后一次扫掠中看到机器人,则如果扫过同一区域,它将再次找到它,它将切换枪支和雷达扫掠的方向。 然后,机器人将开火。 因为我离开了枪支和雷达的连接,并且因为在面对对手的那一刻就会调用扫描仪,所以枪支会直接向对手开火。 最后,我记录下一次的对手能量。
清单1. DodgeBot代码
import robocode.*;
public class DodgeBot extends AdvancedRobot
double previousEnergy = 100;
int movementDirection = 1;
int gunDirection = 1;
public void run() {
setTurnGunRight(99999);
}
public void onScannedRobot(
ScannedRobotEvent e) {
// Stay at right angles to the opponent
setTurnRight(e.getBearing()+90-
30*movementDirection);
// If the bot has small energy drop,
// assume it fired
double changeInEnergy =
previousEnergy-e.getEnergy();
if (changeInEnergy>0 &&
changeInEnergy<=3) {
// Dodge!
movementDirection =
-movementDirection;
setAhead((e.getDistance()/4+25)movementDirection);
}
// When a bot is spotted,
// sweep the gun and radar
gunDirection = -gunDirection;
setTurnGunRight(99999*gunDirection);
// Fire directly at target
fire ( 2 ) ;
// Track the energy level
previousEnergy = e.getEnergy();
}
}
我使用过此技巧的机器人金刚狼使用一些附加的传感器信息来使传感更加准确。 当对手击中我的机器人时,对手会被充电。 当我的机器人撞击对手时,对手的能量水平将下降。 机器人可以感应到这两个事件,金刚狼会利用这些信息抵消相应的能量波动。
此技巧存在问题。 发射子弹后,机器人就会移动,因此最终可能会移回火线。 预计子弹到达时最好移动。
一个更大的问题是,即使您可以混淆常见的定位,实际上,从一侧到另一侧的逐步移动还是可以预见的。 使用此技巧的最佳方法也许是让信息指导您的动作,但不控制它们。
您可能会认为这个技巧很简单,以至于您自己都可以想到。 好。 这就是玩这种游戏的方式,这就是为什么它如此令人上瘾的原因。 Robocode就像是一场象棋游戏,其中每一个新动作都是一个新想法。
翻译自: https://www.ibm.com/developerworks/java/library/j-dodge/index.html