快速业务通道

Robocode基本原理之坐标锁定 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
不可缺少的一部分知识。此处我们只 简单的介绍正弦函数及余弦函数的使用。

Sin public static double sin(double a) Returns the trigonometric sine of an angle. Parameters: a - an angle, in radians. Returns: the sine of the argument

Sin函数返回三角的正弦函数,参数a是一个以double类型以弧度表示的角度 值,返回类型为double.

cos public static double cos(double a) Returns the trigonometric cosine of an angle. Parameters: a - an angle, in radians. Returns: the cosine of the argument

Robocode基本原理之坐标锁定(5)

时间:2010-11-29 IBM 天翼.李Skyala.Li

Cos函数返回三角的余弦函数,参数a是一个以double类型的弧度表示的角值, 返回类型为double.

有人会问为什么不使用ScanndeRobot事件中的getRadarHeadingRadians()方 法直接得到弧度。哦,你来看看 Robocode中华联盟iiley的一段说明:

public void onScannedRobot(ScannedRobotEvent event) {   enemyX=Math.sin(Util.standardMathDirRadians (getRadarHeadingRadians()))*event.getDistance();   enemyY=Math.cos(Util.standardMathDirRadians (getRadarHeadingRadians()))*event.getDistance(); }

看起来好像正确的,但是你实践一下会发现他很不准确,为什么呢?原因在 于getRadarHeadingRadians()函数,当你调用此函数的时候实际上雷达已经不在 刚刚扫描到敌人的那个角度了,他已经转过了十几度甚至更多。雷达默认转动速 度是45度/robocode单位时间,实际上一般来说你用getRadarHeadingRadians() 得到的值总是45度的整数倍。(一些情况除外,比如说你用了turnRadarLeft (11)类似的语句以后)。

Robocode 也遵循数学应用中的基本法则用两种方法来表示方向的角度:角度 制和弧度制,本文的代码及以前文章中的代码我们一直用的是角度制。另外一种 方法就是利用 ScannedRobotEvent.getBearingRadians() +robot.getHeadingRadians()得到敌人以弧度表示的方向,这个方法在本文章中 没有说明了,有兴趣的朋友可以自己试试用Java.util 类库来实现. 也可参考文 档 "精确计算敌人的坐标"。大家也可比较两种方法各自特点,这将是个很有意 思的过程。

移动锁定

当然,即使是最简单的机器人也不会坐在那一动不动等着你来消灭。它会躲 避你的进攻以及扫描,当你向它原来坐标处开火,说不定它已经跑得老远了,当 然这一切都不是我们所希望看到的。我们的目的是要消灭它:不管他是移动或静 止的。下面我们就结合方向系统与坐标系统,来锁定我们移动的目标。创造一个 我们自己的高级扫描机器人。建议你在此处下载源代码( resource)并看看演示 效果再回到我们的文章中来。显示如图5:

图5

Robocode基本原理之坐标锁定 - 编程入门网

Robocode基本原理之坐标锁定(6)

时间:2010-11-29 IBM 天翼.李Skyala.Li

对比一下上面的数据,不管目标GenyMove在哪GenyRadar都能得到它精确的坐 标。是不是有一种成就感!是的,敌人已经完全在我们的掌握之中。即使它在移 动中也无法摆脱我们雷达的扫描控制。这里只是很简单举了一些例子,GenyMove 在每一个时间周期(有关时间周期的说明见的 Rock ''em, sock ''em Robocode: Round2)移动自己的位置并打印出移动后的坐标,而GenyRadar扫描系统不停的 扫描目标,并一直追踪,同时打印出扫描到的GenyMove方位。关键部分在我们的 ScannedRobotEvent事件如列表3

列表3:

 public void onScannedRobot( ScannedRobotEvent  e )    {      double heading = e.getBearing() +getHeading();      double distance = e.getDistance(); //求得距离      double ager

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号