[英]Robocode: precision of onScannedRobot
我编写了一个相对简单的AdvancedRobot
,它可以转动雷达并记录所有敌人的速度。 最终,我注意到机器人在不应该错过的情况下错过了。 我从 Robocode/Graphical Debugging wiki 复制了代码并对其进行了测试。 这是代码(Wiki目前已关闭):
// The coordinates of the last scanned robot
int scannedX = Integer.MIN_VALUE;
int scannedY = Integer.MIN_VALUE;
// Called when we have scanned a robot
public void onScannedRobot(ScannedRobotEvent e) {
// Calculate the angle to the scanned robot
double angle = Math.toRadians((getHeading() + e.getBearing()) % 360);
// Calculate the coordinates of the robot
scannedX = (int)(getX() + Math.sin(angle) * e.getDistance());
scannedY = (int)(getY() + Math.cos(angle) * e.getDistance());
}
和事件处理程序:
// Paint a transparent square on top of the last scanned robot
public void onPaint(Graphics2D g) {
// Set the paint color to a red half transparent color
g.setColor(new Color(0xff, 0x00, 0x00, 0x80));
// Draw a line from our robot to the scanned robot
g.drawLine(scannedX, scannedY, (int)getX(), (int)getY());
// Draw a filled square on top of the scanned robot that covers it
g.fillRect(scannedX - 20, scannedY - 20, 40, 40);
}
“实心方块”绝对不在机器人的顶部。 下面显示了几个屏幕截图。 看起来精度取决于距离,但我不确定。 这是预期的,还是我做错了什么?
可能发生这种情况的一个原因是 onScannedRobot 事件的传递被延迟,直到更高优先级的事件完成处理。 特别是,如果更高优先级的事件处理程序执行一个命令来旋转身体,该命令将在 onScannedRobot 被调用之前执行,从而导致时间提前,机器人移动,并且你的机器人的航向被改变。
由于延迟事件传递会导致各种问题,我建议不要在事件处理程序中执行命令。 相反,事件处理程序应该简单地检查、思考并将信息存储在字段中,以便主循环做出反应。 这使主循环能够在采取行动之前查看所有可用信息,并智能地 select 考虑到收到的全部信息,哪个行动最合适。 例如,它可以查看前面的机器人撞击事件,结合雷达探测到的对手从后面接近,并确定侧向躲避比通常的后方躲避更有希望......
我想我知道问题是什么。 它似乎没有记录在案; 如果我错了,请发布链接。 ScannedRobotEvent
报告相对于机器人先前航向的方位,即最后一次StatusEvent
命中时的航向。 考虑到这一点,大大提高了我的机器人的准确性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.