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