許多研究 Robocode 玩家被方向及座標弄糊塗。跟著 Skyala.Li 一起揭開奧妙。
許多研究 Robocode 玩家被方向及座標弄糊塗。跟著 Skyala.Li 一起揭開奧妙。
先看一段英文翻譯及說明:
heading:機器人方向與螢幕正上方角度差,方向在 0 到 360 之間。bearing:機器人某部件 (如雷達) 發現目標與方向角度差,順時針為正,角度在 -180 到 180 之間。看這段文字可能仍不清楚:整個螢幕哪個是 0 度角?座標原點哪?順時針逆時針如何區分?
說明前先清楚 Robocode 幾個重要概念:
heading 角度為參照角度差,不再以整個靜態螢幕為參照。叫相對因機器人 heading 隨移動不停改變,heading 只是相對物體。下圖清楚說明座標系統及絕對方向:

似乎明白些,但腦中仍不清。做個測試。寫兩機器人:一什麼不動坐原點掃掃 Gun 列印 Heading 叫 Geny;另也不移動,只是 Gun 緩慢轉動同時列印 Heading、Bearing、Radar Heading 叫 GenyTrack1。(註:數據為 double 類型,未轉換近似認整數,具體轉換方法和更好測試方法後文給出)。
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); }
}
}
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 機器人解剖圖"。
下面是剪切 Geny 和 GenyTrack1 不同位置得到數據圖。

圖一解:觀察 GenyTrack1 數據 heading:64.421114… ~ 64,說明它正好坐落螢幕絕對方向系 64 度地方。即 GenyTrack1 當前 Heading 方向為 64 度。

圖二解:觀察 GenyTrack1 數據 heading:161.79…,說明正前方正對螢幕絕對方向系 161 度地方。即 GenyTrack1 當前 Heading 方向為 161 度。而 Geny 正前方正對 35 度地方。
大家對照方向系一看想一切明白。有點成就感,不急,後面還有。
Bearing,該死的 Bearing,大家頭痛就是它。以機器人雷達 (Radar) 為例說明。源程式 (GenyTrack1) 用事件 onScannedRobot(ScannedRobotEvent e),所以用到 Radar Heading,其他如 Bullet、Gun 方法類似,有興趣可自己測試。
先把數據近似提出如下表:
機器人 Heading RadarHeading Bearing
Geny 35 . .
GenyTrack1 161 275 114
機器人和 Radar Heading 大家對照圖上方向系及絕對方向體系說明應明白,只是注意機器人哪前哪後:詳見 "Robocode 機器人解剖圖"。(Geny Heading 此處未用上,只給參考)。
看我們 GenyTrack1 前面正對 161 角,雷達在螢幕 276 度地方發現 Geny。所以此處 Geny 和 GenyTrack1 相差角度 = |276-161| 度 (取絕對值,正負由轉動方向決定)。因 Geny 正位於 GenyTrack1 順時針方向上 (GenyTrack1 0,180 之間),相對角度 Bearing 就是順時針方向 (+114) 度。(圖上每次數據有小點差因列印數據及低級機器人完成所有代碼後才處理事件。非即時。即時處理涉及高級機器人 AdvanceRobot 特性)。

機器人 Heading RadarHeading Bearing
Geny 35 . .
GenyTrack1 57 238 -173
|238-57|,因 Geny 處於 GenyTrack1 後方 (-180,0)。逆時針方向所以為負。
順時針逆時針看另一機器人在您 Heading 角度 (0,180) 還是 (-180,0) 之間。
再提醒:Heading 是靜態角度,正上方總為 0。不管取 Heading 還是取方向。Bearing 是角度差值,由參照 Heading 和發現時 Heading 差值。
方向問題說到這,這是 Skyala.Li 理解,歡迎討論。此處未引用座標系詳細說明。請看 "Robocode 基本原理之座標系剖析"。