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

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>
            久久精品国产第一区二区三区| 欧美日韩三区| 欧美国产日韩xxxxx| 久久偷窥视频| 欧美性jizz18性欧美| 国产精品日韩欧美一区二区三区| 欧美日韩精品欧美日韩精品| 欧美精品一区二区三区蜜桃| 欧美日韩国产探花| 国产精品r级在线| 国产欧美日韩视频在线观看| 黄色成人免费观看| 亚洲国产日韩欧美在线99| 亚洲人妖在线| 欧美亚洲一级| 欧美电影在线| 亚洲免费在线精品一区| 久久福利精品| 欧美人与性禽动交情品| 国产视频一区二区在线观看 | 欧美a级片一区| 欧美日韩一区二区在线播放| 国产精品一区久久久久| 国产亚洲欧美激情| 亚洲精品极品| 欧美一区二区三区在线看| 另类专区欧美制服同性| 亚洲精品影院在线观看| 欧美在线观看网址综合| 欧美日韩1区2区| 国内精品视频在线观看| 亚洲精品在线看| 久久久久国色av免费看影院| 亚洲高清资源| 99国产精品99久久久久久| 亚洲在线一区| 欧美老女人xx| 在线日韩欧美| 欧美一区二视频| 亚洲精品资源| 久久综合给合| 国产精品嫩草99a| 亚洲精品一区二区在线| 性色av一区二区怡红| 亚洲人体影院| 久久亚洲电影| 好吊色欧美一区二区三区四区| 亚洲免费视频观看| 亚洲精品一二三| 久久亚洲免费| 亚洲欧美国产另类| 欧美性大战xxxxx久久久| 91久久精品久久国产性色也91| 久久精品女人天堂| 亚洲欧美日韩国产成人| 欧美性jizz18性欧美| 亚洲午夜在线观看| 日韩午夜精品视频| 另类春色校园亚洲| 亚洲欧美日本视频在线观看| 免费国产自线拍一欧美视频| 国产一区二区成人久久免费影院| 亚洲一二三四区| 夜夜嗨一区二区| 欧美视频一区在线观看| 宅男在线国产精品| 一本色道久久综合亚洲精品小说 | 久久天堂成人| 在线不卡a资源高清| 久久这里有精品视频| 久久成人免费电影| 精品粉嫩aⅴ一区二区三区四区| 久久福利电影| 欧美一级播放| 伊人色综合久久天天| 免费成人激情视频| 欧美成人免费观看| 亚洲六月丁香色婷婷综合久久| 亚洲福利国产| 欧美日韩在线视频观看| 亚洲综合色激情五月| 午夜精品久久久久影视| 国产精品综合视频| 久久久久国产一区二区| 久久久久久久综合| 最近中文字幕日韩精品| 亚洲日本电影| 国产精品入口夜色视频大尺度| 欧美一区成人| 欧美 日韩 国产一区二区在线视频| 亚洲国产一成人久久精品| 亚洲激情视频网站| 国产精品国产三级国产a| 久久久久国产一区二区三区| 欧美国产精品| 欧美在线观看www| 欧美va亚洲va国产综合| 亚洲男女自偷自拍| 久久久精品视频成人| 一本久久精品一区二区| 午夜精品一区二区三区电影天堂| 在线日韩中文| 亚洲一区二区黄| 亚洲国产成人av在线| 99国内精品| 亚洲成人在线网| 亚洲女女做受ⅹxx高潮| 亚洲电影在线播放| 亚洲女人天堂av| 一区二区激情视频| 老色鬼久久亚洲一区二区| 午夜精品成人在线| 免费在线观看日韩欧美| 欧美在线观看视频在线| 欧美激情一二三区| 麻豆成人小视频| 国产视频在线观看一区| 9久re热视频在线精品| 一区在线电影| 久久免费偷拍视频| 欧美午夜寂寞影院| 欧美激情一区二区三区在线| 国产酒店精品激情| 亚洲最新视频在线| 亚洲美女色禁图| 农村妇女精品| 欧美电影免费网站| 在线观看国产欧美| 久久久99免费视频| 久久九九有精品国产23| 国产精品视频网站| 亚洲欧美日韩视频一区| 亚洲女性裸体视频| 国产精品av一区二区| 日韩视频专区| 一本色道久久精品| 欧美日本免费| 91久久久久久久久| 亚洲免费观看| 欧美日韩高清在线一区| 亚洲精品三级| 正在播放亚洲| 国产精品激情偷乱一区二区∴| 亚洲国产老妈| 亚洲最新在线| 国产精品久久久对白| 亚洲欧美欧美一区二区三区| 亚洲欧美区自拍先锋| 国产欧美日韩精品一区| 欧美一区二区在线看| 鲁大师影院一区二区三区| 亚洲国产精品一区二区尤物区| 牛牛国产精品| 夜夜嗨av一区二区三区网页 | 久久久久网站| 1769国产精品| 欧美日本中文| 亚洲自拍偷拍麻豆| 久久久国产一区二区三区| 影音先锋日韩资源| 欧美老女人xx| 小处雏高清一区二区三区| 老司机精品导航| 一本大道久久a久久精二百| 欧美午夜精品久久久久久人妖 | 免费美女久久99| 日韩午夜电影在线观看| 欧美一区二区三区在线免费观看| 亚洲国产精品一区二区尤物区| 欧美a级一区| 亚洲欧美国产制服动漫| 裸体歌舞表演一区二区| 亚洲日本无吗高清不卡| 欧美日本网站| 欧美综合77777色婷婷| 亚洲电影中文字幕| 欧美一区影院| 日韩视频欧美视频| 国产亚洲一区二区三区在线播放| 免费久久99精品国产自| 亚洲视频在线观看免费| 欧美激情1区| 久久精品国产精品亚洲| 亚洲精品中文字幕在线| 国产日韩精品一区| 欧美精品一卡| 夜夜嗨一区二区三区| 亚洲天堂成人在线观看| 久久综合伊人77777麻豆| 一区二区三区导航| 136国产福利精品导航网址应用| 欧美午夜精品久久久久久超碰| 久久亚洲高清| 亚洲免费在线观看| 夜久久久久久| 亚洲经典视频在线观看| 美女啪啪无遮挡免费久久网站| 亚洲欧美另类中文字幕| 亚洲另类在线视频| 18成人免费观看视频|