robocode_摇滚,袜子,Robocode!
Robocode是一個易于使用的機器人戰斗模擬器,可在支持Java 2的所有平臺上運行。您可以創建一個機器人,將其放置在戰場上,并使其與其他開發人員創建的對手機器人進行激烈的戰斗。 Robocode帶有一組預制的對手,可以幫助您入門,但是一旦超出對手,您就可以與世界上最好的聯盟中的世界上最好的聯盟對抗,進入自己的創作。
每個Robocode參與者都使用Java語言的元素來創建自己的機器人,從而使各種開發人員(從高級初學者到高級黑客)都可以參與其中。 入門的Java開發人員可以學習以下基礎知識:調用API代碼,閱讀Javadocs,繼承,內部類,事件處理等。 高級開發人員可以在全球性挑戰中調整其編程技能,以構建同類最佳的軟件機器人。 在本文中,我們將介紹Robocode,并通過構建您的第一個Robocode機器人開始征服世界。 我們還將窺視使Robocode流行的迷人的“幕后”機制。
下載并安裝Robocode
Robocode是Mathew Nelson(IBM高級技術,Internet部門的軟件工程師)的創意。 首先,進入Robocode頁面。 在這里,您將找到Robocode系統的最新可執行文件。 下載完發行版(位于獨立的安裝文件中)之后,可以使用以下命令來將軟件包安裝在系統上(假設您的計算機上已預先安裝了Java VM(JDK 1.3.x)) , 當然):
java -jar robocode-setup.jar在安裝過程中,Robocode會詢問您是否要使用此外部Java VM進行機器人編譯。 另一種選擇是作為Robocode發行版的一部分提供的Jikes編譯器。
安裝后,您可以從外殼程序腳本(robocode.sh),批處理文件(robocode.bat)或桌面上的圖標啟動Robocode系統。 此時,戰場將出現。 在這里,您可以使用菜單調用機器人編輯器和編譯器。
Robocode系統的組件
激活Robocode時,您將看到兩個相互關聯的GUI窗口,它們構成Robocode的IDE:
- 戰場
 - 機器人編輯器
 
圖1顯示了戰場和實際的機器人編輯器。
圖1. Robocode IDE
戰場是機器人之間進行戰斗的地方。 它包含主要的模擬引擎,并允許您創建,保存和打開新的或現有的戰斗。 您可以使用舞臺上可用的控件來暫停和繼續戰斗,終止戰斗,銷毀任何單個機器人或獲取任何機器人的統計信息。 此外,您可以從該屏幕激活機器人編輯器。
機械手編輯器是一個自定義的文本編輯器,用于編輯構成機械手的Java源文件。 它在菜單中集成了Java編譯器(用于編譯機器人代碼)和自定義的Robot包裝程序。 使用“機器人編輯器”創建并成功編譯的所有機器人都位于戰場上隨時可以部署的位置。
Robocode中的機器人由一個或多個Java類組成。 這些類可以存檔到JAR包中。 Robocode的最新版本提供了一個“ Robot Packager”,可以從戰場GUI窗口中激活它。
Robocode機器人的解剖
在撰寫本文時,Robocode機器人是一個圖形坦克。 圖2說明了典型的Robocode機器人。
圖2. Robocode機器人的解剖
請注意,機器人具有旋轉槍,并且在槍的頂部是旋轉雷達。 機器人車輛,槍支和雷達都可以獨立旋轉:在任何時候,機器人車輛,槍支和雷達都可以朝不同的方向旋轉。 默認情況下,這些項目是面向車輛運動方向對齊的。
機器人命令
Robocode機械手的命令集全部記錄在Robocode API的Javadoc中。 您會發現它們是robocode.Robot類的公共方法。 在本節中,我們將按類別介紹每個可用的命令。
移動機器人,槍支和雷達
讓我們從移動機器人及其配件的基本命令開始:
- turnRight(double degree)和turnLeft(double degree)將機器人旋轉指定的度數。
 - ahead(double distance)和back(double distance)將機器人移動指定的像素距離; 如果機器人撞到墻壁或其他機器人,則完成這兩種方法。
 - turnGunRight(double degree)和turnGunLeft(double degree)使噴槍轉動,與車輛的方向無關。
 - turnRadarRight(double degree)和turnRadarLeft(double degree)將雷達置于槍支頂部,與槍支的方向(以及車輛的方向)無關。
 
這些命令在完成之前不會將控制權返回給程序。 此外,當車輛轉彎時,槍支(和雷達)的方向也會移動,除非通過調用以下方法進行另外說明:
- setAdjustGunForRobotTurn(boolean flag) :如果該標志設置為true,則在車輛轉彎時,噴??槍將保持相同方向。
 - setAdjustRadarForRobotTurn(boolean flag) :如果該標志設置為true,則在車輛(和機槍)轉彎時,雷達將保持相同方向。
 - setAdjustRadarForGunTurn(boolean flag) :如果該標志設置為true,則在槍支轉動時雷達將保持相同方向。 它也將像已調用setAdjustRadarForRobotTurn(true)一樣起作用。
 
獲取有關機器人的信息
存在許多獲取有關機器人的信息的方法。 以下是常用方法調用的簡短列表:
- getX()和getY()獲取機器人的當前坐標。
 - getHeading() , getGunHeading()和getRadarHeading()以度為單位獲取車輛,槍支或雷達的當前航向。
 - getBattleFieldWidth()和getBattleFieldHeight()獲取當前回合的戰場尺寸。
 
觸發命令
掌握了如何移動機器人及其相關武器后,現在就可以考慮發射和控制傷害的任務了。 每個機器人都以默認的“能量級別”開始,并且當其能量級別降至零時被視為已銷毀。 發射時,機器人最多可以使用三個單位的能量。 提供給子彈的能量越多,它將對目標機器人造成的傷害越大。 fire(double power)和fireBullet(double power)用于以指定的能量(火力)發射子彈。 調用的fireBullet()版本返回對robocode.Bullet對象的引用,該對象可在高級機器人中使用。
大事記
每當機器人移動或轉動時,雷達始終處于活動狀態,并且如果檢測到其范圍內的任何機器人,都會觸發事件。 作為機器人的創建者,您可以選擇處理戰斗中可能發生的各種事件。 基本的Robot類具有所有這些事件的默認處理程序。 但是,您可以覆蓋所有這些“不執行任何操作”默認處理程序,并實現自己的自定義操作。 以下是一些更常用的事件:
- ScannedRobotEvent 。 通過重寫onScannedRobot()方法來處理ScannedRobotEvent ; 當雷達檢測到機器人時,將調用此方法。
 - HitByBulletEvent 。 通過重寫onHitByBullet()方法來處理HitByBulletEvent ; 當機器人被子彈擊中時,將調用此方法。
 - HitRobotEvent 。 通過重寫onHitRobot()方法來處理HitRobotEvent ; 當您的機器人撞擊另一個機器人時,將調用此方法。
 - HitWallEvent 。 通過重寫onHitWall()方法來處理HitWallEvent ; 當您的機器人撞到墻壁時,將調用此方法。
 
這就是我們創建一些非常復雜的機器人所需的全部知識。 您可以在Javadoc中找到其余的Robocode API,可以從戰場的幫助菜單或機器人編輯器的幫助菜單中進行訪問。
現在是時候運用我們的知識了。
創建一個機器人
要創建新的機器人,請啟動機器人編輯器,然后選擇文件 -> 新建 -> 機器人 。 系統將提示您輸入機械手的名稱,該名稱將成為Java類名稱。 在此提示符下輸入DWStraight 。 接下來,系統將提示您輸入一個唯一的縮寫,該名稱將用作機器人(及其相關Java文件)所在的軟件包的名稱。在此提示符下輸入dw 。
機器人編輯器將顯示您需要編寫以控制機器人的Java代碼。 清單1是您將看到的代碼示例:
清單1. Robocode生成的機器人代碼
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);} }突出顯示的區域是我們可以添加代碼來控制機器人的地方:
 1區 
 在此空間中,我們可以聲明類作用域變量并設置其值。 它們將在機器人的run()方法以及您可能創建的任何其他幫助程序方法中可用。 
 2區 
 戰斗管理員調用run()方法來啟動機器人的生命。 它通常由兩個區域(清單1中指定為Area 2和Area 3)組成,您可以在其中添加代碼。 在區域2中,您將放置每個機器人實例僅運行一次的代碼。 它通常用于在開始重復動作之前使機器人進入預定狀態。 
 3區 
 這是典型的run()方法實現的第二部分。 在這里,在一個無盡的while循環中,我們將對機器人可能涉及的重復動作進行編程。 
 4區 
 在該區域中,您可以添加幫助程序方法,以供機器人在其run()邏輯中使用。 您也可以在其中添加任何要覆蓋的事件處理程序。 例如,清單1中的代碼處理ScannedRobot事件,并在雷達檢測到機器人時直接向機器人觸發。 
對于我們的第一個機器人DWStraight,我們將更新清單2中以粗體顯示的代碼。
清單2. DWStraight機器人代碼的添加
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);}}這是第一個機器人按區域進行的操作:
 1區 
 我們沒有在此機器人中指定任何類范圍變量。 
 2區 
 為了使機器人進入已知狀態,我們使用turnLeft(getHeading())將其旋轉為面向0度。 
 3區 
 在此重復部分中,我們使用ahead(1000)將機器人向前移動到盡可能遠的距離。 碰到墻壁或機器人時,它將停止。 然后我們使用turnRight(90)右轉。 重復此過程后,機器人將基本上沿順時針方向畫出墻壁。 
 4區 
 在這里,除了處理自動生成的ScannedRobot事件并向直接找到的機器人射擊外,我們還檢測到HitByBullet事件,并在HitByBullet旋轉180度(順時針和逆時針交替旋轉)。 
編譯和測試機器人
從“機器人編輯器”菜單中,選擇“ 編譯器” ->“ 編譯”以編譯機器人代碼。 我們現在準備嘗試我們的第一場戰斗。 切換回戰場并選擇菜單Battle- > New,以顯示類似于圖3的對話框。
圖3. New Battle對話框
將我們的機器人dw.DWStraight添加到戰斗中,然后添加一個對手機器人,例如sample.SittingDuck。 點擊完成 ,戰斗將開始。 誠然,與SeatingDuck進行戰斗并不太令人興奮,但是您可以了解DWStraight機器人默認情況下的功能。 與樣本集中的其他機器人進行實驗,并了解DWStraight如何與他們競爭。
當你準備好檢查另一個機器人的編碼,請即與在代碼分發提供的dw.DWRotater機器人代碼相關的話題 。 默認情況下,此機器人將:
- 移到戰場中心
 - 持續旋轉槍支直到檢測到機器人
 - 在檢測到的機器人前方稍稍開火,每次嘗試不同的角度
 - 每當它被另一個機器人撞擊時,來回快速移動。
 
該代碼很簡單,我們將不在這里進行分析,但是我鼓勵您嘗試一下。 Robocode隨附的示例軟件包也為許多其他機器人提供了代碼。
其他機器人支持課程
隨著您在機器人設計方面的能力越來越強,可以包含在機器人中的代碼量也會大大增加。 處理代碼的模塊化方法是將其分解為單獨的Java類,然后使用打包程序將它們捆綁到一個單獨的程序包(JAR文件)中,以將其包括在您的機器人分發中。 Robocode將自動在放置在其robots目錄中的程序包中找到機械手類。
Robocode設計背后的動機
我遇到了Robocode的創建者Mathew Nelson,并詢問了他創建Robocode的最初動機。 這是Mat必須分享的內容:“編寫Robocode的部分動機是向世界證明,'Java速度慢'和'您不能用Java編寫游戲'這樣的說法已不再正確。我想我做到了它。”
其他機器人子類
任何人都可以創建Robot子類,并添加可用于構建機器人的新功能。 Robocode提供了Robot的子類AdvancedRobot ,該子類支持異步API調用。 AdvancedRobot類的描述不在本文討論范圍之內,但是我建議您在熟悉基本Robot類的操作之后嘗試使用該高級類。
戰斗模擬器的架構
通過Robocode的幕后觀察,您可以看到一個復雜的仿真引擎,該引擎既具有高性能(以便以逼真的速度渲染戰斗)又具有靈活性(無需阻礙即可創建復雜的機器人邏輯)。 特別感謝Robocode的創建者Mathew Nelson慷慨地提供了有關仿真引擎體系結構的內部信息。
利用Java平臺的設計
如圖4所示,該仿真引擎利用了大多數現代Java VM提供的非搶占線程,并將其與JDK GUI和2D圖形庫提供的渲染功能相結合。
圖4. Robocode仿真引擎架構
請注意,每個模擬的機器人都在其自己的Java線程上,并在適當的情況下利用VM的本機線程映射。 戰斗管理器線程是系統的控制器:它協調模擬并驅動圖形渲染子系統。 圖形渲染子系統本身基于Java 2D和AWT。
螺紋聯軸器松動
為了緩解共享資源的潛在問題(從而可能導致模擬引擎死鎖或阻塞),戰斗管理器線程和機器人線程之間需要非常松散的耦合。 為了實現這種松散耦合,每個機械手線程都有自己的事件隊列。 然后,在機器人自己的線程中提取并處理每個機器人的事件。 這種按線程排隊有效地消除了戰斗管理器線程與機器人線程之間或機器人線程本身之間的任何潛在爭用。
Robocode內部
您可以將Robocode仿真器引擎視為一個仿真器程序,該程序在運行時需要一組插件(自定義機械手)。 這套插件可以利用提供的API( robocode.Robot類的方法)。 從物理上講,每個機械手是一個獨立的Java線程,并且run()方法包含將在該線程上執行的邏輯。
機械手線程可以隨時調用其父級robocoode.Robot類提供的API。 通常,這將通過Object.wait()調用來阻塞機器人線程。
戰斗經理線程
戰斗管理器線程管理戰場上的機器人,子彈和渲染。 模擬“時鐘”由戰場上渲染的幀數標記。 實際幀頻可由用戶調整。
在典型的回合中,戰斗管理器線程會喚醒每個機器人線程,然后等待機器人完成其回合(即再次調用阻塞API)。 該等待間隔通常為數十毫秒,即使是最復雜的機器人也往往僅以1或2毫秒的速度來使用當今典型的系統速度進行策略和計算。
這是戰斗管理器線程執行的邏輯的偽代碼:
清單3.戰斗管理器的偽代碼邏輯
while (round is not over) docall the rendering subsystem to draw robots, bullets, explosionsfor each robot dowake up the robotwait for it to make a blocking call, up to a max time intervalend forclear all robot event queuemove bullets, and generate event into robots' event queue if applicablemove robots, and generate event into robots' event queue if applicabledo battle housekeeping and generate event into robots' event queueif applicabledelay for frame rate if necessary end do請注意,在內部for循環中,戰斗管理器線程將不會等待超過最大時間間隔。 如果機器人線程未及時調用阻塞API(通常由于某些應用程序邏輯錯誤或無窮循環),它將繼續戰斗。 SkippedTurnEvent會生成到機器人的事件隊列中,以通知高級機器人。
可替換的渲染子系統
當前實現中的渲染子系統只是一個AWT和Java 2D線程,它從戰役管理器獲取命令并渲染戰場。 它已與系統的其余部分充分分離。 可以預見,可以在以后的版本中替換它(例如使用3-D渲染器)。 在當前的實現中,只要將Robocode應用程序最小化,就將禁用渲染,從而使仿真以更快的速度進行。
Robocode的未來
馬修·納爾遜是通過在alphaWorks上的Robocode站點承載的討論組的Robocode用戶社區緊密的反饋回路(參見相關主題 )。 許多反饋已合并到實際代碼中。 Mathew已計劃一些即將到來的增強功能:
- 具有不同對象和障礙物的自定義戰場地圖
 - 基于團隊的戰斗
 - 對比賽或聯賽的綜合支持
 - 用戶可選的坦克主體/槍支/雷達/武器樣式
 
Robocode勢不可擋
對于最近于2001年7月12日首次亮相的項目,Robocode的成名之舉簡直是驚人的。 盡管可用的最新版本尚未達到1.0(在撰寫本文時為0.98.2版),但它已成為全世界大學校園和公司計算機上非常流行的消遣方式。 Robocode聯盟(或roboleagues聯盟) Swift崛起 ,人們在此通過互聯網相互交流自己的定制創作。 大學教授正在利用Robocode的教育特性,并將其納入計算機科學課程中。 Robocode用戶組,討論列表,常見問題解答,教程和Webrings遍布整個Internet。
顯然,Robocode填補了流行的游戲和教育領域的空白-為學生和午夜工程師提供了一種簡單,有趣,無威脅,但具有競爭性的方式,以釋放他們的創造力,并有可能實現他們的幻想來征服世界。
翻譯自: https://www.ibm.com/developerworks/java/library/j-robocode/index.html
總結
以上是生活随笔為你收集整理的robocode_摇滚,袜子,Robocode!的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: linux --- 基础指令
 - 下一篇: python数组元素复制_python的