首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Robocode 基本原理之方向剖析(1)

Robocode 基本原理之方向剖析(1)

前言:很多研究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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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机器人解剖图
返回列表