青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Merlin

Life was like a box of chocolates. You never know what you're gonna get.

   :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  34 隨筆 :: 0 文章 :: 40 評論 :: 0 Trackbacks
有可能在閃躲炮彈和執(zhí)行精確攻擊的演練中學(xué)會繼承、多態(tài)性、事件處理以及內(nèi)部類這些內(nèi)容嗎?Robocode 這個(gè)游戲即將為全世界的 Java 開發(fā)者實(shí)現(xiàn)這個(gè)愿望,它把游戲風(fēng)潮變成了教學(xué)工具,人們對它的上癮程度令人吃驚。請跟隨 Sing Li 一起拆解 Robocode,同時(shí)著手建造屬于自己的、定制的、小而精悍的戰(zhàn)斗機(jī)器。

Robocode 是一個(gè)很容易使用的機(jī)器人戰(zhàn)斗仿真器,可以在所有支持 Java 2 的平臺上運(yùn)行。您創(chuàng)建一個(gè)機(jī)器人,把它放到戰(zhàn)場上,然后讓它同其他開發(fā)者們創(chuàng)建的機(jī)器人對手拼死戰(zhàn)斗到底。Robocode 里有一些預(yù)先做好的機(jī)器人對手讓你入門,但一旦您不再需要它們,就可以把您自己創(chuàng)建的機(jī)器人加入到正在世界范圍內(nèi)形成的某個(gè)聯(lián)盟里去和世界最強(qiáng)手對陣。

每個(gè) Robocode 參加者都要利用 Java 語言元素創(chuàng)建他或她的機(jī)器人,這樣就使從初學(xué)者到高級黑客的廣大開發(fā)者都可以參與這一娛樂活動。初級的 Java 的開發(fā)者們可以學(xué)習(xí)一些基礎(chǔ)知識:調(diào)用 API 代碼、閱讀 Javadoc、繼承、內(nèi)部類、事件處理等等。高級開發(fā)者們可以在構(gòu)建“最優(yōu)品種”的軟件機(jī)器人全球競賽中提高他們的編程技巧。在本文中,我們將介紹 Robocode,并指導(dǎo)您從構(gòu)建您平生第一個(gè) Robocode 機(jī)器人開始征服世界。我們還將看一下迷人的“后臺”機(jī)制,正是它使得 Robocode 起作用。

下載并安裝 Robocode

Robocode 是 Mathew Nelson 的智慧之作,他是 IBM Internet 部門 Advanced Technology 的軟件工程師。請首先訪問 IBM alphaWorks Robocode 頁面。在這個(gè)頁面上,您可以找到 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

?在安裝過程中,Robocode 將問您是否要使用這個(gè)外部的 Java VM 來編譯機(jī)器人。您也可以選擇使用作為 Robocode 分發(fā)包一部分而提供的 Jikes 編譯器。

安裝完成后,您可以通過 shell 腳本(robocode.sh)、批處理文件(robocode.bat)或桌面上的圖標(biāo)來啟動 Robocode 系統(tǒng)。此時(shí),戰(zhàn)場將會出現(xiàn)。在此,您可以通過菜單調(diào)用 Robot Editor 和 compiler。





回頁首


Robocode 系統(tǒng)組件

當(dāng)您激活 Robocode 時(shí),將看到兩個(gè)相關(guān)的 GUI 窗口,這兩個(gè)窗口構(gòu)成了 Robocode 的 IDE:

  • 戰(zhàn)場
  • Robot Editor

圖 1 展示了處于工作狀態(tài)的戰(zhàn)場和 Robot Editor。


圖 1. Robocode IDE
Robocode IDE

戰(zhàn)場是機(jī)器人之間進(jìn)行戰(zhàn)斗直至分出勝負(fù)的場地。主要的仿真引擎被置于其中,并且允許您在這里創(chuàng)建戰(zhàn)斗、保存戰(zhàn)斗以及打開新建的或現(xiàn)有的戰(zhàn)斗。通過界面區(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ī)器人都會處于戰(zhàn)場上一個(gè)部署就緒的位置。

Robocode 里的每個(gè)機(jī)器人都由一個(gè)或多個(gè) Java 類構(gòu)成。這些類可以被壓縮成一個(gè) JAR 包。為此,Robocode 的最新版本提供了一個(gè)可以在戰(zhàn)場 GUI 窗口中激活的“Robot Packager”。





回頁首


對 Robocode 機(jī)器人的詳細(xì)分析

在寫這篇文章時(shí),Robocode 機(jī)器人是一個(gè)圖形化的坦克。圖 2 是一個(gè)典型的 Robocode 機(jī)器人的圖解。


圖 2. 對 Robocode 機(jī)器人的詳細(xì)分析
Robocode 機(jī)器人

請注意,機(jī)器人有一門可以旋轉(zhuǎn)的炮,炮上面的雷達(dá)也是可以旋轉(zhuǎn)的。機(jī)器人坦克車(Vehicle)、炮(Gun)以及雷達(dá)(Radar)都可以單獨(dú)旋轉(zhuǎn),也就是說,在任何時(shí)刻,機(jī)器人坦克車、炮以及雷達(dá)都可以轉(zhuǎn)向不同的方向。缺省情況下,這些方向是一致的,都指向坦克車運(yùn)動的方向。





回頁首


Robot 命令

Robocode 機(jī)器人的命令集都收錄在 Robocode API Javadoc 中。您將會發(fā)現(xiàn)這些命令都是 robocode.Robot 類的公共方法。在這一部分,我們將分類討論每個(gè)可用的命令。

移動機(jī)器人、炮和雷達(dá)

讓我們從移動機(jī)器人及其裝備的基本命令開始:

  • turnRight(double degree)turnLeft(double degree) 使機(jī)器人轉(zhuǎn)過一個(gè)指定的角度。
  • ahead(double distance)back(double distance) 使機(jī)器人移動指定的像素點(diǎn)距離;這兩個(gè)方法在機(jī)器人碰到墻或另外一個(gè)機(jī)器人時(shí)即告完成。
  • turnGunRight(double degree)turnGunLeft(double degree) 使炮可以獨(dú)立于坦克車的方向轉(zhuǎn)動。
  • turnRadarRight(double degree)turnRadarLeft(double degree) 使炮上面的雷達(dá)轉(zhuǎn)動,轉(zhuǎn)動的方向也獨(dú)立于炮的方向(以及坦克車的方向)。

這些命令都是在執(zhí)行完畢后才把控制權(quán)交還給程序。此外,轉(zhuǎn)動坦克車的時(shí)候,除非通過調(diào)用下列方法分別指明炮(和雷達(dá))的方向,否則炮(和雷達(dá))的指向也將移動。

  • setAdjustGunForRobotTurn(boolean flag) :如果 flag 被設(shè)置成 true,那么坦克車轉(zhuǎn)動時(shí),炮保持原來的方向。
  • setAdjustRadarForRobotTurn(boolean flag) :如果 flag 被設(shè)置成 true,那么坦克車(和炮)轉(zhuǎn)動時(shí),雷達(dá)會保持原來的方向。
  • setAdjustRadarForGunTurn(boolean flag) :如果 flag 被設(shè)置成 true,那么炮轉(zhuǎn)動時(shí),雷達(dá)會保持原來的方向。而且,它執(zhí)行的動作如同調(diào)用了 setAdjustRadarForRobotTurn(true)

獲取關(guān)于機(jī)器人的信息

有許多方法可以得到關(guān)于機(jī)器人的信息。下面簡單列舉了常用的方法調(diào)用:

  • getX()getY() 可以捕捉到機(jī)器人當(dāng)前的坐標(biāo)。
  • getHeading()getGunHeading()getRadarHeading() 可以得出坦克車、炮或雷達(dá)當(dāng)前的方向,該方向是以角度表示的。
  • getBattleFieldWidth()getBattleFieldHeight() 可以得到當(dāng)前這一回合的戰(zhàn)場尺寸。

射擊命令

一旦您掌握了移動機(jī)器人以及相關(guān)的武器裝備的方法,您就該考慮射擊和控制損害的任務(wù)了。每個(gè)機(jī)器人在開始時(shí)都有一個(gè)缺省的“能量級別”,當(dāng)它的能量級別減小到零的時(shí)候,我們就認(rèn)為這個(gè)機(jī)器人已經(jīng)被消滅了。射擊的時(shí)候,機(jī)器人最多可以用掉三個(gè)能量單位。提供給炮彈的能量越多,對目標(biāo)機(jī)器人所造成的損害也就越大。 fire(double power)fireBullet(double power) 用來發(fā)射指定能量(火力)的炮彈。調(diào)用的 fireBullet() 版本返回 robocode.Bullet 對象的一個(gè)引用,該引用可以用于高級機(jī)器人。

事件

每當(dāng)機(jī)器人在移動或轉(zhuǎn)動時(shí),雷達(dá)一直處于激活狀態(tài),如果雷達(dá)檢測到有機(jī)器人在它的范圍內(nèi),就會觸發(fā)一個(gè)事件。作為機(jī)器人創(chuàng)建者,您有權(quán)選擇處理可能在戰(zhàn)斗中發(fā)生的各類事件。基本的 Robot 類中包括了所有這些事件的缺省處理程序。但是,您可以覆蓋其中任何一個(gè)“什么也不做的”缺省處理程序,然后實(shí)現(xiàn)您自己的定制行為。下面是一些較為常用的事件:

  • ScannedRobotEvent 。通過覆蓋 onScannedRobot() 方法來處理 ScannedRobotEvent ;當(dāng)雷達(dá)檢測到機(jī)器人時(shí),就調(diào)用該方法。
  • HitByBulletEvent 。通過覆蓋 onHitByBullet() 方法來處理 HitByBulletEvent ;當(dāng)機(jī)器人被炮彈擊中時(shí),就調(diào)用該方法。
  • HitRobotEvent 。通過覆蓋 onHitRobot() 方法來處理 HitRobotEvent ;當(dāng)您的機(jī)器人擊中另外一個(gè)機(jī)器人時(shí),就調(diào)用該方法。
  • HitWallEvent 。通過覆蓋 onHitWall() 方法來處理 HitWallEvent ;當(dāng)您的機(jī)器人撞到墻時(shí),就調(diào)用該方法。

我們只需要知道這些就可以創(chuàng)建一些相當(dāng)復(fù)雜的機(jī)器人了。您可以通過戰(zhàn)場的幫助菜單或 Robot Editor 的幫助菜單訪問 Javadoc 中其余的 Robocode API。

現(xiàn)在,我們該把學(xué)到的知識付諸實(shí)踐了。





回頁首


創(chuàng)建機(jī)器人

要?jiǎng)?chuàng)建一個(gè)新的機(jī)器人,請啟動 Robot Editor 并選擇 File-> New-> Robot。系統(tǒng)將會提示您輸入機(jī)器人的名稱,這個(gè)名稱將成為 Java 類名。請您在提示符處輸入 DWStraight。接下來,系統(tǒng)還會提示您輸入一個(gè)獨(dú)一無二的包前綴,它將用作存放機(jī)器人(還可能有相關(guān)的 Java 文件)的包的名稱。請?jiān)谠撎崾痉庉斎?dw

Robot Editor 就會顯示您要控制這個(gè)機(jī)器人需要編寫的 Java 代碼。清單 1 是您將會看到的代碼的一個(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)的第二部分。在此,我們將在無限 while 循環(huán)內(nèi)對機(jī)器人可能執(zhí)行的重復(fù)行為進(jìn)行編程。

Area 4
您可以在這一區(qū)域內(nèi)添加機(jī)器人在 run() 邏輯內(nèi)使用的助手方法。您也可以在此添加您想要覆蓋的任何事件處理程序。例如,清單 1 里的代碼處理 ScannedRobot 事件,每當(dāng)雷達(dá)檢測到機(jī)器人的時(shí)候,只是直接向其發(fā)射炮彈。

我們對第一個(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),我們通過 turnLeft(getHeading()) 使它轉(zhuǎn)到 0 度的方向。

Area 3
在這個(gè)重復(fù)性的部分,我們使用語句 ahead(1000) 讓機(jī)器人盡其所能向前移動到最遠(yuǎn)的地方。當(dāng)機(jī)器人撞到墻或其他機(jī)器人時(shí),就會停下來。接著,我們通過 turnRight(90) 使它向右轉(zhuǎn)。在重復(fù)執(zhí)行這一行為時(shí),機(jī)器人基本上是在沿著墻按順時(shí)針方向移動。

Area 4
在此,除處理自動生成的 ScannedRobot 事件并向被發(fā)現(xiàn)的機(jī)器人直接射擊之外,我們還會檢測 HitByBullet 事件,并且讓機(jī)器人在被擊中的時(shí)候轉(zhuǎn)過 180 度(沿順時(shí)針方向或逆時(shí)針方向)。





回頁首


編譯以及測試機(jī)器人

在 Robot Editor 菜單上選擇 Compiler-> Compile編譯您的機(jī)器人代碼。現(xiàn)在我們可以嘗試第一回合的戰(zhàn)斗了。切換回戰(zhàn)場并選擇菜單上的 Battle-> New,將會出現(xiàn)一個(gè)類似于圖 3 中所示的對話框。


圖 3. New Battle 對話框
New Battle 對話框

請先將我們的機(jī)器人 dw.DWStraight 添加到戰(zhàn)斗中,然后再添加一個(gè)對手機(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í),請先看看隨 參考資料 中的代碼分發(fā)包一起提供的 dw.DWRotater 這個(gè)機(jī)器人的代碼。在缺省情況下,這個(gè)機(jī)器人將會:

  • 移動到戰(zhàn)場中心
  • 一直轉(zhuǎn)動它的炮,直到檢測到機(jī)器人
  • 每次嘗試以不同的角度在離被檢測到的機(jī)器人前方不遠(yuǎn)的地方射擊
  • 每當(dāng)它被另外一個(gè)機(jī)器人擊中時(shí),它都會迅速的來回移動

這段代碼簡單易懂,所以我們在這里就不做分析了,但是我鼓勵(lì)您試驗(yàn)一下。Robocode 中的 sample 包還提供了許多其他機(jī)器人的代碼。

附加的機(jī)器人支持類

隨著您設(shè)計(jì)機(jī)器人的水平的提高,機(jī)器人的代碼主體將充分增長。對這些代碼的一種模塊化處理方法是把代碼分解成獨(dú)立的 Java 類,然后通過打包器把這些 Java 類打包成一個(gè)單獨(dú)的包(JAR 文件),并將它包括在您的機(jī)器人分發(fā)包內(nèi)。Robocode 將自動在它的 robots 目錄下的包里找到 robot 類。

其他 Robot 子類

任何人都可以創(chuàng)建 Robot 子類并添加用于構(gòu)建機(jī)器人的新功能。Robocode 提供了一個(gè)叫做 AdvancedRobotRobot 子類,它允許異步 API 調(diào)用。雖然對 AdvancedRobot 類的描述超出了本文的范圍,但我鼓勵(lì)您在掌握了基本的 Robot 類的操作后,試驗(yàn)一下這個(gè)高級類。

設(shè)計(jì) Robocode 的目的

我碰見了 Robocode 的創(chuàng)建者 Mathew Nelson,向他請教創(chuàng)建 Robocode 最初的設(shè)計(jì)目的。Mat 所說的是:“編寫 Robocode 的一部分目的是為了向世界證明:象‘Java 比較慢’以及‘Java 不可以用來寫游戲’之類的論斷不再正確。我認(rèn)為我證明了這一點(diǎn)。”





回頁首


戰(zhàn)斗仿真器的體系結(jié)構(gòu)

通過“在后臺”對 Robocode 進(jìn)行分析,我們發(fā)現(xiàn)復(fù)雜的仿真引擎既具高性能(為了以現(xiàn)實(shí)的速度生成戰(zhàn)斗)又具靈活性(使創(chuàng)建復(fù)雜的機(jī)器人邏輯不存在障礙)。特別感謝 Robocode 的創(chuàng)建者 Mathew Nelson 無私的提供了仿真引擎體系結(jié)構(gòu)的內(nèi)部信息。

利用 Java 平臺進(jìn)行設(shè)計(jì)

圖 4 中所示的仿真引擎利用的是大多數(shù)現(xiàn)代的 Java VM 都提供的非搶占式線程技術(shù),并結(jié)合使用了 JDK GUI 和 2D 圖形庫提供的生成功能。


圖 4. Robocode 仿真引擎體系結(jié)構(gòu)
仿真引擎

請注意,所仿真的每個(gè)機(jī)器人都在它自己的 Java 線程上,它可以在任何可適用的地方利用 VM 本地線程映射機(jī)制。戰(zhàn)斗管理器線程是系統(tǒng)的控制器:它安排仿真并驅(qū)動圖形化的生成子系統(tǒng)。圖形化的生成子系統(tǒng)本身是基于 Java 2D 和 AWT 的。

松散的線程耦合

為了減少共享資源可能帶來的問題(以及有可能隨之出現(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ī)器人線程本身之間)可能存在的任何爭用。

Robocode 內(nèi)部結(jié)構(gòu)

您可以把 Robocode 仿真器引擎看作是一個(gè)仿真器程序,該程序在運(yùn)行時(shí)會使用一些插件(定制機(jī)器人);這些插件可以利用已有的 API( robocode.Robot 類的方法)。實(shí)際上,每個(gè)機(jī)器人都是一個(gè)獨(dú)立的 Java 線程,同時(shí) run() 方法內(nèi)包含了每個(gè)線程上將要執(zhí)行的邏輯。

在任何時(shí)候,機(jī)器人線程都可以調(diào)用由它的父類 robocoode.Robot 類所提供的 API。典型情況下,這將通過調(diào)用 Object.wait() 阻塞機(jī)器人線程。

戰(zhàn)斗管理器線程

戰(zhàn)斗管理器線程管理機(jī)器人、炮彈及它們在戰(zhàn)場上的生成。仿真“時(shí)鐘”是根據(jù)戰(zhàn)場上生成的幀的數(shù)目來標(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

												
										

請注意,在 for 循環(huán)內(nèi)部,戰(zhàn)斗管理器線程的等待時(shí)間不會超過最大的時(shí)間間隔。如果機(jī)器人線程沒有及時(shí)調(diào)用阻塞 API(典型情況下是由于一些應(yīng)用程序邏輯錯(cuò)誤或無限循環(huán)),那么,它將繼續(xù)進(jìn)行戰(zhàn)斗。生成一個(gè) SkippedTurnEvent 并將其加入機(jī)器人事件隊(duì)列中,用來通知高級機(jī)器人。

可替換的生成子系統(tǒng)

AWT 和 Java 2D 線程就是當(dāng)前實(shí)現(xiàn)中的生成子系統(tǒng),它從戰(zhàn)斗管理器中獲取命令并生成戰(zhàn)場。它同系統(tǒng)的其余部分是完全分離的。我們可以預(yù)見到,在這個(gè)生成子系統(tǒng)將來的修訂版中,它可以被替換掉(比如,用 3-D 生成器)。在當(dāng)前的實(shí)現(xiàn)中,只要 Robocode 應(yīng)用程序被最小化,生成就禁用了,這可以以更快的速度進(jìn)行仿真。





回頁首


Robocode 的未來

通過 alphaWorks Robocode 站點(diǎn)上的一個(gè)討論組(請參閱 參考資料 ),Mathew Nelson 可以同 Robocode 用戶社區(qū)保持緊密的反饋聯(lián)系。許多反饋都并入了真實(shí)的代碼中。Mathew 已計(jì)劃即將要進(jìn)行的一些改進(jìn)有:

  • 通過不同的物體和障礙來定制戰(zhàn)場地圖
  • 基于團(tuán)隊(duì)的戰(zhàn)斗
  • 對聯(lián)賽或聯(lián)盟的集成支持
  • 用戶可選擇坦克車體/炮/雷達(dá)/武器的樣式




回頁首


擋不住的 Robocode 風(fēng)潮

對于一個(gè)從 2001 年 7 月 12 日出現(xiàn)在公眾面前的項(xiàng)目,Robocode 的出名簡直讓人吃驚。盡管最新的可用版本還不到 1.0(在寫這篇文章時(shí)是版本 0.98.2),但它已經(jīng)是全世界的大學(xué)校園以及公司的 PC 機(jī)上頗受歡迎的娛樂活動了。Robocode 聯(lián)盟(或 roboleagues)正如雨后春筍般出現(xiàn),在這些聯(lián)盟里,人們通過因特網(wǎng)讓自己定制的作品相互較量。大學(xué)教授們一直在挖掘 Robocode 的教育特性,并且已經(jīng)把它納入了大學(xué)里的計(jì)算機(jī)科學(xué)課程。在因特網(wǎng)上,Robocode 用戶組、討論列表、FAQ、教程和 Webring 隨處可見。

顯然,Robocode 已經(jīng)填補(bǔ)了大眾化的寓教于樂領(lǐng)域的空白 ― 它為學(xué)生們和熬夜的工程師們提供簡便、有趣、非脅迫卻富競爭力的方式,釋放他們的創(chuàng)造力,而且有可能實(shí)現(xiàn)他們征服世界的夢想。

posted on 2006-07-19 20:55 Merlin 閱讀(446) 評論(0)  編輯 收藏 引用 所屬分類: java基礎(chǔ)篇
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久频这里精品99香蕉| 久久久7777| 亚洲欧美另类综合偷拍| 国产精品专区一| 91久久极品少妇xxxxⅹ软件| 欧美日韩国产综合一区二区| 久久综合影视| 99精品国产高清一区二区| 噜噜噜在线观看免费视频日韩| 99精品国产一区二区青青牛奶| 亚洲国产精品精华液网站| 国产精品美女诱惑| 久久在线精品| 国产精品电影观看| 欧美一区二区大片| 日韩一区二区高清| 免费成人在线观看视频| 国产精品普通话对白| 久久精品人人做人人爽电影蜜月| 美女精品视频一区| 亚洲国产天堂久久综合| 老**午夜毛片一区二区三区| 亚洲人成在线观看网站高清| 一本大道久久a久久精品综合| 欧美国产专区| 久久久久一本一区二区青青蜜月| 韩国v欧美v日本v亚洲v| 欧美日韩一区二区三区高清| 欧美性感一类影片在线播放 | 米奇777在线欧美播放| 久久av资源网站| 亚洲电影专区| 欧美一区2区视频在线观看| 伊人狠狠色j香婷婷综合| 国产精品每日更新| 欧美日本国产一区| 欧美国产极速在线| 欧美三级电影网| 欧美精品一区二区在线播放| 欧美日韩在线大尺度| 欧美在线视频在线播放完整版免费观看| 亚洲人成网站色ww在线| 亚洲精品久久久久久久久久久久| 午夜精品免费视频| 99re热这里只有精品免费视频| 永久91嫩草亚洲精品人人| 国产精品第一页第二页第三页| 激情久久久久久久久久久久久久久久 | 欧美精品粉嫩高潮一区二区| 老司机午夜精品视频在线观看| 欧美一区二区三区日韩| 久久久国产视频91| 欧美成人一区二区三区片免费| 欧美日韩视频一区二区| 国产精品一二一区| 篠田优中文在线播放第一区| 亚洲欧美一区二区在线观看| 免费日韩av| 国产日产高清欧美一区二区三区| 午夜视频久久久| 中日韩美女免费视频网址在线观看| 久久国产主播精品| 国产精品美女午夜av| 海角社区69精品视频| 一区二区久久久久| 99re66热这里只有精品4| 麻豆成人在线| 亚洲第一黄色| 久久精品一区二区三区四区| 久久在线免费观看视频| 久久精品国产一区二区三区免费看| 国产小视频国产精品| 日韩视频一区二区三区在线播放| 欧美国产一区二区| 久久久水蜜桃av免费网站| 欧美日韩xxxxx| 狠狠做深爱婷婷久久综合一区 | 久久亚洲国产成人| 国产精品美女久久久久久久| 午夜精品区一区二区三| 99这里只有久久精品视频| 欧美天天影院| 亚洲国产一区二区a毛片| 亚洲图片你懂的| 99re亚洲国产精品| 久久精品午夜| 亚洲激情啪啪| 亚洲视频大全| 欧美国产三区| 欧美成人自拍| 在线视频日韩| 久久精品成人一区二区三区| 亚洲第一区在线| 欧美在线不卡| 午夜视频久久久| 老司机成人在线视频| 免费观看成人| 久久精品一区二区三区中文字幕 | 亚洲美女黄网| 久久久青草婷婷精品综合日韩| 性欧美在线看片a免费观看| 欧美在线观看视频一区二区| 亚洲午夜av| 亚洲影院一区| 亚洲精品中文字幕有码专区| 欧美亚洲日本一区| 国产在线观看一区| 性视频1819p久久| 91久久视频| 欧美三级电影精品| 亚洲午夜精品网| 亚洲欧美日韩精品久久奇米色影视| 久久青青草综合| 99视频在线精品国自产拍免费观看 | 国产日韩一级二级三级| 日韩视频永久免费| 国产精品99久久久久久宅男 | 欧美亚洲一区二区在线| 激情久久一区| 久久xxxx精品视频| 猛男gaygay欧美视频| 亚洲一区免费观看| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲大片精品永久免费| 亚洲欧美一区二区三区久久| 亚洲欧洲一二三| 女生裸体视频一区二区三区| 亚洲尤物在线视频观看| 欧美激情国产精品| 亚洲精品影院| 在线日韩日本国产亚洲| 欧美福利一区| 欧美在线观看www| 亚洲精品日本| 久久综合伊人77777| 一区二区三区在线观看国产| 欧美午夜一区二区| 久久阴道视频| 欧美一级淫片aaaaaaa视频| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品综合| 国产在线精品自拍| 国产欧美日韩免费| 国产一区二区三区av电影| 亚洲丁香婷深爱综合| 亚洲丝袜av一区| 99成人在线| 宅男精品导航| 亚洲黄色有码视频| 亚洲第一色在线| 蜜臀久久久99精品久久久久久| 亚洲视频一区二区免费在线观看| 欧美成人一区二区三区在线观看| 老司机精品久久| 国产一区二区三区高清播放| 亚洲欧美日韩在线不卡| 久久精品盗摄| 在线播放日韩欧美| 免费观看在线综合色| 亚洲国产欧美不卡在线观看| 91久久精品国产91性色| 欧美日韩1区| 亚洲一区二区不卡免费| 久久超碰97人人做人人爱| 激情欧美一区二区三区| 欧美成人四级电影| 一区二区三区精品| 久久都是精品| 亚洲国产婷婷| 国产精品久久久久久久久果冻传媒| 一本色道久久88精品综合| 欧美一站二站| 亚洲激情精品| 国产精品久久久久免费a∨大胸| 欧美一区二区三区精品| 欧美激情第六页| 欧美在线啊v| 日韩午夜在线电影| 国产精品中文字幕欧美| 欧美凹凸一区二区三区视频| 亚洲综合色激情五月| 欧美激情精品久久久六区热门| 亚洲欧美日韩爽爽影院| 亚洲电影自拍| 国产精品中文字幕欧美| 欧美剧在线免费观看网站| 久久激情视频免费观看| 在线一区免费观看| 美国三级日本三级久久99| 亚洲视频一二区| 国产一区二区三区视频在线观看| 欧美乱妇高清无乱码| 欧美诱惑福利视频| 亚洲小说欧美另类社区| 亚洲国产精品久久91精品| 久久综合导航| 久久精品国产2020观看福利| 亚洲自拍三区| 亚洲女与黑人做爰| 亚洲天堂av在线免费|