亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3288 | 回復(fù): 6
打印 上一主題 下一主題

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺” [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2002-09-10 08:10 |只看該作者 |倒序?yàn)g覽
用JAVA編寫自己的機(jī)器人,然后一起“廝殺”    cyman20(翻譯)
  
關(guān)鍵字     java robocode
  
出處     http://www22.brinkster.com/cymanhome/robocode.htm
  


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

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

什么是Robocode?

最近我在閱讀一個(gè)關(guān)于極限編程(XP)的郵件列表,有人提議為對(duì)學(xué)習(xí)更多的XP方法學(xué)知識(shí)感興趣的開(kāi)發(fā)人員構(gòu)建一個(gè)工作間。這位作者還建議,把一群人湊到一起,分成小組研究該方法學(xué)。 然后要有一個(gè)經(jīng)驗(yàn)豐富的XP教練對(duì)工作間進(jìn)行管理,幫助參加者理解其原理。

而建議各小組采用的項(xiàng)目就是創(chuàng)建Robocode機(jī)器人。

我停下來(lái),把這段話重新看了一遍。 其實(shí)我對(duì)機(jī)器人一直很感興趣。在我還是個(gè)孩子是時(shí)候,我記得Aplle Ⅱ上有一個(gè)程序,我們用它來(lái)編寫簡(jiǎn)單的機(jī)器人程序,然后相互作戰(zhàn)。

Robocode就是這樣一個(gè)東西,但是更好一些。它是一個(gè)基于Java的機(jī)器人作戰(zhàn)游戲。 其代碼的編寫和建模都不錯(cuò),玩起來(lái)也很有趣。

如果你閱讀這個(gè)時(shí)事通訊比較久的話,你可能會(huì)問(wèn)你自己“他會(huì)Java嗎?”。是的,我會(huì)。雖然我常常抱怨Java,但我并非真正討厭Java這一語(yǔ)言。我所討厭的只是該語(yǔ)言與生俱來(lái)的平臺(tái)和可升級(jí)性問(wèn)題。 我總認(rèn)為,作為一種語(yǔ)言,Java是目前最優(yōu)越的輕量級(jí)的C++,這種想法直到我發(fā)現(xiàn)C#之后才改變,而這又是另外一個(gè)故事了。


Robocode的API

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

在細(xì)究API之前,讓我們先來(lái)了解一些術(shù)語(yǔ)。機(jī)器人基本上是一些小型的坦克。這些坦克可以旋轉(zhuǎn),向前或向后移動(dòng)。它們的頂部有一個(gè)用于射擊的火炮。在火炮上面還有一個(gè)雷達(dá)系統(tǒng),用于偵測(cè)其它機(jī)器人。機(jī)器人的底盤、火炮和雷達(dá)系統(tǒng)都可以獨(dú)立運(yùn)動(dòng),也可以相互“鎖定”,一起移動(dòng)。換句話說(shuō),如果將雷達(dá)向下鎖定,那么它將隨火炮一起移動(dòng);如果火炮向下鎖定,它將隨機(jī)器人的底盤一起移動(dòng)。有意思吧?

下面是一些你在編寫機(jī)器人之初用的最多的方法函數(shù):
ahead(), back() ——向前和向后移動(dòng)
fire() ——開(kāi)火
setAdjustGunForRobotTurn() —— 控制火炮是否向下鎖定
setAdjustRadarForGunTurn() ——控制雷達(dá)是否向下鎖定   
turnRight(), turnLeft() —— 實(shí)現(xiàn)機(jī)器人的旋轉(zhuǎn)
turnGunRight(), turnGunLeft() —— 旋轉(zhuǎn)火炮
turnRadarLeft(), turnRadarRight() - 旋轉(zhuǎn)雷達(dá)反射鏡

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

onHitByBullet() —— 當(dāng)你的機(jī)器人被擊中時(shí)
onHitRobot() ——當(dāng)你的機(jī)器人與其它機(jī)器人向撞時(shí)
onHitWall() —— 當(dāng)你的機(jī)器人撞到墻上時(shí)
onScannedRobot() ——當(dāng)用雷達(dá)掃描到其它機(jī)器人時(shí)

通過(guò)上面談到的簡(jiǎn)單的事件和動(dòng)作,可以編寫出我們的第一個(gè)機(jī)器人。(可從Robocode附帶的文檔中獲得完整的API。)


編寫你的第一個(gè)機(jī)器人

準(zhǔn)備好了嗎?啟動(dòng)Robocode,調(diào)出Robot編輯器。(實(shí)際上,我并不使用Robocode自帶的編輯器,這里用只是為了解釋起來(lái)容易一些。)

要?jiǎng)?chuàng)建機(jī)器人,你可以選擇File菜單的New Robot命令。這時(shí),系統(tǒng)會(huì)要求你輸入機(jī)器人的名稱。你可以輸入SimpleRobot并點(diǎn)擊OK按鈕。然后,你需要輸入一個(gè)package名,Robocode建議使用
姓名的首字母縮寫,不過(guò)我們?cè)谶@里使用“newsletter”。之后,會(huì)打開(kāi)一個(gè)包含新機(jī)器人初始代碼的窗口。

花一點(diǎn)時(shí)間閱讀一下這些自動(dòng)生成的代碼。 這個(gè)機(jī)器人并非世界上最聰明的機(jī)器人,但是它卻對(duì)如何組裝一個(gè)Robocode機(jī)器人作了很好的演示。

我們的機(jī)器人中定義的第一個(gè)方法是public void run()。這是機(jī)器人的心臟所在。游戲引擎最初啟動(dòng)之時(shí)將調(diào)用這個(gè)方法。一般,你可以用一個(gè)無(wú)窮的While循環(huán)來(lái)定義機(jī)器人的動(dòng)作。

機(jī)器人SimpleRobot中的while循環(huán)做四件事情:

ahead(100)&#59; 向前移動(dòng)100個(gè)象素
turnGunRight(360)&#59; 將火炮向右旋轉(zhuǎn)360度
back(100)&#59; 向后移動(dòng)100個(gè)象素
turnGunRight(360)&#59; 將火炮向右旋轉(zhuǎn)360度

這些命令簡(jiǎn)單的說(shuō)就是“向前移動(dòng)100個(gè)象素并四周查看一番,再后退100象素,四周查看一番。然后,不斷重復(fù)”。

注意我們從未明確執(zhí)行一個(gè)雷達(dá)掃描動(dòng)作。那是因?yàn)槟J(rèn)情況下,雷達(dá)反射鏡與火炮一起移動(dòng),一直處于掃描狀態(tài)中。所以,轉(zhuǎn)動(dòng)火炮可以實(shí)現(xiàn)雷達(dá)的掃描。 當(dāng)雷達(dá)偵測(cè)到目標(biāo)后,會(huì)調(diào)用我們的機(jī)器人中定義的第二個(gè)方法函數(shù)public void onSannedRobot(...)。

這個(gè)事件處理函數(shù)也不做什么事情。只執(zhí)行“射擊”動(dòng)作。 由于雷達(dá)與火炮的方向始終保持一致,所以這個(gè)函數(shù)被調(diào)用時(shí),我們應(yīng)該正好瞄準(zhǔn)了目標(biāo)。

唯一的另一個(gè)方法是onHitByBullet事件處理函數(shù)。這個(gè)函數(shù)在我們被其它機(jī)器人擊中時(shí)調(diào)用。代碼的作用是旋轉(zhuǎn)機(jī)器人與子彈來(lái)向成90度角,這樣,當(dāng)我們前后移動(dòng)時(shí),就可避開(kāi)子彈第二次射來(lái)的方向。

保存并選擇compile命令編譯你的機(jī)器人。因?yàn)槲覀儧](méi)有對(duì)代碼做任何改動(dòng),所以應(yīng)該不會(huì)有任何錯(cuò)誤。


同其它機(jī)器人決斗

你的第一場(chǎng)戰(zhàn)役

你的機(jī)器人已經(jīng)準(zhǔn)備就緒,是開(kāi)戰(zhàn)的時(shí)候了!Robocode附帶了大量可用來(lái)舉行戰(zhàn)斗的樣本機(jī)器人,Target是其中最簡(jiǎn)單的一個(gè)。

假設(shè)你想在Target和我們剛才創(chuàng)建的機(jī)器人之間開(kāi)展一場(chǎng)戰(zhàn)斗。 那么關(guān)閉Robot編輯器,在主窗口中選擇Battle菜單的New命令。 在New Battle對(duì)話框中找到“newsletter.SimpleRobot”并點(diǎn)擊Add按鈕。然后找到“sample.Target”,再一次點(diǎn)擊Add按鈕。對(duì)話框里還有其它選項(xiàng),不過(guò)我們先不管。點(diǎn)擊finish開(kāi)始戰(zhàn)斗。

幾秒鐘后,你將會(huì)看到兩個(gè)機(jī)器人出現(xiàn)在屏幕上。等待的時(shí)間主要取決于電腦的速度。很快,戰(zhàn)斗開(kāi)始了。首先,我們的機(jī)器人向前移動(dòng)一小段距離,然后將火炮旋轉(zhuǎn)一周。當(dāng)它發(fā)現(xiàn)Target時(shí),就會(huì)向其射擊。幾次被擊中后,Target就會(huì)避開(kāi)。 我們的機(jī)器人向后移動(dòng)并進(jìn)行掃描,直到發(fā)現(xiàn)Target為止。然后繼續(xù)射擊。

Target不會(huì)射擊,所以我們將最終獲得這場(chǎng)戰(zhàn)斗的勝利(輸給不會(huì)射擊的機(jī)器人會(huì)讓我很懊惱)。也因此,我們的onHitByBullet事件應(yīng)該永遠(yuǎn)不會(huì)被調(diào)用。戰(zhàn)斗結(jié)束后,可以再試試與其它樣本機(jī)器人作戰(zhàn)。 不過(guò)別指望用這個(gè)簡(jiǎn)單機(jī)器人把它們都打敗。

比賽

我不推薦一開(kāi)始就加入比賽,但是最終你會(huì)認(rèn)為,你的機(jī)器人足夠的好了,可以加入比賽了。
有大量不同的團(tuán)體組織比賽。你可以在網(wǎng)上找到他們。如果你不喜歡參加公開(kāi)的比賽,也可以找?guī)讉(gè)朋友組織自己的比賽。

比賽的形式主要有兩種。混合比賽是兩個(gè)以上的機(jī)器人進(jìn)行戰(zhàn)斗;一對(duì)一比賽就是一個(gè)機(jī)器人對(duì)付另一個(gè)機(jī)器人,就象馬上槍術(shù)比賽一樣。

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


高級(jí)機(jī)器人

Robocode API還定義了另一個(gè)稱做AdvancedRobot的基類。AdvancedRobot與Robot的不同表現(xiàn)在許多方面。首先,你可以選擇調(diào)用無(wú)阻礙(non-blocking)運(yùn)動(dòng)。當(dāng)你調(diào)用ahead(100)時(shí),機(jī)器人就立即移動(dòng)100個(gè)象素。該動(dòng)作完成后才執(zhí)行下一行代碼。這樣一來(lái)就無(wú)法實(shí)現(xiàn)曲線運(yùn)動(dòng)了。不過(guò)現(xiàn)在有了ahead()和back()函數(shù)的無(wú)阻礙版本——即setAhead()和setBack(),能夠立即返回執(zhí)行。可以把它們想象成向堆棧里加入一條指令,而堆棧里的指令將不會(huì)被執(zhí)行,除非你進(jìn)行一個(gè)類似fire()的函數(shù)調(diào)用
——這將引起堆棧中的指令的執(zhí)行。另外有一個(gè)叫做execute()方法函數(shù)可以明確的運(yùn)行堆棧指令。

基于AdvanceRobot的機(jī)器人具有更加高級(jí)的智商。不再是簡(jiǎn)單的“移動(dòng),掃描,再移動(dòng),再掃描”。 你做出的機(jī)器人可以對(duì)整個(gè)戰(zhàn)場(chǎng)進(jìn)行偵察,會(huì)思考下一步行動(dòng),然后執(zhí)行合適的指令。這種“偵察、思考、行動(dòng)”的模式能夠使你的機(jī)器人具有適應(yīng)性和學(xué)習(xí)性。

舉個(gè)例子來(lái)說(shuō),如果你的機(jī)器人能連續(xù)不斷的偵察整個(gè)戰(zhàn)場(chǎng)并記錄其它機(jī)器人的位置和方向,那么你就可以通過(guò)模式分析來(lái)獲得某個(gè)特定機(jī)器人的移動(dòng)方式。如果敵方以可預(yù)知的方式向左或向右躲避的話,那么你就可以對(duì)此進(jìn)行預(yù)測(cè),向敵人將要出現(xiàn)的地方射擊。這樣威力會(huì)更加強(qiáng)大,當(dāng)然也更加復(fù)雜。


結(jié)論

這篇文章還運(yùn)不足以成為如何編寫最優(yōu)機(jī)器人的完全指南,但是應(yīng)該能幫助你入門。當(dāng)你寫了幾個(gè)簡(jiǎn)單的機(jī)器人后,就會(huì)找到一些新的感覺(jué)。也許你會(huì)參加比賽,或者從互聯(lián)網(wǎng)上下載其它的機(jī)器人。這樣,你就有機(jī)會(huì)看到別人是如何編寫機(jī)器人的。

Robocode不僅是一個(gè)游戲,也是一個(gè)有趣的磨練編程技巧的方法。你可以實(shí)驗(yàn)不同的設(shè)計(jì)和模式,可以用JUnit創(chuàng)建測(cè)試包。實(shí)際上,這個(gè)游戲的限制只在于你的想象力。

我只有一個(gè)要求:如果因?yàn)橥鍾obocode而不工作,與你的老板鬧僵了的話,可別怪我。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2002-09-10 08:38 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

我都看了,但是還是不知道怎么編寫這個(gè)機(jī)器人。只是知道了一些接口函數(shù)而已。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2002-09-10 08:43 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

本來(lái)就只是個(gè)指導(dǎo)性的文章,說(shuō)明大概的幾個(gè)編程思想之關(guān)鍵點(diǎn)

如果源程序出來(lái),那代碼長(zhǎng)的程度恐怕得分近十篇貼吧

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2002-09-10 08:48 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

他說(shuō)的就是一個(gè)框架而已,就是要你去實(shí)現(xiàn)的,在實(shí)現(xiàn)中學(xué)習(xí),提高。。。

當(dāng)你寫了幾個(gè)簡(jiǎn)單的機(jī)器人后,就會(huì)找到一些新的感覺(jué)。也許你會(huì)參加比賽,或者從互聯(lián)網(wǎng)上下載其它的機(jī)器人。這樣,你就有機(jī)會(huì)看到別人是如何編寫機(jī)器人的。

有意思,有空俺也寫一個(gè)玩玩。。。:)

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
5 [報(bào)告]
發(fā)表于 2002-09-10 22:32 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

[這個(gè)貼子最后由阿驍在 2002/09/10 10:50pm 編輯]

呵呵 。。   我裝了一個(gè),界面很漂亮,小坦克也很有意思!
^_^  我編譯了一只我自己的robot,很有意思耶。m然只有最基本的功能)
    

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
6 [報(bào)告]
發(fā)表于 2002-09-10 22:57 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

這里好像是官方網(wǎng)站,能指導(dǎo)你建立一個(gè)最簡(jiǎn)單的小坦克。
http://robocode.alphaworks.ibm.com/home/home.html

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2002-11-11 12:29 |只看該作者

[zt]用JAVA編寫自己的機(jī)器人,然后一起“廝殺”

請(qǐng)?jiān)L問(wèn)Robocode 中華聯(lián)盟(www.robochina.org)網(wǎng)站,它是國(guó)內(nèi)一個(gè)新生的Robocode組織。其內(nèi)有大量關(guān)于Robocode機(jī)器人的原創(chuàng)及翻譯文檔,負(fù)責(zé)有關(guān)中華區(qū)機(jī)器人賽事的組織事宜。是現(xiàn)今為此中華區(qū)最大 ,增長(zhǎng)最快的Robocode站點(diǎn)。本文轉(zhuǎn)載自IBM,所以權(quán)力屬于IBM.如果 您認(rèn)為Robocode好,請(qǐng)把此文轉(zhuǎn)給您的朋友,幫我們宣傳,并附上我們的網(wǎng)站信息。我們應(yīng)該為我們的程序事業(yè),軟件事業(yè),教育事業(yè)做點(diǎn)什么了? 有了您的目光,我們前進(jìn)更精彩!(本月聯(lián)盟有機(jī)器人編程內(nèi)部賽,歡迎參加!)
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP