用JAVA編寫自己的機器人,然后一起“廝殺” cyman20(翻譯)

發表于:2007-06-22來源:作者:點擊數: 標簽:
只是為的樂趣??Robocode(用JAVA編寫自己的機器人,然后“廝殺”) 下面這篇文章最初發表在2002年1月15日發布的Winfield Allen 軟件 開發 時事通訊(Newsletter)上,這個時事通訊是我在Winfield Allen工作期間編寫的。 什么是Robocode? 最近我在閱讀一個關于

   
  只是為的樂趣??Robocode(用JAVA編寫自己的機器人,然后“廝殺”)

下面這篇文章最初發表在2002年1月15日發布的Winfield Allen 軟件開發時事通訊(Newsletter)上,這個時事通訊是我在Winfield Allen工作期間編寫的。

什么是Robocode?

最近我在閱讀一個關于極限編程XP)的郵件列表,有人提議為對學習更多的XP方法學知識感興趣的開發人員構建一個工作間。這位作者還建議,把一群人湊到一起,分成小組研究該方法學。 然后要有一個經驗豐富的XP教練對工作間進行管理,幫助參加者理解其原理。

而建議各小組采用的項目就是創建Robocode機器人。

我停下來,把這段話重新看了一遍。 其實我對機器人一直很感興趣。在我還是個孩子是時候,我記得Aplle Ⅱ上有一個程序,我們用它來編寫簡單的機器人程序,然后相互作戰。

Robocode就是這樣一個東西,但是更好一些。它是一個基于Java的機器人作戰游戲。 其代碼的編寫和建模都不錯,玩起來也很有趣。

如果你閱讀這個時事通訊比較久的話,你可能會問你自己“他會Java嗎?”。是的,我會。雖然我常常抱怨Java,但我并非真正討厭Java這一語言。我所討厭的只是該語言與生俱來的平臺和可升級性問題。 我總認為,作為一種語言,Java是目前最優越的輕量級的C++,這種想法直到我發現C#之后才改變,而這又是另外一個故事了。

Robocode的API

Robocode是由IBM的Alphaworks項目成員Matthew Nelson編寫的。從第一個版本開始,Matthew 已對該軟件的API做了相當多的改進,我以為該軟件為機器人的編寫提供了一套完美的框架。 用于創建機器人的基類稱作Robot。你的機器人都繼承自這個類。 Robot類提供了所有與游戲進行交互所需的方法函數。

在細究API之前,讓我們先來了解一些術語。機器人基本上是一些小型的坦克。這些坦克可以旋轉,向前或向后移動。它們的頂部有一個用于射擊的火炮。在火炮上面還有一個雷達系統,用于偵測其它機器人。機器人的底盤、火炮和雷達系統都可以獨立運動,也可以相互“鎖定”,一起移動。換句話說,如果將雷達向下鎖定,那么它將隨火炮一起移動;如果火炮向下鎖定,它將隨機器人的底盤一起移動。有意思吧?

下面是一些你在編寫機器人之初用的最多的方法函數:
ahead(), back() ??向前和向后移動
fire() ??開火
setAdjustGunForRobotTurn() ?? 控制火炮是否向下鎖定
setAdjustRadarForGunTurn() ??控制雷達是否向下鎖定
turnRight(), turnLeft() ?? 實現機器人的旋轉
turnGunRight(), turnGunLeft() ?? 旋轉火炮
turnRadarLeft(), turnRadarRight() - 旋轉雷達反射鏡

當然,這并不是全部的API,但卻是你創建第一個機器人所需的最重要的方法。到現在為止,我們僅僅討論了你可以觸發的動作而已。 我們還未討論如何去發現你的機器人周圍所發生的事。Robot類提供了多個事件,你可以利用這些事件來判斷你的機器人是否用雷達掃描到了其它機器人,是否被擊中,是否與另外一個機器人向撞以及是否與墻向撞等。你可以覆蓋下列任一方法函數來為你的機器人提供事件處理函數。

onHitByBullet() ?? 當你的機器人被擊中時
onHitRobot() ??當你的機器人與其它機器人向撞時
onHitWall() ?? 當你的機器人撞到墻上時
onScannedRobot() ??當用雷達掃描到其它機器人時

通過上面談到的簡單的事件和動作,可以編寫出我們的第一個機器人。(可從Robocode附帶的文檔中獲得完整的API。)

編寫你的第一個機器人

準備好了嗎?啟動Robocode,調出Robot編輯器。(實際上,我并不使用Robocode自帶的編輯器,這里用只是為了解釋起來容易一些。)

要創建機器人,你可以選擇File菜單的New Robot命令。這時,系統會要求你輸入機器人的名稱。你可以輸入SimpleRobot并點擊OK按鈕。然后,你需要輸入一個package名,Robocode建議使用
姓名的首字母縮寫,不過我們在這里使用“newsletter”。之后,會打開一個包含新機器人初始代碼的窗口。

花一點時間閱讀一下這些自動生成的代碼。 這個機器人并非世界上最聰明的機器人,但是它卻對如何組裝一個Robocode機器人作了很好的演示。

我們的機器人中定義的第一個方法是public void run()。這是機器人的心臟所在。游戲引擎最初啟動之時將調用這個方法。一般,你可以用一個無窮的While循環來定義機器人的動作。

機器人SimpleRobot中的while循環做四件事情:

ahead(100); 向前移動100個象素
turnGunRight(360); 將火炮向右旋轉360度
back(100); 向后移動100個象素
turnGunRight(360); 將火炮向右旋轉360度

這些命令簡單的說就是“向前移動100個象素并四周查看一番,再后退100象素,四周查看一番。然后,不斷重復”。

注意我們從未明確執行一個雷達掃描動作。那是因為默認情況下,雷達反射鏡與火炮一起移動,一直處于掃描狀態中。所以,轉動火炮可以實現雷達的掃描。 當雷達偵測到目標后,會調用我們的機器人中定義的第二個方法函數public void onSannedRobot(...)。

這個事件處理函數也不做什么事情。只執行“射擊”動作。 由于雷達與火炮的方向始終保持一致,所以這個函數被調用時,我們應該正好瞄準了目標。

唯一的另一個方法是onHitByBullet事件處理函數。這個函數在我們被其它機器人擊中時調用。代碼的作用是旋轉機器人與子彈來向成90度角,這樣,當我們前后移動時,就可避開子彈第二次射來的方向。

保存并選擇compile命令編譯你的機器人。因為我們沒有對代碼做任何改動,所以應該不會有任何錯誤。

同其它機器人決斗

你的第一場戰役

你的機器人已經準備就緒,是開戰的時候了!Robocode附帶了大量可用來舉行戰斗的樣本機器人,Target是其中最簡單的一個。

假設你想在Target和我們剛才創建的機器人之間開展一場戰斗。 那么關閉Robot編輯器,在主窗口中選擇Battle菜單的New命令。 在New Battle對話框中找到“newsletter.SimpleRobot”并點擊Add按鈕。然后找到“sample.Target”,再一次點擊Add按鈕。對話框里還有其它選項,不過我們先不管。點擊finish開始戰斗。

幾秒鐘后,你將會看到兩個機器人出現在屏幕上。等待的時間主要取決于電腦的速度。很快,戰斗開始了。首先,我們的機器人向前移動一小段距離,然后將火炮旋轉一周。當它發現Target時,就會向其射擊。幾次被擊中后,Target就會避開。 我們的機器人向后移動并進行掃描,直到發現Target為止。然后繼續射擊。

Target不會射擊,所以我們將最終獲得這場戰斗的勝利(輸給不會射擊的機器人會讓我很懊惱)。也因此,我們的onHitByBullet事件應該永遠不會被調用。戰斗結束后,可以再試試與其它樣本機器人作戰。 不過別指望用這個簡單機器人把它們都打敗。

比賽

我不推薦一開始就加入比賽,但是最終你會認為,你的機器人足夠的好了,可以加入比賽了。
有大量不同的團體組織比賽。你可以在網上找到他們。如果你不喜歡參加公開的比賽,也可以找幾個朋友組織自己的比賽。

比賽的形式主要有兩種?;旌媳荣愂莾蓚€以上的機器人進行戰斗;一對一比賽就是一個機器人對付另一個機器人,就象馬上槍術比賽一樣。

通常,混合比賽戰斗多并且贏家通吃,而一對一的比賽戰斗較少,要么一方勝出,要么兩敗俱傷。

高級機器人

Robocode API還定義了另一個稱做AdvancedRobot的基類。AdvancedRobot與Robot的不同表現在許多方面。首先,你可以選擇調用無阻礙(non-blocking)運動。當你調用ahead(100)時,機器人就立即移動100個象素。該動作完成后才執行下一行代碼。這樣一來就無法實現曲線運動了。不過現在有了ahead()和back()函數的無阻礙版本-即setAhead()和setBack(),能夠立即返回執行??梢园阉鼈兿胂蟪上蚨褩@锛尤胍粭l指令,而堆棧里的指令將不會被執行,除非你進行一個類似fire()的函數調用
這將引起堆棧中的指令的執行。另外有一個叫做execute()方法函數可以明確的運行堆棧指令。

基于AdvanceRobot的機器人具有更加高級的智商。不再是簡單的“移動,掃描,再移動,再掃描”。 你做出的機器人可以對整個戰場進行偵察,會思考下一步行動,然后執行合適的指令。這種“偵察、思考、行動”的模式能夠使你的機器人具有適應性和學習性。

舉個例子來說,如果你的機器人能連續不斷的偵察整個戰場并記錄其它機器人的位置和方向,那么你就可以通過模式分析來獲得某個特定機器人的移動方式。如果敵方以可預知的方式向左或向右躲避的話,那么你就可以對此進行預測,向敵人將要出現的地方射擊。這樣威力會更加強大,當然也更加復雜。

結論

這篇文章還運不足以成為如何編寫最優機器人的完全指南,但是應該能幫助你入門。當你寫了幾個簡單的機器人后,就會找到一些新的感覺。也許你會參加比賽,或者從互聯網上下載其它的機器人。這樣,你就有機會看到別人是如何編寫機器人的。

Robocode不僅是一個游戲,也是一個有趣的磨練編程技巧的方法。你可以實驗不同的設計和模式,可以用JUnit創建測試包。實際上,這個游戲的限制只在于你的想象力。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97