Robocode教程2——你的第一个robo,取个好名字哦
摘自:http://site.douban.com/widget/notes/7736245/note/210029011/
?
?你需要準(zhǔn)備的東西:
1.c語言的知識和一點(diǎn)點(diǎn)的java知識,robocode意在學(xué)習(xí)java,不要要太深的java水平,你只要理解java和c的區(qū)別就可以了。
2.robocode API,這個(gè)以后會(huì)經(jīng)常用到,幾乎不能離開,相當(dāng)于方法字典,robocode的所有方法都在里面。下載地址:http://115.com/file/e765xcsb#javadoc.zip
網(wǎng)頁版:http://robocode.sourceforge.net/docs/robocode/
好了,興趣是最好的老師,我們先拋開那些繁瑣的參數(shù)、坐標(biāo)、算法,先建立一個(gè)簡單的robo試試。
打開robocode,選擇【Robot】->【Editor】,打開editor后,選擇【new】->【Robot】,給robo取個(gè)好名字吧,比如Tiny,那是因?yàn)槲彝鎑ota游戲喜歡小小,robo也很小,可是功能卻很強(qiáng)大的。
| ? |
下面是輸入機(jī)器人的包,包是java中的一個(gè)概念,這里我們暫且把它當(dāng)成文件夾來看吧。我們就輸入自己的名字就ok了。
| ? |
下面我分別對其默認(rèn)生成的代碼進(jìn)行解釋:
package cm;
import robocode.*; //cm就是我的包,import是告訴java你要在在你的工程中使用robocode
import java.awt.Color;
public class Tiny extends Robot //告訴java,我寫的這個(gè)是一種“Robot”,叫做“Tiny”
{
????????public void run() { //run()方法是戰(zhàn)斗開始時(shí)默認(rèn)調(diào)用的,我們在這里寫自己的代碼
????????????????while(true) {
????????????????????????ahead(100);//向前100像素
????????????????????????turnGunRight(360);//把gun向右轉(zhuǎn)動(dòng)360度
????????????????????????back(100);//后退100像素
????????????????????????turnGunRight(360);//把gun向右轉(zhuǎn)動(dòng)360度
????????????????}
????????}
?/*以on開頭的方法都是事件觸發(fā)方法,熟悉單片機(jī)的同學(xué)可能知道,這相當(dāng)于單片機(jī)里面的中斷,每當(dāng)程序遇到一個(gè)觸發(fā)事件時(shí),將停止主方法的運(yùn)行而運(yùn)行觸發(fā)方法,運(yùn)行后再返回主方法。
*/
????????public void onScannedRobot(ScannedRobotEvent e) { //每當(dāng)雷達(dá)掃描到敵人
????????????????fire(1);
????????}
????????public void onHitByBullet(HitByBulletEvent e) {//每當(dāng)被子彈擊中
????????????????back(10);
????????}
????????public void onHitWall(HitWallEvent e) {//每當(dāng)撞墻
????????????????back(20);
????????}
}
package為機(jī)器人建立包“cm”,以后我這個(gè)機(jī)器人的源文件就存放在這個(gè)包里面了,然后導(dǎo)Robocode.* 這是編寫機(jī)器人必不可少的一句代碼。因?yàn)樗袡C(jī)器人都是在Robocode平臺下運(yùn)行,Robocode包為我們提供了所有編寫機(jī)器人的應(yīng)用程序接口。接下來被注釋掉的一句是導(dǎo)入java.awt.Color,當(dāng)你要為機(jī)器人設(shè)置顏色的時(shí)候:setColors(Color bodyColor,Color gunColor,ColorradarColor),它就必不可少,如果少了導(dǎo)入Color這一句,編譯是不會(huì)通過的。setColors參數(shù)有三個(gè),分別是指定車身,炮,雷達(dá)各自的顏色。public class Tiny extends Robot {...}機(jī)器人的名字是Tiny,代碼表明建立了一個(gè)公有類Tiny繼承Robot,必須建立公有的類,現(xiàn)在的Tiny是一個(gè)簡單機(jī)器人。而我們將要打造的不僅僅是繼承簡單機(jī)器
人,而是高級機(jī)器人(AdvancedRobot)。能夠高效率運(yùn)行的機(jī)器人都是繼承的AdvancedRobot,因?yàn)镽obot是線程阻塞式的,AdvancedRobot是線程非阻塞式的。他們的區(qū)別比較明顯,分析while(true){}里面的代碼來理解線程阻塞與非阻塞就比較容易了。
在Robocode中每一個(gè)機(jī)器人都是一個(gè)獨(dú)立的線程,我們知道不管是extends Thread還是implementsRunnable 都要實(shí)現(xiàn)public void run()方法,這是必不可少的。為了保證機(jī)器人不斷的運(yùn)行自己的程序,所以線程中用了while(true)循環(huán)。在每一次循環(huán)中,ahead(100)機(jī)器人向前運(yùn)動(dòng)100象素,接著turnGunRight(360) 右轉(zhuǎn)炮360度,因?yàn)闆]有使用setAdjustRadarForGunTurn(true),所以雷達(dá)會(huì)隨著炮的轉(zhuǎn)動(dòng)而同步轉(zhuǎn)動(dòng),雷達(dá)在轉(zhuǎn)動(dòng)的時(shí)候自動(dòng)掃描周圍的敵人,如果發(fā)現(xiàn)敵人,那么ScannedRobotEvent事件發(fā)生。系統(tǒng)默認(rèn)寫好的代碼只有一句:fire(1)發(fā)射能量為1的炮彈,如果敵人在炮彈到達(dá)時(shí)還在原地,恭喜!命中目標(biāo)了。接下來,機(jī)器人就會(huì)執(zhí)行back(100)后退100象素,然后turnGunRight(360)掃描敵人。繼續(xù)下一次的循環(huán)。
最后這個(gè)機(jī)器人還寫了一個(gè)事件:onHitByBullet(HitByBulletEvent e)機(jī)器人被敵人的炮彈擊中后就發(fā)生了這個(gè)事件。turnLeft(90-e.getBearing())車身左傳一個(gè)角度,這個(gè)角度的值是90-e.getBearing(),e.getBearing()是獲得炮彈與車身的相對角度,左轉(zhuǎn)后,車身的角度會(huì)與炮彈飛來的直線成直角,這樣有利于躲避下一次的炮彈攻擊。
好了,我們的第一個(gè)robo就完成了,是不是很簡單呢?只要移動(dòng),掃描,發(fā)現(xiàn)目標(biāo),fire!
選擇【compiler】->【compile】編譯就ok了。
最后進(jìn)入戰(zhàn)斗界面,新建一個(gè)戰(zhàn)斗,看看我們的Tiny是不是在里面呢?Tiny,its your show time!
| ? |
?
轉(zhuǎn)載于:https://www.cnblogs.com/KeenLeung/archive/2012/06/18/2553057.html
總結(jié)
以上是生活随笔為你收集整理的Robocode教程2——你的第一个robo,取个好名字哦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员常用字体(vs2008字体修改方案
- 下一篇: winform 分页控件分享(二)