跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

Robocode 基本原理之方向剖析

Skyala.Li现正从事.net类库的java版本的翻译工作。致力于中国软件业及Robocode的推广。并维护关Robocode 中华联盟网站的日常工作。有兴趣请与他联系: robocode@etang.com

简介: 很多研究Robocode的 玩家都被其中的方向及坐标弄糊涂了。下面就跟着Skyala.Li一起来揭开其中的奥妙。

发布日期: 2002 年 10 月 24 日
级别: 初级
访问情况 : 1397 次浏览
评论: 


前言:

很多研究Robocode的 玩家都被其中的方向及坐标弄糊涂了。下面就跟着Skyala.Li一起来揭开其中的奥妙。

首先我们来看看一段英文的翻译及说明:

heading - absolute angle in degrees with 0 facing up the screen, positive clockwise. 0 <= heading < 360.

bearing - relative angle to some object from your robot's heading, positive clockwise. -180 < bearing <= 180

heading:是机器人方向与屏幕正上方的角度差,方向在0到360之间.

bearing:是机器人的某个部件如雷达发现的目标与方向的角度差,顺时针为正角度在-180到180之间

看了这段文字大家可能还是不太明白,整个屏幕哪个是0度角,整个是坐标原点呢? 顺时针与逆时针的方向如何区分?


概念与平面图:

在开始说明之前大家先得清楚几个在Robocode中很重要的概念:

坐标系:Robocode整个坐标系都是战场屏幕以左下角为原点

绝对方向系:Robocode中不管机器人在哪个方向都是以静态战场屏幕为参照的绝对角度(也即大家说的Heading),正上方为0度角。也即不管是Robot,Gun,Radar向北为0,向东为90,向南为180,向西为270。

相对方向系:相对方向是Robot,Gun,Radar以机器人的动态heading角度为参照的角度差不再以整个静态屏幕为参照了,叫它相对因为机器人的heading是随着机器人移动而不停的在改变,heaing只是个相对物体。

下图很清楚的说明了坐标系统及绝对方向



哦似乎明白了一些,可头脑中还有一些不是很清楚。我们来做个测试。测试方法很简单,写两个机器人,一个什么一动不动坐在原点扫扫Gun并打印出自己的Heading我们叫它Geny;另一个也不移动,只是Gun进行缓慢的转动同时打印出自己的Heading,Bearing,和Radar的Heading,我们叫它GenyTrack1. (注:此处的数据是double类型,没有进行转化我们近似的认识它为整数,具体的转化方法和更好测试方法我们会在以后的文章中给出):

代码如下Geny.java

//Geny.java
package wind;
import robocode.*;
import java.io.*; 
public class Geny extends Robot
{
       public void run() {
              ahead(100);
              System.out.println("Heading  "+getHeading());
              while(true) {
                     turnGunRight(360);                     
              }     
}
}  

GenyTrack1.java

//GenyTrack1.java
package wind;
import robocode.*; 
public class GenyTrack1 extends Robot
{
       public void run () {
       while (true)
       {
              turnGunRight(5);
       }
       }
 
       public void onScannedRobot(ScannedRobotEvent e)
       {
              System.out.println("getBearing  "+e.getBearing());
              System.out.println("heading  "+getHeading());
              System.out.println("getRadarHeading()  "+getRadarHeading());
              turnGunRight(e.getBearing());
              fire(3);
       }      
}

要想了解机器人的各个部件及说明请看文章:Robocode机器人解剖图


绝对方向系Heading:

下面是剪切到的Geny和GenyTrack1在不同位置得到的数据图.


图一
图一

图一解:大家观察机器人GenyTrack1的数据heading:64.421114…~ 64,说明它正好坐落在屏幕绝对方向系64度的地方。也就是说GenyTrack1当前的Heading方向为64度。


图二
图二

图二解:大家观察机器人GenyTrack1的数据heading:161.79…,说明它正前方正好正对屏幕绝对方向系161度的地方。也就是说GenyTrack1当前的Heading方向为161度。而我们的Geny正前方正对35度的地方。

大家对照着方向系一看我想一切就会明白的。是不是有点成就感了,不急,后面还有。


相对方向系Bearing:

Bearing,Bearing该死的Bearing,我想大家头痛的就是它的。在此我们就以机器人的雷达(Radar)为例来说明,源程序(GenyTrack1)中我们用到的是事件:onScannedRobot(ScannedRobotEvent e) ,所以我们要用到的就是Radar的Heading,其它相关的如Bullet,Gun的方法类似,有兴趣的朋友可以自己测试一下。

我们先把数据近似提出来如下表:

机器人HeaingRadarHeadingBearing
Geny35..
GenyTrack1161275114

在此处机器人和Radar的Heading我想大家对照图上的方向系及上面的绝对方向体系说明应该明白了,只是要注意机器人哪是前哪是后:详见Robocode机器人解剖图.

(Geny的Heading在此处没有用上,只是给大家参考一下)你看我们的GenyTrack1前面正对着161角,雷达在屏幕276度角的地方发现了Geny机器人。所以此处的Geny和GenyTrakc1相差的角度=|276-161|度(取绝对值,正负由转动方向决定),由于此时的Geny机器人正位于GenyTrack1顺时针方向上(GenyTrack1的0,180之间),所以相对角度Bearing就是顺时针方向(+114)度,(图上每次数据有一小点差是由于打印的数据及低级机器人完成所有代码后才进行处理事件。不是即时的。要即时处理涉及到高级机器人AdvanceRobot的一些特性)。

下面得到相对角度是为负的图:原理同上。


图三
图三

机器人HeaingRadarHeadingBearing
Geny35..
GenyTrack157238-173

|238-57|,由于Geny处于GenyTrack1背后(-180,0)。为逆时针方向所以为负。


时针略说:

顺时针和逆时针是看另一机器人是在你的Heading角度的(0,180)还是(-180,0)之间。

再这次提醒:Heading是个静态角度,正上方总为0.不管是取Heading,还是取方向

Bearing是个角度差值,是由参照的Heading和发现时的Heading的差值。

好了,方向的问题就说到这,这是Skyala.Li的理解,欢迎大家来讨论。此处没有引用坐标系的详细说明。请看: Robocode 基本原理之坐标系剖析


参考资料

  • Mathew Nelson 是 Robocode 的创建者,他维护着 官方 Robocode 站点。这应当是所有关心 Robocode 的人的第一站。

  • RoboLeague是针对 Robocode 的联盟以及赛季管理者,由 Robocodeby Christian Schnell 负责。它确保所有可能的分组实际打好比赛、管理结果并生成 HTML 状态报告。

  • “Rock 'em, sock 'em Robocode”(developerWorks,2002 年 1 月)一起拆解 Robocode,同时着手建造属于自己的、定制的、小而精悍的战斗机器。

  • Sing Li 将在 “Rock 'em, sock 'em Robocode: Round 2”(developerWorks,2002 年 5 月)中着眼于高级机器人的构建和团队模式游戏。

  • 刚接触 Java 吗?请看看 “Java language essentials”(developerWorks,2000 年 11 月),这篇教程将教您一步步学习 Java 语言编程的基础。

  • 在 developerWorks 上的 Java 技术专区查找 Java 参考资料。

关于作者

Skyala.Li现正从事.net类库的java版本的翻译工作。致力于中国软件业及Robocode的推广。并维护关Robocode 中华联盟网站的日常工作。有兴趣请与他联系: robocode@etang.com

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=53035
ArticleTitle=Robocode 基本原理之方向剖析
publish-date=10242002
author1-email=robocode@etang.com
author1-email-cc=robocode@etang.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。