快速业务通道

Robocode高手的秘诀 - 因数避墙法(factored wall avoidance) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

Robocode高手的秘诀 - 因数避墙法(factored wall avoidance)

时间:2010-11-29 IBM David McCoy

我们只要对在 Tracking your opponents'' movement中做的机器人加以补充 ,就能将因数避墙法添加到现有的或讨厌的移动算法中。这种方法将预想的方向 和根据机器人和墙之间距离远近确定的安全方向作为因数试图找到最可能的方向 。

添加做常见数学计算的辅助方法

我们先要给机器人添加常见数学算法使用的一些辅助方法。

calculateBearingToXYRadians() 方法使用 java.lang.Math 中的 atan2() 方法来计算从 sourceX,sourceY 到 targetX,targetY 的绝对方位,然后再把这 个值转化为相对于 sourceHeading 的相对方位。

我们还需要 normalizeAbsoluteAngleRadians() 方法和 normalizeRelativeAngleRadians() 方法。

清单 1. 数学辅助方法

private static final double DOUBLE_PI = (Math.PI *  2); private static final double HALF_PI = (Math.PI / 2); public double calculateBearingToXYRadians(double sourceX, double  sourceY,    double sourceHeading, double targetX, double targetY)  {      return normalizeRelativeAngleRadians(        Math.atan2((targetX - sourceX), (targetY -  sourceY)) -          sourceHeading);    } public double normalizeAbsoluteAngleRadians(double angle) {    if (angle < 0) {      return (DOUBLE_PI + (angle % DOUBLE_PI));    } else {      return (angle % DOUBLE_PI);    } } public static double normalizeRelativeAngleRadians(double angle)  {    double trimmedAngle = (angle % DOUBLE_PI);    if (trimmedAngle > Math.PI) {      return -(Math.PI - (trimmedAngle % Math.PI));    } else if (trimmedAngle < -Math.PI) {      return (Math.PI + (trimmedAngle % Math.PI));    } else {      return trimmedAngle;    } }

Robocode高手的秘诀 - 因数避墙法(factored wall avoidance)(2)

时间:2010-11-29 IBM David McCoy

使 AdvancedRobot 扩展到有倒行功能

接着,为了以相反方向导航,我们需要用一些辅助方法把 AdvancedRobot 类 的功能扩展到允许倒行操作:

getRelativeHeading() 方法将应付正确计算相对于机器人当前的方向的相对 方向产生的额外开销。

reverseDirection() 非常简单。它负责 direction 实例变量的开关和使机 器人掉头。请注意,由于减速需要时间,依据机器人的速度,在掉过头来之前最 多会沿原来的方向再走 4 格。

setAhead() 和 setBack() 方法将覆盖 AdvancedRobot 类中的同名方法。这 两个方法会设置机器人对于目前方向的相对速度,必要的时候,还会调整 direction 实例变量。我们这么做的目的是要确保相对操作都与机器人当前的移 动方向有关。

setTurnLeftRadiansOptimal() 和 setTurnRightRadiansOptimal() 方法使 机器人的方向转过的角度超过 (Math.PI / 2) 。您会希望这个方法和 adjustHeadingForWalls 方法(我们将在后面讨论)一起使用。

注:我没有使用 getter 和 setter 方法,而是直接存取 direction 实例变 量。尽管通常这并非良好的编程习惯,但为了加快数据存取,在我的机器人代码 中我一直都是直接存取的。

清单 2. 机器人辅助方法

public double getRelativeHeadingRadians() {    double relativeHeading = getHeadingRadians();    if (direction < 1) {      relativeHeading =          nor

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号