版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)與信息工程系 高級(jí)語言程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告學(xué)號(hào)2013-2014學(xué)年 第二學(xué)期1008210138高級(jí)語言程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告題目:自主模式匹配攻擊雙坦克運(yùn)動(dòng)規(guī)劃程序設(shè)計(jì)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):10級(jí)(2)班姓名:項(xiàng)瑩瑩學(xué)號(hào):1008210138指導(dǎo)教師:王源成績(jī):計(jì)算機(jī)與信息工程系2014年5月24日目 錄1.緒論32. 開發(fā)環(huán)境介紹33.課程設(shè)計(jì)的目的與要求43.1 課程設(shè)計(jì)目的43.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境43.3 課程設(shè)計(jì)的預(yù)備知識(shí)43.4 課程設(shè)計(jì)主要內(nèi)容44.系統(tǒng)分析54.1可行性分析54.1.1技術(shù)可行性54.1.2經(jīng)濟(jì)可行性54.2需求分析55課程設(shè)計(jì)內(nèi)容65.1程序具
2、體設(shè)計(jì)65.2 主要方法、變量和函數(shù)95.3游戲主窗口105.3.1游戲數(shù)據(jù)的輸入以及運(yùn)行115.3.2游戲數(shù)據(jù)的輸出以及保存136.設(shè)計(jì)體會(huì)與小結(jié)147.參考文獻(xiàn)148.源程序141 1.緒論Java是一種簡(jiǎn)單的,跨平臺(tái)的,面向?qū)ο蟮?,分布式的,解釋的,健壯的安全的,結(jié)構(gòu)的中立的,可移植的,性能很優(yōu)異的多線程的,動(dòng)態(tài)的語言。當(dāng)1995年SUN推出Java語言之后,全世界的目光都被這個(gè)神奇的語言所吸引。Java是一個(gè)純的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,它繼承了 C+ 語言面向?qū)ο蠹夹g(shù)的核心,Java舍棄了C +語言中容易引起錯(cuò)誤的指針(以引用取代)、運(yùn)算符重載(operator overloading
3、)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對(duì)象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。Java 不同于一般的編譯執(zhí)行計(jì)算機(jī)語言和解釋執(zhí)行計(jì)算機(jī)語言。它首先將源代碼編譯成二進(jìn)制字節(jié)碼(bytecode),然后依賴各種不同平臺(tái)上的虛擬機(jī)來解釋執(zhí)行字節(jié)碼,從而實(shí)現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺(tái)特性。目前,Java語言不僅是一門被廣泛使用的編程語言,而且已成為軟件設(shè)計(jì)開發(fā)者應(yīng)當(dāng)掌握的一門基礎(chǔ)語言。因?yàn)楹芏嘈碌募夹g(shù)領(lǐng)域都涉及到Java語言,國內(nèi)外許多大學(xué)已將Java語言列入本科教學(xué)計(jì)劃,而IT行業(yè)對(duì)Java人才的需求也在不斷的增長,因此,掌握J(rèn)ava已經(jīng)成為
4、共識(shí)。2. 開發(fā)環(huán)境介紹Robocode 是2001年7月在美國IBM 的Web 站點(diǎn)alphaWorks 上公開的機(jī)器人(其圖形為坦克的形狀) 戰(zhàn)斗仿真引擎。與通常玩的游戲不同的是:你必須利用Java 對(duì)機(jī)器人動(dòng)作進(jìn)行編程,給機(jī)器人設(shè)計(jì)的智能來自動(dòng)指揮它, 而不是由鍵盤鼠標(biāo)來控制它。不管你是初學(xué)者還是頂級(jí)程序員,你都可在Robocode 的世界中找到旗鼓相當(dāng)?shù)膶?duì)手。把你寫的機(jī)器人放到戰(zhàn)場(chǎng)中,在與別人編寫的機(jī)器人的戰(zhàn)斗中考驗(yàn)自己的編程水平。在不斷的完善過程中你將體會(huì)到學(xué)習(xí)所帶來的無窮樂趣。當(dāng)你的機(jī)器人融入了你的思想你將會(huì)發(fā)現(xiàn)你已經(jīng)打開了Java編程甚至任何編程語言的大門。由于Robocode
5、是基于Java 而產(chǎn)生的軟件,所以它也具備了Java“一處編寫,到處運(yùn)行”的特點(diǎn)。Robocode 這個(gè)游戲?yàn)槿澜绲腏ava 開發(fā)者實(shí)現(xiàn)這個(gè)愿望,它把游戲風(fēng)潮變成了教學(xué)工具,Robocode的小東西有著巨大的能量,Robocode 是一個(gè)比較上癮的游戲,人們對(duì)它的上癮程度令人吃驚。戰(zhàn)場(chǎng)是機(jī)器人之間進(jìn)行戰(zhàn)斗直至分出勝負(fù)的場(chǎng)地。主要的仿真引擎被置于其中,并且允許您在這里創(chuàng)建戰(zhàn)斗、保存戰(zhàn)斗以及打開新建的或現(xiàn)有的戰(zhàn)斗。通過界面區(qū)域內(nèi)的控件,您可以暫?;蚶^續(xù)戰(zhàn)斗、終止戰(zhàn)斗、消滅任何機(jī)器人個(gè)體或獲取任何機(jī)器人的統(tǒng)計(jì)數(shù)據(jù)。圖2中三個(gè)機(jī)器人活動(dòng)的地方就是戰(zhàn)場(chǎng)。此外,在編譯器界面下您可以通過菜單調(diào)用Robot
6、 Editor,它是Robocode本身自帶的Java 語言編輯器,這個(gè)編輯器是發(fā)揮你創(chuàng)意的所在。它可以用于編輯生成機(jī)器人的 Java 源文件。3.課程設(shè)計(jì)的目的與要求3.1 課程設(shè)計(jì)目的JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的必修專業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專題實(shí)際是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生學(xué)習(xí)完JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)課程后,進(jìn)行的一次全面的綜合訓(xùn)練,JAVA程序設(shè)計(jì)的設(shè)計(jì)目的是加深對(duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生綜合運(yùn)用所學(xué)知識(shí),利用軟件工程為基礎(chǔ)進(jìn)行軟件開發(fā)、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。3.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境JAV
7、A程序設(shè)計(jì)語言及相應(yīng)的集成開發(fā)環(huán)境,J2SDK和Robocode開發(fā)工具。3.3 課程設(shè)計(jì)的預(yù)備知識(shí)熟悉JAVA語言以及Robocode軟件。3.4 課程設(shè)計(jì)主要內(nèi)容坦克大戰(zhàn)游戲是在Robocode環(huán)境下編程的游戲,其中包括對(duì)坦克移動(dòng)策略的編寫、坦克射擊策略的編寫、坦克模式匹配策略的編寫、構(gòu)造函數(shù)的編寫等等。游戲主要實(shí)現(xiàn)的功能有:(1).坦克可以隨機(jī)移動(dòng);(2)坦克可以根據(jù)模式匹配策略射擊敵方坦克;(3).坦克可以按照一定的策略的發(fā)子彈;(4).我方坦克打敗敵方坦克時(shí),會(huì)顯示爆炸效果并消失;(5).我方坦克被擊中后,會(huì)顯示爆炸效果;4.系統(tǒng)分析.4.1可行性分析4.1.1技術(shù)可行性Roboco
8、de軟件使用面向?qū)ο笤O(shè)計(jì)語言JAVA技術(shù)實(shí)現(xiàn),這已是非常成熟的技術(shù),之前已有相當(dāng)多使用這些技術(shù)的成功案例,故現(xiàn)使用這些技術(shù)是可行的。Robocode軟件為你處理好一切細(xì)節(jié)。你所做就是為你的機(jī)器人坦克編寫智能程序,讓它能夠移動(dòng)、進(jìn)攻、防御、躲避、開火。而它的對(duì)手就是跟你一樣其他程序員編寫機(jī)器人程序。這就是Robocode魅力所在,最簡(jiǎn)單,只用幾十行代碼,就能立刻創(chuàng)造出一個(gè)簡(jiǎn)單但完整機(jī)器人,你可以立即將它裝入Robocode 引擎中,再從Robocode 自帶的那些水平不一的示例機(jī)器人中選取一個(gè)進(jìn)行一番對(duì)戰(zhàn)。你可以不停的修改你的程序,設(shè)計(jì)新射擊模型、躲避模型、移動(dòng)模型,當(dāng)你打敗了那些示例機(jī)器人,你
9、還可以在網(wǎng)上下載由其他程序員編寫的水平更高的機(jī)器人,與它們比試一下,看看自己的水平到底如何。開發(fā)Robocode,也是一個(gè)極佳的學(xué)習(xí)Java 語言的過程。對(duì)于初學(xué)者來說,這是學(xué)習(xí)各種基本語法好途徑:類,方法,事件處理等等。當(dāng)你入門之后,需要進(jìn)一步提高機(jī)器人的“智力”水平,就需要使用更好的策略:如何預(yù)測(cè)對(duì)手的行動(dòng)路線,如何躲避對(duì)手的攻擊.你不得不創(chuàng)建更多類來應(yīng)對(duì)更多情況,你將學(xué)習(xí)使用接口、繼承等等Java 高級(jí)語言特性。隨著你的機(jī)器人的“智力”水平的提高,你的編程能力也就跟著水漲船高了。4.1.2經(jīng)濟(jì)可行性本軟件為免費(fèi)軟件,將免費(fèi)提供軟件的下載、運(yùn)行和維護(hù)服務(wù),軟件暫無收入,待公布之后隨著使用者
10、越來越多,將添加相應(yīng)的廣告、服務(wù),從而增加收入,若使用者寥 寥無幾,將再次分析是否重新策劃軟件或者放棄開發(fā),以減少損失。硬件要求也比較低,系統(tǒng)安裝最小環(huán)境要求:CPU:Pentium2/400MHz 以上內(nèi)存:64MB 以上硬盤:10M 以上4.2需求分析利用Robocode軟件的編譯器,將所有游戲的元素都在此界面上表現(xiàn)出來。界面中包含我方坦克、敵人坦克、雙方坦克的生命值、比賽的速度、比賽的回合等。坦克:坦克分為兩種:我方坦克和敵方坦克。我方和敵方坦克均可以發(fā)射子彈,可以改變路徑的行走,且在行走過程中遇到墻等阻礙物和游戲邊界時(shí)要改變方向,而不能一直頂著障礙物不放,這些都可以在程序中設(shè)計(jì)。坦克之
11、間不能穿越,碰撞到后自動(dòng)調(diào)換方向。墻:游戲中的邊界王家的坦克和敵人的坦克都不能越過,坦克的子彈也不能穿過。我方的坦克要滿足離墻不能太近,而且如果要過去這一點(diǎn),我需要的用方向要滿足不能和當(dāng)前正在運(yùn)動(dòng)的方向相差太少,意思就是說,方向要變多些,不能看起來跟沒改變差不多,也不能向著敵人沖過去。運(yùn)動(dòng)方式:隨機(jī)運(yùn)動(dòng),這種運(yùn)動(dòng)方式主要用來混亂敵人的預(yù)測(cè)。爆炸:當(dāng)子彈射擊到對(duì)方坦克身上時(shí),要產(chǎn)生爆炸效果。子彈:子彈可以由敵方和用戶方發(fā)射,且發(fā)射出去的子彈可以根據(jù)雷達(dá)覺察到敵人時(shí)有所動(dòng)作。機(jī)器人保持與敵人成30度傾向角。自身成 90 度角靜止并逐漸接近目標(biāo)。如果機(jī)器人覺察到能量下降介于 0.1 和 3.0 之間
12、(火力范圍),那么機(jī)器人就立即切換方向,向左或向右移動(dòng)。直到碰到障礙物就消失。敵方坦克受到子彈多次攻擊后會(huì)爆炸從而導(dǎo)致死亡,死亡后坦克消失。我方受到子彈攻擊后會(huì)減少壽命,此時(shí)如還有敵方坦克存在,則我方輸?shù)舯敬斡螒?。?zhàn)場(chǎng):戰(zhàn)場(chǎng)是機(jī)器人之間進(jìn)行戰(zhàn)斗直至分出勝負(fù)的場(chǎng)地。主要的仿真引擎被置于其中,并且允許您在這里創(chuàng)建戰(zhàn)斗、保存戰(zhàn)斗以及打開新建的或現(xiàn)有的戰(zhàn)斗。通過界面區(qū)域內(nèi)的控件,您可以暫停或繼續(xù)戰(zhàn)斗、終止戰(zhàn)斗、消滅任何機(jī)器人個(gè)體或獲取任何機(jī)器人的統(tǒng)計(jì)數(shù)據(jù)。getBattleFieldWidth()和getBattleFieldHeight()可以得到當(dāng)前這一回合的戰(zhàn)場(chǎng)尺寸。射擊策略:射擊策略主要思路是
13、用一個(gè)800長度的數(shù)組來紀(jì)錄一個(gè)直線提前量每個(gè)記錄點(diǎn)都記錄從自己子彈到敵人這段時(shí)間(子彈假定能量為3,敵人假定為不動(dòng),雖然這樣不精確,但是也只能這樣,你知道敵人怎樣動(dòng)?如果知道你還計(jì)算啥?)。 需要射擊時(shí),尋找一個(gè)歷史中(所有以前的記錄節(jié)點(diǎn)中)完成了累加的,而且與目前的預(yù)測(cè)角度值最相似的記錄節(jié)點(diǎn)(也就是以預(yù)測(cè)角度值最相似就視為運(yùn)動(dòng)方式最相似),那么,敵人以后的運(yùn)動(dòng)因該和歷史中的那段運(yùn)動(dòng)情況很相似(也就是歷史重現(xiàn))。找到了歷史要重現(xiàn)的地方了,那么用那段歷史中的平均預(yù)測(cè)角度值作為射擊角度射擊,這種射擊方式就是尋找歷史中和你現(xiàn)在運(yùn)動(dòng)相似的情況,所以如果我方坦克的運(yùn)動(dòng)有規(guī)律的話,敵方坦克能很好的找出我
14、方坦克下一步會(huì)怎樣走,那么,我方坦克被命中的幾率就很大,這也正是采用隨機(jī)運(yùn)動(dòng)的原因。5課程設(shè)計(jì)內(nèi)容5.1 程序中的主要方法、變量和函數(shù)getX( ) , getY( )捕捉機(jī)器人的坐標(biāo)setMaxVelocity( )設(shè)置機(jī)器人最大的運(yùn)動(dòng)速度setAhead( )讓機(jī)器人向前移動(dòng)一定距離setTurnRightRadians( )向右隨機(jī)的旋轉(zhuǎn)機(jī)器人setTurnGunRightRadians( )向右隨機(jī)的旋轉(zhuǎn)火炮setTurnRadarRightRadians( )向右隨機(jī)的旋轉(zhuǎn)雷達(dá)反射鏡setBodyColor( )設(shè)置車身的顏色setGunColor( )設(shè)置炮管的顏色setRadar
15、Color( )設(shè)置雷達(dá)的顏色setBulletColor( )設(shè)置子彈的顏色setAdjustGunForRobotTurn()控制火炮是否向下鎖定setAdjustRadarForGunTurn()控制雷達(dá)是否向下鎖定double firePower設(shè)置坦克火力的大小double linearPredictionAngle計(jì)算需要射擊的角度double distToWall檢查坦克離墻壁的最短距離static double pattern存儲(chǔ)所有關(guān)于敵人的信息 public void run()坦克運(yùn)動(dòng)函數(shù)public double angle_180( double ang )設(shè)置坦克的
16、轉(zhuǎn)動(dòng)角度的函數(shù)5.2程序具體設(shè)計(jì)因?yàn)镽obocode軟件自帶圖形用戶界面的游戲窗口,所以就不需要另外設(shè)計(jì)游戲窗口了。游戲的運(yùn)行也是自動(dòng)完成的,只需要在游戲開始前設(shè)置下游戲的速度即可,也可以在游戲運(yùn)行時(shí)通過窗口下方的速度標(biāo)尺來自行調(diào)整。Robocode平臺(tái)的坐標(biāo)系統(tǒng)和我們數(shù)學(xué)書中的坐標(biāo)系統(tǒng)有較大區(qū)別,首先要搞清楚幾個(gè)概念:1、【坐標(biāo)系】:Robocode整個(gè)坐標(biāo)系都是戰(zhàn)場(chǎng)屏幕以左下角為原點(diǎn)。getX()和getY()可以捕捉到機(jī)器人當(dāng)前所在戰(zhàn)場(chǎng)中的坐標(biāo)。2、【絕對(duì)方向系】:Robocode中不管機(jī)器人在哪個(gè)方向都是以靜態(tài)戰(zhàn)場(chǎng)屏幕為參照物的絕對(duì)角度(Heading),正上方為0 度角。即是向北為0
17、,向東為90,向南為180,向西為270。3、【相對(duì)方向系】:相對(duì)方向是以機(jī)器人的動(dòng)態(tài)heading角度為參照物的角度差,不再以整個(gè)靜態(tài)屏幕為參照了。叫它相對(duì)是因?yàn)闄C(jī)器人的heading 是隨著機(jī)器人移動(dòng)而不停的在改變,heading 只是個(gè)相對(duì)物體。4、【Heading】:是機(jī)器人方向與屏幕正上方的角度差,方向在0 到360 之間。getHeading()、getGunHeading()和getRadarHeading()分別可以得出坦克車、炮或雷達(dá)當(dāng)前的方向,該方向是以角度表示的。5、【Bearing】:是機(jī)器人的某個(gè)部件如雷達(dá)發(fā)現(xiàn)的目標(biāo)與方向的角度差,順時(shí)針為正角度在- 180 到180
18、 之間。大家都知道,坦克有很多種,但是每一種坦克都離不開三個(gè)部分,車身,炮,雷達(dá)。Robocode中的機(jī)器人也有這三個(gè)部件。車身是一個(gè)比較笨重的部分,它的基本操作有:turnLeft(double degree)和turnRight(double degree)分別是使機(jī)器人(左右)轉(zhuǎn)過一個(gè)指定的角度。在AdvancedRobot 坦克中可以使用setTurnRightRadians(double degree)函數(shù)使機(jī)器人轉(zhuǎn)過一定的弧度。 setAhead(double distance)和setBack(double distance)分別是使機(jī)器人(前后)移動(dòng)指定的像素點(diǎn)距離;這兩個(gè)方法
19、在機(jī)器人碰到墻或碰到另外一個(gè)機(jī)器人時(shí)即告完成。本設(shè)計(jì)中的設(shè)置車身的參數(shù)如下:double ourX = getX(); double ourY = getY(); double testX = Math.random() * getBattleFieldWidth(); double testY = Math.random() * getBattleFieldHeight();setTurnRightRadians( angle_180( turnAngle ) ); setAhead( moveDirection * Point2D.Double.distance( ourX , ourY
20、, testX , testY ) );炮是用來發(fā)射炮彈攻擊敵人的武器,它的基本操作有:TurnGunLeft(double degree) 和TurnGunRight(double degree)分別是使炮可以獨(dú)立于坦克車的方向(左右)轉(zhuǎn)動(dòng)指定的角度。在AdvancedRobot 坦克中,通過設(shè)置setTurnGunRightRadians(double degree)函數(shù)來讓炮按一定的弧度轉(zhuǎn)動(dòng)。利用setFire(double power)發(fā)射指定能量的炮彈。本設(shè)計(jì)中的設(shè)置炮的參數(shù)如下:setTurnGunRightRadians( angle_180( targetBearing - g
21、etGunHeadingRadians() + linearPredictionAngle ) ); double firePower = Math.min( 3 , 30 * getEnergy() / e.getDistance() ); if ( getEnergy() > Math.min( e.getEnergy() + firePower + 0.1 , 3.1 ) ) setFire( firePower );雷達(dá)是機(jī)器人取得敵人信息的主要器官,它的基本操作有:turnRadarLeft(double degree)和turnRadarRight(double degree
22、)分別是使炮上面的雷達(dá)(左右)轉(zhuǎn)動(dòng)指定的角度,轉(zhuǎn)動(dòng)的方向也獨(dú)立于炮的方向(以及坦克車的方向)。在AdvancedRobot 坦克中,通過設(shè)置setTurnRadarRightRadians(double degree)函數(shù)來讓雷達(dá)按一定的弧度轉(zhuǎn)動(dòng)。本設(shè)計(jì)中的設(shè)置雷達(dá)的參數(shù)如下:setTurnRadarRightRadians( Math.tan( targetBearing - getRadarHeadingRadians() ) * 3 );本設(shè)計(jì)中最重要的兩個(gè)策略是模式匹配策略和坦克的移動(dòng)策略。坦克的模式匹配策略的代碼如下所示: int match = 0; pattern time 0
23、= e.getDistance() / ( 20 - 3 * firePower ); pattern time 1 = e.getVelocity() * Math.sin( e.getHeadingRadians() - targetBearing ); /也就是說pattern time 1記錄的是直線提前量的射擊角度與自己子彈速度的乘積 pattern time 2 = pattern time 3 = 0; for ( int a = 0; a < storedInfo; a+ ) /每個(gè)記錄點(diǎn)patterna中,如果當(dāng)前時(shí)間是在我的子彈到達(dá)敵人之前則累加計(jì)算到的myBulle
24、tVelocity*Math.sin(predictionAngle)值; /同時(shí)記錄累加了多少次(pattern a 3的值) if ( pattern a 0 > 0 ) pattern a 2 += e.getVelocity() * Math.sin( e.getHeadingRadians() -targetBearing ); pattern a 0-; pattern a 3+; /在歷史中(所有記錄中)尋找一個(gè)和目前myBulletVelocity*Math.sin(predictionAngle)值最相近的記錄點(diǎn)(這個(gè)紀(jì)錄點(diǎn)必須是累加完畢的點(diǎn)patterna0<0
25、) /把這個(gè)紀(jì)錄點(diǎn)的數(shù)組下表記錄到match中 for ( int a = 0; a < storedInfo; a+ ) double testAngle = pattern time 1; if ( pattern a 0 < 0 && Math.abs( testAngle - pattern a 1 ) < Math.abs( testAngle - pattern match 1 ) ) match = a; 坦克的移動(dòng)策略的代碼如下所示:if ( nextMove- <= 0 ) for ( double a = 0 ; a < 500
26、 ; a+ ) double testX = Math.random() * getBattleFieldWidth(); double testY = Math.random() * getBattleFieldHeight(); double distToWall = Math.min( testX , getBattleFieldWidth() - testX )* Math.min( testY , getBattleFieldHeight() - testY ); if ( distToWall > 7600 ) double ourAngleToPoint = getAngl
27、e( ourX , ourY , testX , testY ); double minimumAngleDifference = ( ( 500 - a ) / 500 ) * Math.PI / 6; if ( Math.abs( angle_180( targetBearing ) - ourAngleToPoint ) > 2 * minimumAngleDifference&& Math.abs( angle_180( getHeadingRadians() ) ourAngleToPoint ) > minimumAngleDifference ) do
28、uble turnAngle = angle_180( getAngle( ourX , ourY , testX , testY ) -getHeadingRadians() ); double moveDirection = 1; if ( Math.abs( turnAngle ) > Math.PI / 2 ) moveDirection = - 1; turnAngle += Math.acos( moveDirection ); setTurnRightRadians( angle_180( turnAngle ) ); setAhead( moveDirection * P
29、oint2D.Double.distance( ourX , ourY , testX , testY ) ); break; nextMove = e.getDistance() / ( 29 - 3 * firePower ); setMaxVelocity( getTurnRemaining() > 45 ? 0.001 : 8 ); 5.3游戲主窗口游戲主窗口是人機(jī)交互的窗口,對(duì)玩家而言,他們只和游戲主窗口打交道,并不關(guān)心游戲內(nèi)部是如何實(shí)現(xiàn)的,所以游戲主窗口部分最重要的便是游戲數(shù)據(jù)的輸入、輸出。Robocode的游戲主窗口如圖所示:5.3.1游戲數(shù)據(jù)的輸入以及運(yùn)行第一步:雙擊桌面
30、上的Robocode圖標(biāo),運(yùn)行Robocode。第二步:在Robocode窗口中,選擇“Robot”菜單中的額“Editor”選項(xiàng),打開Robot Editor窗口,然后執(zhí)行“File”“New” “Java File”選項(xiàng),在彈出的窗口中編寫Java文件。如下圖所示:第三步:Java文件編寫完成后執(zhí)行“Compiler” “Compile”選項(xiàng),或者按組合鍵Ctrl+B執(zhí)行編譯命令。如果沒有出項(xiàng)錯(cuò)誤或警告,將會(huì)顯示Compiled successfully.第四步:關(guān)閉“Compiled successfully.”窗口,打開Robocode窗口,然后執(zhí)行“Battle”“New”命令,彈出
31、“New Battle”窗口,在“Battle”選項(xiàng)卡中選擇自己創(chuàng)建的機(jī)器人以及系統(tǒng)自帶的兩個(gè)機(jī)器人,最后單擊“Start Battle”按鈕開始比賽,界面如下圖所示:第五步:?jiǎn)螕簟癝tart Battle”按鈕后將進(jìn)入比賽場(chǎng)地,其中紅色的是我方坦克,如下圖所示:5.3.2游戲數(shù)據(jù)的輸出以及保存比賽結(jié)束后,會(huì)彈出一個(gè)表格樣式的窗口(圖4),這就是記分牌,也即你設(shè)置的N個(gè)回合比賽結(jié)束后的成績(jī)單。它可是你分析數(shù)據(jù)及參加聯(lián)賽的重要依據(jù)。此時(shí)可以單擊“Save”按鈕保存比賽結(jié)果,如下圖:Robot Name 是比賽機(jī)器人的名字;Total Score是這次比賽你的總共得分;Survival 是你存活率
32、的得分;Surv Bonus 是你贏的次數(shù)相對(duì)對(duì)手的分紅得分;Bullet Dmg:是你的子彈損失得分也即發(fā)射的子彈數(shù)的得分;Bullet Bonus是子彈數(shù)的分紅得分;Ram Dmg*2是你的撞擊得分;Ram Bonus: 是你撞擊得分分紅;最后三項(xiàng)1sts,2nds,3rds是你贏的次數(shù),不算做分?jǐn)?shù)。其中撞擊分和子彈損失分就要越少越好,但是有一點(diǎn)除外,撞死敵人所得分紅比炮彈打死敵人所得分紅多1/2。以上所有分?jǐn)?shù)加起來就是你的總分。6.設(shè)計(jì)體會(huì)與小結(jié)Robocode魅力所在是只要用幾十行的Java代碼,就能立刻創(chuàng)造出一個(gè)簡(jiǎn)單但完整機(jī)器人,還可以立即將它裝入Robocode 引擎中,再從Rob
33、ocode 自帶的那些水平不一的示例機(jī)器人中選取一個(gè)進(jìn)行一番對(duì)戰(zhàn)。你可以不停的修改你的程序,設(shè)計(jì)新射擊模型、躲避模型、移動(dòng)模型,當(dāng)你打敗了那些示例機(jī)器人,你還可以在網(wǎng)上下載由其他程序員編寫的水平更高的機(jī)器人,與它們比試一下,看看自己的水平到底如何。開發(fā)Robocode,也是一個(gè)極佳的學(xué)習(xí)Java 語言的過程。對(duì)于初學(xué)者來說,這是學(xué)習(xí)各種基本語法好途徑:類,方法,事件處理等等。當(dāng)你入門之后,需要進(jìn)一步提高機(jī)器人的“智力”水平,就需要使用更好的策略:如何預(yù)測(cè)對(duì)手的行動(dòng)路線,如何躲避對(duì)手的攻擊.你不得不創(chuàng)建更多類來應(yīng)對(duì)更多情況,你將學(xué)習(xí)使用接口、繼承等等Java 高級(jí)語言特性。隨著你的機(jī)器人的“智力
34、”水平的提高,你的編程能力也就跟著水漲船高了。7.參考文獻(xiàn)1.Java程序設(shè)計(jì)與應(yīng)用開發(fā)(第2版) 於東軍、楊靜宇、李千目、王國全 著 清華大學(xué)出版社2.Java語言實(shí)用教程(第2版) 丁振凡 著 北京郵電大學(xué)出版社3.Java語言學(xué)習(xí)利器 趙超鴻、周小剛 著 中國水利水電出版社8.源程序程序源代碼:package xyy; import robocode.*; import java.awt.Color; import java.awt.geom.Point2D; public class moshipipei extends AdvancedRobot static double next
35、Move; final static int storedInfo = 800; static double pattern = new doublestoredInfo4; public void run() setBodyColor(Color.red); setRadarColor(Color.yellow);setGunColor(Color.blue);setBulletColor(Color.yellow);setAdjustRadarForGunTurn(true); setAdjustGunForRobotTurn(true); while( true ) turnRadarR
36、ightRadians( Double.POSITIVE_INFINITY ); public void onScannedRobot(ScannedRobotEvent e) int time = (int) getTime() % storedInfo; double targetBearing = getHeadingRadians() + e.getBearingRadians(); double ourX = getX(); double ourY = getY(); double firePower = Math.min( 3 , 30 * getEnergy() / e.getD
37、istance() ); /下面是移動(dòng)策略 if ( nextMove- <= 0 ) for ( double a = 0 ; a < 500 ; a+ ) double testX = Math.random() * getBattleFieldWidth(); double testY = Math.random() * getBattleFieldHeight(); double distToWall = Math.min( testX , getBattleFieldWidth() - testX ) * Math.min( testY , getBattleFieldH
38、eight() - testY ); if ( distToWall > 7600 ) double ourAngleToPoint = getAngle( ourX , ourY , testX , testY ); double minimumAngleDifference = ( ( 500 - a ) / 500 ) * Math.PI / 6; if(Math.abs(angle_180(targetBearing)-ourAngleToPoint)>2*minimumAngleDifference&&Math.abs(angle_180(getHeadi
39、ngRadians()-ourAngleToPoint)>minimumAngleDifference ) double turnAngle = angle_180( getAngle( ourX , ourY , testX , testY ) - getHeadingRadians() ); double moveDirection = 1; if ( Math.abs( turnAngle ) > Math.PI / 2 ) moveDirection = - 1; turnAngle += Math.acos( moveDirection ); setTurnRightRa
40、dians( angle_180( turnAngle ) ); setAhead( moveDirection * Point2D.Double.distance(ourX ,ourY , testX , testY ) ); break; nextMove = e.getDistance() / ( 29 - 3 * firePower ); setMaxVelocity( getTurnRemaining() > 45 ? 0.001 : 8 ); / 移動(dòng)算法結(jié)束/ 以下是模式匹配算法int match = 0; patterntime0=e.getDistance()/( 20 - 3 * firePower );patterntime1=e.getVelocity()*Math.sin(e.getHeadingRadians()-targetBearing); /也就是說pattern time
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025上半年四川瀘州敘永縣事業(yè)單位招聘工作人員176人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 工程維修合同范本(19篇)
- 岳陽現(xiàn)代服務(wù)職業(yè)學(xué)院《測(cè)試技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度二零二五年度生態(tài)環(huán)保型商品房買賣協(xié)議
- 2025年度工廠車間承包與綠色制造技術(shù)創(chuàng)新合同3篇
- 2025年度房地產(chǎn)租賃反擔(dān)保質(zhì)押合同樣本2篇
- 2025年度地膜產(chǎn)品研發(fā)生產(chǎn)與全球購銷合作協(xié)議3篇
- 2025年度房地產(chǎn)居間合同糾紛起訴狀范文及法律適用指南3篇
- 2025年度辦公室裝修工程施工及配套家具采購合同
- 2025年度合伙購買養(yǎng)老公寓合作協(xié)議
- 安全風(fēng)險(xiǎn)防控培訓(xùn)
- 企業(yè)公司簡(jiǎn)介模板課件
- 第八版糖尿病教學(xué)
- 骨質(zhì)疏松的中醫(yī)中藥治療
- 5人制足球裁判培訓(xùn)
- 人教A版(新教材)高中數(shù)學(xué)選擇性必修第三冊(cè)學(xué)案2:7 1 1 條件概率
- 藥房質(zhì)量方針和目標(biāo)管理制度
- 職業(yè)技術(shù)學(xué)院《智能化成本核算與管理》課程標(biāo)準(zhǔn)
- 《如果超載電梯?!方虒W(xué)設(shè)計(jì)
- 大連市2024年數(shù)學(xué)四上期末統(tǒng)考試題含解析
- 《數(shù)據(jù)挖掘技術(shù)》教學(xué)大綱
評(píng)論
0/150
提交評(píng)論