有可能在閃躲炮彈和執(zhí)行精確攻擊的演練中學(xué)會(huì)繼承、多態(tài)性、事件處理以及內(nèi)部類這些內(nèi)容嗎?Robocode 這個(gè)游戲即將為全世界的 Java 開發(fā)者實(shí)現(xiàn)這個(gè)愿望,它把游戲風(fēng)潮變成了教學(xué)工具,人們對(duì)它的上癮程度令人吃驚。請(qǐng)跟隨 Sing Li 一起拆解 Robocode,同時(shí)著手建造屬于自己的、定制的、小而精悍的戰(zhàn)斗機(jī)器。
Robocode 是一個(gè)很容易使用的機(jī)器人戰(zhàn)斗仿真器,可以在所有支持 Java 2 的平臺(tái)上運(yùn)行。您創(chuàng)建一個(gè)機(jī)器人,把它放到戰(zhàn)場(chǎng)上,然后讓它同其他開發(fā)者們創(chuàng)建的機(jī)器人對(duì)手拼死戰(zhàn)斗到底。Robocode 里有一些預(yù)先做好的機(jī)器人對(duì)手讓你入門,但一旦您不再需要它們,就可以把您自己創(chuàng)建的機(jī)器人加入到正在世界范圍內(nèi)形成的某個(gè)聯(lián)盟里去和世界最強(qiáng)手對(duì)陣。
每個(gè) Robocode 參加者都要利用 Java 語(yǔ)言元素創(chuàng)建他或她的機(jī)器人,這樣就使從初學(xué)者到高級(jí)黑客的廣大開發(fā)者都可以參與這一娛樂活動(dòng)。初級(jí)的 Java 的開發(fā)者們可以學(xué)習(xí)一些基礎(chǔ)知識(shí):調(diào)用 API 代碼、閱讀 Javadoc、繼承、內(nèi)部類、事件處理等等。高級(jí)開發(fā)者們可以在構(gòu)建“最優(yōu)品種”的軟件機(jī)器人全球競(jìng)賽中提高他們的編程技巧。在本文中,我們將介紹 Robocode,并指導(dǎo)您從構(gòu)建您平生第一個(gè) Robocode 機(jī)器人開始征服世界。我們還將看一下迷人的“后臺(tái)”機(jī)制,正是它使得 Robocode 起作用。
下載并安裝 Robocode
Robocode 是 Mathew Nelson 的智慧之作,他是 IBM Internet 部門 Advanced Technology 的軟件工程師。請(qǐng)首先訪問(wèn) IBM alphaWorks
Robocode
頁(yè)面。在這個(gè)頁(yè)面上,您可以找到 Robocode 系統(tǒng)最新的可執(zhí)行文件。這個(gè)分發(fā)包是一個(gè)自包含的安裝文件,在下載該分發(fā)包之后,您就可以使用下面的命令行在您的系統(tǒng)上安裝這個(gè)軟件包(當(dāng)然,我們假定您的機(jī)器上已經(jīng)預(yù)安裝了 Java VM(JDK 1.3.x)):
java -jar robocode-setup.jar
?在安裝過(guò)程中,Robocode 將問(wèn)您是否要使用這個(gè)外部的 Java VM 來(lái)編譯機(jī)器人。您也可以選擇使用作為 Robocode 分發(fā)包一部分而提供的 Jikes 編譯器。
安裝完成后,您可以通過(guò) shell 腳本(robocode.sh)、批處理文件(robocode.bat)或桌面上的圖標(biāo)來(lái)啟動(dòng) Robocode 系統(tǒng)。此時(shí),戰(zhàn)場(chǎng)將會(huì)出現(xiàn)。在此,您可以通過(guò)菜單調(diào)用 Robot Editor 和 compiler。
Robocode 系統(tǒng)組件
當(dāng)您激活 Robocode 時(shí),將看到兩個(gè)相關(guān)的 GUI 窗口,這兩個(gè)窗口構(gòu)成了 Robocode 的 IDE:
-
戰(zhàn)場(chǎng)
-
Robot Editor
圖 1 展示了處于工作狀態(tài)的戰(zhàn)場(chǎng)和 Robot Editor。
圖 1. Robocode IDE
戰(zhàn)場(chǎng)是機(jī)器人之間進(jìn)行戰(zhàn)斗直至分出勝負(fù)的場(chǎng)地。主要的仿真引擎被置于其中,并且允許您在這里創(chuàng)建戰(zhàn)斗、保存戰(zhàn)斗以及打開新建的或現(xiàn)有的戰(zhàn)斗。通過(guò)界面區(qū)域內(nèi)的控件,您可以暫停或繼續(xù)戰(zhàn)斗、終止戰(zhàn)斗、消滅任何機(jī)器人個(gè)體或獲取任何機(jī)器人的統(tǒng)計(jì)數(shù)據(jù)。此外,您可以在此屏幕上激活 Robot Editor。
Robot Editor 是一個(gè)定制的文本編輯器,它可以用于編輯生成機(jī)器人的 Java 源文件。在它的菜單里集成了 Java 編譯器(用于編譯機(jī)器人代碼)以及定制的 Robot 打包器。由 Robot Editor 創(chuàng)建并成功編譯的所有機(jī)器人都會(huì)處于戰(zhàn)場(chǎng)上一個(gè)部署就緒的位置。
Robocode 里的每個(gè)機(jī)器人都由一個(gè)或多個(gè) Java 類構(gòu)成。這些類可以被壓縮成一個(gè) JAR 包。為此,Robocode 的最新版本提供了一個(gè)可以在戰(zhàn)場(chǎng) GUI 窗口中激活的“Robot Packager”。
對(duì) Robocode 機(jī)器人的詳細(xì)分析
在寫這篇文章時(shí),Robocode 機(jī)器人是一個(gè)圖形化的坦克。圖 2 是一個(gè)典型的 Robocode 機(jī)器人的圖解。
圖 2. 對(duì) Robocode 機(jī)器人的詳細(xì)分析
請(qǐng)注意,機(jī)器人有一門可以旋轉(zhuǎn)的炮,炮上面的雷達(dá)也是可以旋轉(zhuǎn)的。機(jī)器人坦克車(Vehicle)、炮(Gun)以及雷達(dá)(Radar)都可以單獨(dú)旋轉(zhuǎn),也就是說(shuō),在任何時(shí)刻,機(jī)器人坦克車、炮以及雷達(dá)都可以轉(zhuǎn)向不同的方向。缺省情況下,這些方向是一致的,都指向坦克車運(yùn)動(dòng)的方向。
Robot 命令
Robocode 機(jī)器人的命令集都收錄在 Robocode API Javadoc 中。您將會(huì)發(fā)現(xiàn)這些命令都是 robocode.Robot
類的公共方法。在這一部分,我們將分類討論每個(gè)可用的命令。
移動(dòng)機(jī)器人、炮和雷達(dá)
讓我們從移動(dòng)機(jī)器人及其裝備的基本命令開始:
-
turnRight(double degree)
和 turnLeft(double degree)
使機(jī)器人轉(zhuǎn)過(guò)一個(gè)指定的角度。
-
ahead(double distance)
和 back(double distance)
使機(jī)器人移動(dòng)指定的像素點(diǎn)距離;這兩個(gè)方法在機(jī)器人碰到墻或另外一個(gè)機(jī)器人時(shí)即告完成。
-
turnGunRight(double degree)
和 turnGunLeft(double degree)
使炮可以獨(dú)立于坦克車的方向轉(zhuǎn)動(dòng)。
-
turnRadarRight(double degree)
和 turnRadarLeft(double degree)
使炮上面的雷達(dá)轉(zhuǎn)動(dòng),轉(zhuǎn)動(dòng)的方向也獨(dú)立于炮的方向(以及坦克車的方向)。
這些命令都是在執(zhí)行完畢后才把控制權(quán)交還給程序。此外,轉(zhuǎn)動(dòng)坦克車的時(shí)候,除非通過(guò)調(diào)用下列方法分別指明炮(和雷達(dá))的方向,否則炮(和雷達(dá))的指向也將移動(dòng)。
-
setAdjustGunForRobotTurn(boolean flag)
:如果 flag 被設(shè)置成 true,那么坦克車轉(zhuǎn)動(dòng)時(shí),炮保持原來(lái)的方向。
-
setAdjustRadarForRobotTurn(boolean flag)
:如果 flag 被設(shè)置成 true,那么坦克車(和炮)轉(zhuǎn)動(dòng)時(shí),雷達(dá)會(huì)保持原來(lái)的方向。
-
setAdjustRadarForGunTurn(boolean flag)
:如果 flag 被設(shè)置成 true,那么炮轉(zhuǎn)動(dòng)時(shí),雷達(dá)會(huì)保持原來(lái)的方向。而且,它執(zhí)行的動(dòng)作如同調(diào)用了 setAdjustRadarForRobotTurn(true)
。
獲取關(guān)于機(jī)器人的信息
有許多方法可以得到關(guān)于機(jī)器人的信息。下面簡(jiǎn)單列舉了常用的方法調(diào)用:
-
getX()
和 getY()
可以捕捉到機(jī)器人當(dāng)前的坐標(biāo)。
-
getHeading()
、 getGunHeading()
和 getRadarHeading()
可以得出坦克車、炮或雷達(dá)當(dāng)前的方向,該方向是以角度表示的。
-
getBattleFieldWidth()
和 getBattleFieldHeight()
可以得到當(dāng)前這一回合的戰(zhàn)場(chǎng)尺寸。
射擊命令
一旦您掌握了移動(dòng)機(jī)器人以及相關(guān)的武器裝備的方法,您就該考慮射擊和控制損害的任務(wù)了。每個(gè)機(jī)器人在開始時(shí)都有一個(gè)缺省的“能量級(jí)別”,當(dāng)它的能量級(jí)別減小到零的時(shí)候,我們就認(rèn)為這個(gè)機(jī)器人已經(jīng)被消滅了。射擊的時(shí)候,機(jī)器人最多可以用掉三個(gè)能量單位。提供給炮彈的能量越多,對(duì)目標(biāo)機(jī)器人所造成的損害也就越大。 fire(double power)
和 fireBullet(double power)
用來(lái)發(fā)射指定能量(火力)的炮彈。調(diào)用的 fireBullet()
版本返回 robocode.Bullet
對(duì)象的一個(gè)引用,該引用可以用于高級(jí)機(jī)器人。
事件
每當(dāng)機(jī)器人在移動(dòng)或轉(zhuǎn)動(dòng)時(shí),雷達(dá)一直處于激活狀態(tài),如果雷達(dá)檢測(cè)到有機(jī)器人在它的范圍內(nèi),就會(huì)觸發(fā)一個(gè)事件。作為機(jī)器人創(chuàng)建者,您有權(quán)選擇處理可能在戰(zhàn)斗中發(fā)生的各類事件。基本的 Robot
類中包括了所有這些事件的缺省處理程序。但是,您可以覆蓋其中任何一個(gè)“什么也不做的”缺省處理程序,然后實(shí)現(xiàn)您自己的定制行為。下面是一些較為常用的事件:
-
ScannedRobotEvent
。通過(guò)覆蓋 onScannedRobot()
方法來(lái)處理 ScannedRobotEvent
;當(dāng)雷達(dá)檢測(cè)到機(jī)器人時(shí),就調(diào)用該方法。
-
HitByBulletEvent
。通過(guò)覆蓋 onHitByBullet()
方法來(lái)處理 HitByBulletEvent
;當(dāng)機(jī)器人被炮彈擊中時(shí),就調(diào)用該方法。
-
HitRobotEvent
。通過(guò)覆蓋 onHitRobot()
方法來(lái)處理 HitRobotEvent
;當(dāng)您的機(jī)器人擊中另外一個(gè)機(jī)器人時(shí),就調(diào)用該方法。
-
HitWallEvent
。通過(guò)覆蓋 onHitWall()
方法來(lái)處理 HitWallEvent
;當(dāng)您的機(jī)器人撞到墻時(shí),就調(diào)用該方法。
我們只需要知道這些就可以創(chuàng)建一些相當(dāng)復(fù)雜的機(jī)器人了。您可以通過(guò)戰(zhàn)場(chǎng)的幫助菜單或 Robot Editor 的幫助菜單訪問(wèn) Javadoc 中其余的 Robocode API。
現(xiàn)在,我們?cè)摪褜W(xué)到的知識(shí)付諸實(shí)踐了。
創(chuàng)建機(jī)器人
要?jiǎng)?chuàng)建一個(gè)新的機(jī)器人,請(qǐng)啟動(dòng) Robot Editor 并選擇 File-> New-> Robot。系統(tǒng)將會(huì)提示您輸入機(jī)器人的名稱,這個(gè)名稱將成為 Java 類名。請(qǐng)您在提示符處輸入 DWStraight。接下來(lái),系統(tǒng)還會(huì)提示您輸入一個(gè)獨(dú)一無(wú)二的包前綴,它將用作存放機(jī)器人(還可能有相關(guān)的 Java 文件)的包的名稱。請(qǐng)?jiān)谠撎崾痉庉斎?dw。
Robot Editor 就會(huì)顯示您要控制這個(gè)機(jī)器人需要編寫的 Java 代碼。清單 1 是您將會(huì)看到的代碼的一個(gè)示例:
清單 1. Robocode 生成的 Robot 代碼
package dw;
import robocode.*;
/**
* DWStraight - a robot by (developerWorks)
*/
public class DWStraight extends Robot
{
... // <<Area 1>>
/**
* run: DWStraight's default behavior
*/
public void run() {
... // <<Area 2>>
while(true) {
... // <<Area 3>>
}
}
... // <<Area 4>>
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}
}
|
突出顯示的區(qū)域就是我們添加控制機(jī)器人的代碼的地方:
Area 1
我們可以在這片空白里聲明類作用域變量并設(shè)置這些變量的值。這些變量可以在機(jī)器人的 run()
方法內(nèi)以及其他一些您可能創(chuàng)建的助手方法內(nèi)使用。
Area 2
戰(zhàn)斗管理器調(diào)用 run()
方法激活機(jī)器人。典型情況下,run() 方法包括兩個(gè)區(qū)域(即在清單 1 中指出的 Area 2 和 Area 3),您可以在這兩塊空白里添加代碼。您在 Area 2 中加入的代碼每個(gè)機(jī)器人實(shí)例只運(yùn)行一次。這部分代碼通常用于使機(jī)器人先處于一種預(yù)設(shè)狀態(tài)后再開始執(zhí)行重復(fù)行為。
Area 3
這是典型的 run()
方法實(shí)現(xiàn)的第二部分。在此,我們將在無(wú)限 while
循環(huán)內(nèi)對(duì)機(jī)器人可能執(zhí)行的重復(fù)行為進(jìn)行編程。
Area 4
您可以在這一區(qū)域內(nèi)添加機(jī)器人在 run()
邏輯內(nèi)使用的助手方法。您也可以在此添加您想要覆蓋的任何事件處理程序。例如,清單 1 里的代碼處理 ScannedRobot
事件,每當(dāng)雷達(dá)檢測(cè)到機(jī)器人的時(shí)候,只是直接向其發(fā)射炮彈。
我們對(duì)第一個(gè)機(jī)器人(DWStraight)的代碼的更新如清單 2 中紅色標(biāo)記所示。
清單 2. DWStraight 機(jī)器人代碼的增加部分
package dw;
import robocode.*;
public class DWStraight extends Robot
{
public void run() {
turnLeft(getHeading());
while(true) {
ahead(1000);
turnRight(90);
}
}
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(180);
}
}
|
下面我們逐區(qū)地描述這個(gè)第一個(gè)機(jī)器人將做些什么:
Area 1我們沒有在這個(gè)機(jī)器人的程序中指定任何類作用域變量。
Area 2
為了使機(jī)器人處于已知的狀態(tài),我們通過(guò) turnLeft(getHeading())
使它轉(zhuǎn)到 0 度的方向。
Area 3
在這個(gè)重復(fù)性的部分,我們使用語(yǔ)句 ahead(1000)
讓機(jī)器人盡其所能向前移動(dòng)到最遠(yuǎn)的地方。當(dāng)機(jī)器人撞到墻或其他機(jī)器人時(shí),就會(huì)停下來(lái)。接著,我們通過(guò) turnRight(90)
使它向右轉(zhuǎn)。在重復(fù)執(zhí)行這一行為時(shí),機(jī)器人基本上是在沿著墻按順時(shí)針方向移動(dòng)。
Area 4
在此,除處理自動(dòng)生成的 ScannedRobot
事件并向被發(fā)現(xiàn)的機(jī)器人直接射擊之外,我們還會(huì)檢測(cè) HitByBullet
事件,并且讓機(jī)器人在被擊中的時(shí)候轉(zhuǎn)過(guò) 180 度(沿順時(shí)針方向或逆時(shí)針方向)。
編譯以及測(cè)試機(jī)器人
在 Robot Editor 菜單上選擇 Compiler-> Compile編譯您的機(jī)器人代碼。現(xiàn)在我們可以嘗試第一回合的戰(zhàn)斗了。切換回戰(zhàn)場(chǎng)并選擇菜單上的 Battle-> New,將會(huì)出現(xiàn)一個(gè)類似于圖 3 中所示的對(duì)話框。
圖 3. New Battle 對(duì)話框
請(qǐng)先將我們的機(jī)器人 dw.DWStraight 添加到戰(zhàn)斗中,然后再添加一個(gè)對(duì)手機(jī)器人,比如 sample.SittingDuck。單擊 Finish,戰(zhàn)斗就開始了。不可否認(rèn),同 SittingDuck 戰(zhàn)斗并不怎么有趣,但是您可以目睹這個(gè)叫做 DWStraight 的機(jī)器人在缺省情況下的行為。試試 sample 文件夾里的其他機(jī)器人,看看 DWStraight 同這些機(jī)器人的戰(zhàn)斗情況如何。
當(dāng)您準(zhǔn)備開始研究另外一個(gè)機(jī)器人的代碼時(shí),請(qǐng)先看看隨
參考資料
中的代碼分發(fā)包一起提供的 dw.DWRotater 這個(gè)機(jī)器人的代碼。在缺省情況下,這個(gè)機(jī)器人將會(huì):
-
移動(dòng)到戰(zhàn)場(chǎng)中心
-
一直轉(zhuǎn)動(dòng)它的炮,直到檢測(cè)到機(jī)器人
-
每次嘗試以不同的角度在離被檢測(cè)到的機(jī)器人前方不遠(yuǎn)的地方射擊
-
每當(dāng)它被另外一個(gè)機(jī)器人擊中時(shí),它都會(huì)迅速的來(lái)回移動(dòng)
這段代碼簡(jiǎn)單易懂,所以我們?cè)谶@里就不做分析了,但是我鼓勵(lì)您試驗(yàn)一下。Robocode 中的 sample 包還提供了許多其他機(jī)器人的代碼。
附加的機(jī)器人支持類
隨著您設(shè)計(jì)機(jī)器人的水平的提高,機(jī)器人的代碼主體將充分增長(zhǎng)。對(duì)這些代碼的一種模塊化處理方法是把代碼分解成獨(dú)立的 Java 類,然后通過(guò)打包器把這些 Java 類打包成一個(gè)單獨(dú)的包(JAR 文件),并將它包括在您的機(jī)器人分發(fā)包內(nèi)。Robocode 將自動(dòng)在它的 robots 目錄下的包里找到 robot 類。
其他 Robot 子類
任何人都可以創(chuàng)建 Robot
子類并添加用于構(gòu)建機(jī)器人的新功能。Robocode 提供了一個(gè)叫做 AdvancedRobot
的 Robot
子類,它允許異步 API 調(diào)用。雖然對(duì) AdvancedRobot
類的描述超出了本文的范圍,但我鼓勵(lì)您在掌握了基本的 Robot
類的操作后,試驗(yàn)一下這個(gè)高級(jí)類。
|
設(shè)計(jì) Robocode 的目的
我碰見了 Robocode 的創(chuàng)建者 Mathew Nelson,向他請(qǐng)教創(chuàng)建 Robocode 最初的設(shè)計(jì)目的。Mat 所說(shuō)的是:“編寫 Robocode 的一部分目的是為了向世界證明:象‘Java 比較慢’以及‘Java 不可以用來(lái)寫游戲’之類的論斷不再正確。我認(rèn)為我證明了這一點(diǎn)。”
|
|
戰(zhàn)斗仿真器的體系結(jié)構(gòu)
通過(guò)“在后臺(tái)”對(duì) Robocode 進(jìn)行分析,我們發(fā)現(xiàn)復(fù)雜的仿真引擎既具高性能(為了以現(xiàn)實(shí)的速度生成戰(zhàn)斗)又具靈活性(使創(chuàng)建復(fù)雜的機(jī)器人邏輯不存在障礙)。特別感謝 Robocode 的創(chuàng)建者 Mathew Nelson 無(wú)私的提供了仿真引擎體系結(jié)構(gòu)的內(nèi)部信息。
利用 Java 平臺(tái)進(jìn)行設(shè)計(jì)
圖 4 中所示的仿真引擎利用的是大多數(shù)現(xiàn)代的 Java VM 都提供的非搶占式線程技術(shù),并結(jié)合使用了 JDK GUI 和 2D 圖形庫(kù)提供的生成功能。
圖 4. Robocode 仿真引擎體系結(jié)構(gòu)
請(qǐng)注意,所仿真的每個(gè)機(jī)器人都在它自己的 Java 線程上,它可以在任何可適用的地方利用 VM 本地線程映射機(jī)制。戰(zhàn)斗管理器線程是系統(tǒng)的控制器:它安排仿真并驅(qū)動(dòng)圖形化的生成子系統(tǒng)。圖形化的生成子系統(tǒng)本身是基于 Java 2D 和 AWT 的。
松散的線程耦合
為了減少共享資源可能帶來(lái)的問(wèn)題(以及有可能隨之出現(xiàn)的死鎖或阻塞仿真引擎),戰(zhàn)斗管理器線程和機(jī)器人線程之間的耦合應(yīng)當(dāng)非常松散。為了實(shí)現(xiàn)這種松散耦合,每個(gè)機(jī)器人線程都將有屬于自己的事件隊(duì)列。獲取及處理這些事件都是在每個(gè)機(jī)器人自己的線程內(nèi)進(jìn)行。這種基于線程的隊(duì)列有效地消除了戰(zhàn)斗管理器線程和機(jī)器人線程之間(或機(jī)器人線程本身之間)可能存在的任何爭(zhēng)用。
Robocode 內(nèi)部結(jié)構(gòu)
您可以把 Robocode 仿真器引擎看作是一個(gè)仿真器程序,該程序在運(yùn)行時(shí)會(huì)使用一些插件(定制機(jī)器人);這些插件可以利用已有的 API( robocode.Robot
類的方法)。實(shí)際上,每個(gè)機(jī)器人都是一個(gè)獨(dú)立的 Java 線程,同時(shí) run()
方法內(nèi)包含了每個(gè)線程上將要執(zhí)行的邏輯。
在任何時(shí)候,機(jī)器人線程都可以調(diào)用由它的父類 robocoode.Robot
類所提供的 API。典型情況下,這將通過(guò)調(diào)用 Object.wait()
阻塞機(jī)器人線程。
戰(zhàn)斗管理器線程
戰(zhàn)斗管理器線程管理機(jī)器人、炮彈及它們?cè)趹?zhàn)場(chǎng)上的生成。仿真“時(shí)鐘”是根據(jù)戰(zhàn)場(chǎng)上生成的幀的數(shù)目來(lái)標(biāo)記的。用戶可以調(diào)整真實(shí)的幀的速度。
在一個(gè)典型的回合中,戰(zhàn)斗管理器線程喚醒每個(gè)機(jī)器人線程,然后等待機(jī)器人完成它的一輪戰(zhàn)斗(即,再次調(diào)用一個(gè)阻塞 API)。等待的間隔時(shí)間通常是幾十毫秒,即使是最復(fù)雜的機(jī)器人,使用現(xiàn)今典型的系統(tǒng)速度進(jìn)行策略安排和計(jì)算,也只要 1 到 2 毫秒的時(shí)間。
以下是戰(zhàn)斗管理器線程執(zhí)行的邏輯的偽代碼:
清單 3. 戰(zhàn)斗管理器的邏輯的偽代碼
while (round is not over) do
call the rendering subsystem to draw robots, bullets, explosions
for each robot do
wake up the robot
wait for it to make a blocking call, up to a max time interval
end for
clear all robot event queue
move bullets, and generate event into robots' event queue if applicable
move robots, and generate event into robots' event queue if applicable
do battle housekeeping and generate event into robots' event queue
if applicable
delay for frame rate if necessary
end do
|
請(qǐng)注意,在 for 循環(huán)內(nèi)部,戰(zhàn)斗管理器線程的等待時(shí)間不會(huì)超過(guò)最大的時(shí)間間隔。如果機(jī)器人線程沒有及時(shí)調(diào)用阻塞 API(典型情況下是由于一些應(yīng)用程序邏輯錯(cuò)誤或無(wú)限循環(huán)),那么,它將繼續(xù)進(jìn)行戰(zhàn)斗。生成一個(gè) SkippedTurnEvent
并將其加入機(jī)器人事件隊(duì)列中,用來(lái)通知高級(jí)機(jī)器人。
可替換的生成子系統(tǒng)
AWT 和 Java 2D 線程就是當(dāng)前實(shí)現(xiàn)中的生成子系統(tǒng),它從戰(zhàn)斗管理器中獲取命令并生成戰(zhàn)場(chǎng)。它同系統(tǒng)的其余部分是完全分離的。我們可以預(yù)見到,在這個(gè)生成子系統(tǒng)將來(lái)的修訂版中,它可以被替換掉(比如,用 3-D 生成器)。在當(dāng)前的實(shí)現(xiàn)中,只要 Robocode 應(yīng)用程序被最小化,生成就禁用了,這可以以更快的速度進(jìn)行仿真。
Robocode 的未來(lái)
通過(guò) alphaWorks Robocode 站點(diǎn)上的一個(gè)討論組(請(qǐng)參閱
參考資料
),Mathew Nelson 可以同 Robocode 用戶社區(qū)保持緊密的反饋聯(lián)系。許多反饋都并入了真實(shí)的代碼中。Mathew 已計(jì)劃即將要進(jìn)行的一些改進(jìn)有:
-
通過(guò)不同的物體和障礙來(lái)定制戰(zhàn)場(chǎng)地圖
-
基于團(tuán)隊(duì)的戰(zhàn)斗
-
對(duì)聯(lián)賽或聯(lián)盟的集成支持
-
用戶可選擇坦克車體/炮/雷達(dá)/武器的樣式
擋不住的 Robocode 風(fēng)潮
對(duì)于一個(gè)從 2001 年 7 月 12 日出現(xiàn)在公眾面前的項(xiàng)目,Robocode 的出名簡(jiǎn)直讓人吃驚。盡管最新的可用版本還不到 1.0(在寫這篇文章時(shí)是版本 0.98.2),但它已經(jīng)是全世界的大學(xué)校園以及公司的 PC 機(jī)上頗受歡迎的娛樂活動(dòng)了。Robocode 聯(lián)盟(或 roboleagues)正如雨后春筍般出現(xiàn),在這些聯(lián)盟里,人們通過(guò)因特網(wǎng)讓自己定制的作品相互較量。大學(xué)教授們一直在挖掘 Robocode 的教育特性,并且已經(jīng)把它納入了大學(xué)里的計(jì)算機(jī)科學(xué)課程。在因特網(wǎng)上,Robocode 用戶組、討論列表、FAQ、教程和 Webring 隨處可見。
顯然,Robocode 已經(jīng)填補(bǔ)了大眾化的寓教于樂領(lǐng)域的空白 ― 它為學(xué)生們和熬夜的工程師們提供簡(jiǎn)便、有趣、非脅迫卻富競(jìng)爭(zhēng)力的方式,釋放他們的創(chuàng)造力,而且有可能實(shí)現(xiàn)他們征服世界的夢(mèng)想。