java語(yǔ)言程序課程設(shè)計(jì)-- 坦克大戰(zhàn)_第1頁(yè)
已閱讀1頁(yè),還剩46頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  課程名稱: Java語(yǔ)言課程設(shè)計(jì) </p><p>  設(shè)計(jì)題目: 坦克大戰(zhàn) </p><p>  專 業(yè): 軟件工程 </p><p>  班 級(jí):

2、 </p><p>  姓 名: </p><p>  起止日期: 2012.12.17 至 2012.12.30 </p><p>  指導(dǎo)教師: </p><p><b>  注意事項(xiàng)</b><

3、/p><p><b>  一、設(shè)計(jì)目的</b></p><p>  《數(shù)據(jù)結(jié)構(gòu)》是一門實(shí)踐性較強(qiáng)的軟件基礎(chǔ)課,為了學(xué)好這門課程,必須在掌握理論知識(shí)的同時(shí),加強(qiáng)上機(jī)實(shí)踐。本課程設(shè)計(jì)的目的就是要達(dá)到理論與實(shí)際應(yīng)用相結(jié)合,使同學(xué)們能夠根據(jù)數(shù)據(jù)對(duì)象的特性,學(xué)會(huì)數(shù)據(jù)組織的方法,能把現(xiàn)實(shí)世界中的實(shí)際問(wèn)題在計(jì)算機(jī)內(nèi)部表示出來(lái),并培養(yǎng)基本的、良好的程序設(shè)計(jì)技能。</p>&

4、lt;p><b>  二、設(shè)計(jì)要求</b></p><p>  1.通過(guò)這次課程設(shè)計(jì),要求在數(shù)據(jù)結(jié)構(gòu)的邏輯特性和物理表示、數(shù)據(jù)結(jié)構(gòu)的選擇應(yīng)用、算法的設(shè)計(jì)及其實(shí)現(xiàn)等方面加深課程基本內(nèi)容的理解。同時(shí),在程序設(shè)計(jì)方法以及上機(jī)操作等基本技能和科學(xué)作風(fēng)方面受到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。</p><p>  2.學(xué)生必須仔細(xì)研讀《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)要求,以學(xué)生自學(xué)為主、指導(dǎo)教師

5、指導(dǎo)為輔,獨(dú)立完成課程設(shè)計(jì)的任務(wù),有問(wèn)題及時(shí)主動(dòng)與指導(dǎo)教師溝通。</p><p>  3.本次課程設(shè)計(jì)按照教學(xué)要求需要在本學(xué)期7周前完成,學(xué)生要發(fā)揮自主學(xué)習(xí)的能力,充分利用時(shí)間,安排好課程設(shè)計(jì)的時(shí)間計(jì)劃,并在課程設(shè)計(jì)過(guò)程中不斷檢測(cè)自己的計(jì)劃完成情況,及時(shí)向指導(dǎo)教師匯報(bào)。</p><p>  4.編程語(yǔ)言:C 語(yǔ)言。</p><p>  三、課程設(shè)計(jì)說(shuō)明書的格式要求

6、</p><p>  設(shè)計(jì)文檔的撰寫必須提前進(jìn)行,以保證使文檔與程序同步提交。 </p><p>  1.設(shè)計(jì)題目 2.運(yùn)行環(huán)境(軟、硬件環(huán)境)</p><p>  3.算法的需求分析 4.算法概要設(shè)計(jì)</p><p>  5.算法詳細(xì)設(shè)計(jì) 6.算法

7、的測(cè)試</p><p>  7.運(yùn)行結(jié)果分析 8.收獲及體會(huì)</p><p>  四、問(wèn)題分析、設(shè)計(jì)和測(cè)試過(guò)程要規(guī)范化。</p><p>  1.需求分析:將題目中要求的功能進(jìn)行敘述分析。</p><p>  2.概要設(shè)計(jì):算法的設(shè)計(jì)說(shuō)明,描述解決此問(wèn)題的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),(有些題目已經(jīng)指定了數(shù)據(jù)存儲(chǔ)的,按照指定的設(shè)

8、計(jì)),描述算法建議使用流程圖,進(jìn)行算法分析指明關(guān)鍵語(yǔ)句的時(shí)間復(fù)雜度。</p><p>  3.詳細(xì)設(shè)計(jì):即各個(gè)算法的具體實(shí)現(xiàn)步驟,每個(gè)題目要有相應(yīng)的源程序,其中每個(gè)功能模塊采用不同的函數(shù)實(shí)現(xiàn)。源程序要規(guī)范編寫:結(jié)構(gòu)要清晰,注釋要清楚。重點(diǎn)函數(shù)的重點(diǎn)變量和重點(diǎn)功能部分要加上清楚的程序注釋。</p><p>  4.調(diào)試和測(cè)試:給出實(shí)現(xiàn)功能的一組或多組測(cè)試數(shù)據(jù),程序調(diào)試后,將按照此測(cè)試數(shù)據(jù)進(jìn)行

9、測(cè)試的結(jié)果列出來(lái) 。在調(diào)試過(guò)程中遇到的問(wèn)題和解決方法也要記錄下來(lái)。程序要能夠正常運(yùn)行,還要有基本的容錯(cuò)功能。盡量避免出現(xiàn)操作錯(cuò)誤時(shí)出現(xiàn)死循環(huán)。</p><p>  5.改進(jìn)措施: 對(duì)有些題目提出算法改進(jìn)方案,比較不同算法的優(yōu)缺點(diǎn)。</p><p>  五、對(duì)指導(dǎo)教師的要求</p><p>  指導(dǎo)教師要關(guān)心學(xué)生的課程設(shè)計(jì)進(jìn)展,認(rèn)真答疑。對(duì)課程設(shè)計(jì)報(bào)告的撰寫

10、要給予充分的指導(dǎo),報(bào)告中切忌出現(xiàn)大篇源代碼,應(yīng)嚴(yán)格要求學(xué)生將主要篇幅放在“原理實(shí)現(xiàn)”上,即如何用框圖表達(dá)設(shè)計(jì)和實(shí)施思想。課程設(shè)計(jì)報(bào)告要用紅筆批閱,最終成績(jī)以優(yōu)、良、中、及格與不及格分等計(jì)算。</p><p>  瓊 州 學(xué) 院</p><p>  《JAVA語(yǔ)言程序》課程設(shè)計(jì)任務(wù)書</p><p><b>  目 錄</b></p

11、><p>  第一章 運(yùn)行環(huán)境(軟、硬件環(huán)境)1頁(yè)</p><p>  1.1 坦克大戰(zhàn)游戲的運(yùn)行軟件環(huán)境1頁(yè)</p><p>  1.1.1 Eclipse 3.7.01頁(yè)</p><p>  1.1.2 Windows操作系統(tǒng)1頁(yè)</p><p>  1.2 坦克大戰(zhàn)游戲的運(yùn)行硬件環(huán)境1頁(yè)</p>

12、<p>  1.2.1 計(jì)算機(jī)2頁(yè)</p><p>  1.3 運(yùn)行方法2頁(yè)</p><p>  1.3.1 方法一2頁(yè)</p><p>  1.3.2 方法二2頁(yè)</p><p>  第二章 算法的需求分析3頁(yè)</p><p>  2.1 需求分析的編寫目的3頁(yè)</p><

13、;p>  2.2 產(chǎn)品背景明細(xì)3頁(yè)</p><p>  2.3 縮寫及縮略語(yǔ)3頁(yè)</p><p>  2.4 項(xiàng)目描述4頁(yè)</p><p>  2.4.1 軟件開發(fā)的目標(biāo)4頁(yè)</p><p>  2.4.2 應(yīng)用范圍4頁(yè)</p><p>  第三章 算法概要設(shè)計(jì)5頁(yè)</p><p&

14、gt;  3.1 軟件結(jié)構(gòu)5頁(yè)</p><p>  3.2 數(shù)據(jù)結(jié)構(gòu)6頁(yè)</p><p>  3.2.1 邏輯結(jié)構(gòu)設(shè)計(jì)6頁(yè)</p><p>  第四章 算法詳細(xì)設(shè)計(jì)9頁(yè)</p><p>  4.1 程序描述9頁(yè)</p><p><b>  4.2 算法9頁(yè)</b></p>

15、<p>  4.2.1 坦克大戰(zhàn)游戲管理類算法9頁(yè)</p><p>  4.2.2 坦克類算法14頁(yè)</p><p>  4.2.3 炮彈類算法23頁(yè)</p><p>  4.2.4 膠囊類算法24頁(yè)</p><p>  4.2.5 爆炸效果類算法27頁(yè)</p><p>  4.2.6 墻體類算法

16、28頁(yè)</p><p><b>  算法的測(cè)試30頁(yè)</b></p><p>  5.0 引言30頁(yè)</p><p>  5.1 運(yùn)行界面以及菜單提示測(cè)試30頁(yè)</p><p>  5.2 功能測(cè)試31頁(yè)</p><p>  5.2.1 坦克大戰(zhàn)基礎(chǔ)功能測(cè)試31頁(yè)</p>

17、<p>  5.2.2 爆炸效果測(cè)試31頁(yè)</p><p>  5.2.3 墻體碰撞測(cè)試31頁(yè)</p><p>  5.2.4 膠囊功能測(cè)試32頁(yè)</p><p>  5.2.5 復(fù)活與自殺測(cè)試33頁(yè)</p><p>  5.2.6 超級(jí)火力功能測(cè)試33頁(yè)</p><p>  5.2.7 無(wú)盡模式

18、測(cè)試34頁(yè)</p><p>  5.2.8 獨(dú)孤求敗模式測(cè)試35頁(yè)</p><p>  第六章 收獲及體會(huì)36頁(yè)</p><p>  7.1 收獲36頁(yè)</p><p>  7.2 體會(huì)36頁(yè)</p><p>  第一章 運(yùn)行環(huán)境(軟、硬件環(huán)境)</p><p>  1.1 坦克大戰(zhàn)游

19、戲的運(yùn)行軟件環(huán)境</p><p>  本坦克大戰(zhàn)游戲是基于JAVA語(yǔ)言程序設(shè)計(jì),利用Eclipse 3.7.0在Windows操作系統(tǒng)環(huán)境下開發(fā)測(cè)試實(shí)現(xiàn)的,它的軟件運(yùn)行環(huán)境包含如下:</p><p>  1.1.1 Eclipse 3.7.0</p><p>  Eclipse 是一個(gè)開放源代碼的、基于Java的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù)

20、,用于通過(guò)插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開發(fā)工具(Java Development Kit,JDK)。</p><p>  Eclipse 還包括插件開發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對(duì)希望擴(kuò)展 Eclipse 的軟件開發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無(wú)縫集成的工具。由于 Ecl

21、ipse 中的每樣?xùn)|西都是插件,對(duì)于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場(chǎng)所。</p><p>  通過(guò)Eclipse 3.7.0可以將源碼編譯運(yùn)行本坦克大戰(zhàn)游戲。</p><p>  1.1.2 Windows 操作系統(tǒng)</p><p>  Windows操作系統(tǒng)是一款由美國(guó)微軟公司開發(fā)的窗口化

22、操作系統(tǒng)。采用了GUI圖形化操作模式,比起從前的指令操作系統(tǒng)如DOS更為人性化。Windows操作系統(tǒng)是目前世界上使用最廣泛的操作系統(tǒng)。最新的版本是Windows 8。 </p><p>  本坦克大戰(zhàn)游戲的運(yùn)行需要Windows操作系統(tǒng)的支持。</p><p>  1.2 坦克大戰(zhàn)游戲的運(yùn)行硬件環(huán)境</p><p>  程序的運(yùn)行除了需要軟件環(huán)境之外,還需要有承載

23、的基礎(chǔ),即硬件環(huán)境。</p><p><b>  1.2.1 計(jì)算機(jī)</b></p><p>  計(jì)算機(jī)(Computer)俗稱電腦,是一種能夠按照程序運(yùn)行,自動(dòng)、高速處理海量數(shù)據(jù)的現(xiàn)代化智能電子設(shè)備。由硬件系統(tǒng)和軟件系統(tǒng)所組成,沒(méi)有安裝任何軟件的計(jì)算機(jī)稱為裸機(jī)??煞譃槌?jí)計(jì)算機(jī)、工業(yè)控制計(jì)算機(jī)、網(wǎng)絡(luò)計(jì)算機(jī)、個(gè)人計(jì)算機(jī)、嵌入式計(jì)算機(jī)五類,較先進(jìn)的計(jì)算機(jī)有生物計(jì)算機(jī)、光

24、子計(jì)算機(jī)、量子計(jì)算機(jī)等。 </p><p>  坦克大戰(zhàn)游戲的資源占用非常小,對(duì)計(jì)算機(jī)的配置要求極低,目前市面上的計(jì)算機(jī)都具備運(yùn)行的硬件環(huán)境。</p><p><b>  1.3 運(yùn)行方法</b></p><p>  在具備了上面提到的運(yùn)行環(huán)境之后,便可啟動(dòng)運(yùn)行本坦克大戰(zhàn)游戲。</p><p><b>  1.

25、3.1 方法一</b></p><p>  直接運(yùn)行封裝好的EXE可執(zhí)行文件,進(jìn)入坦克大戰(zhàn)游戲的菜單界面,根據(jù)菜單界面上的操作提示便可以進(jìn)行游戲體驗(yàn)。</p><p><b>  1.3.2 方法二</b></p><p>  1.下載安裝Eclipse 3.7.0(或者其他的JAVA語(yǔ)言開發(fā)工具,推薦Eclipse 3.7.0)以

26、上的版本。</p><p>  2.打開運(yùn)行Eclipse 3.7.0,點(diǎn)擊“文件”-> “新” -> “Java項(xiàng)目”,并輸入新建的項(xiàng)目名(比如“TankWar”) -> 完成(JDK的版本及一些相關(guān)設(shè)置按默認(rèn)使用就可以了)。</p><p>  3.右鍵點(diǎn)擊“TankWar”-> “新建” -> “類”,并輸入新建的類名名(比如Tank) -> 完成

27、 -> 將相應(yīng)類的源碼復(fù)制粘貼即可。</p><p>  4.點(diǎn)擊菜單欄的“全部保存” -> 選中運(yùn)行類客戶端(例如:TankClient) -> 運(yùn)行(箭頭)。</p><p>  5.進(jìn)入坦克大戰(zhàn)游戲的運(yùn)行界面,根據(jù)菜單界面上的而操作提示便可以開始進(jìn)行游戲體驗(yàn)。</p><p>  第二章 算法的需求分析</p><p>

28、;  2.1 需求分析的編寫目的</p><p>  本需求分析的目的是規(guī)范化本軟件的編寫,整合本軟件的基本結(jié)構(gòu)和所需要實(shí)現(xiàn)的基本功能,旨在于推進(jìn)軟件開發(fā)的進(jìn)度,便于對(duì)軟件開發(fā)過(guò)程中的控制與管理,同時(shí)提出了本坦克大戰(zhàn)游戲的軟件開發(fā)過(guò)程,便于程序員與客戶之間的交流、協(xié)作,讓用戶加深對(duì)本軟件的了解,以期能夠獲得更大范圍的應(yīng)用。明確軟件開發(fā)的方向,保證軟件開發(fā)穩(wěn)定性和有序性。</p><p> 

29、 2.2 產(chǎn)品背景明細(xì)</p><p><b>  軟件名稱:坦克大戰(zhàn)</b></p><p><b>  開發(fā)者:嚴(yán)彩冠</b></p><p>  用戶:社會(huì)廣大的游戲群體</p><p><b>  設(shè)計(jì)要求:</b></p><p>  設(shè)計(jì)一個(gè)

30、坦克大戰(zhàn)游戲,在傳統(tǒng)坦克大戰(zhàn)的基礎(chǔ)上進(jìn)行創(chuàng)新,通過(guò)此程序具備以下基本功能: </p><p>  1.敵我雙方坦克的相互進(jìn)攻; </p><p>  2.游戲運(yùn)行界面和用戶指引; </p><p>  3.創(chuàng)新游戲模式的實(shí)現(xiàn); </p><p>  4.坦克等級(jí)和分?jǐn)?shù)制度的實(shí)現(xiàn)。</p><p>  5.需要條件才能解

31、鎖的游戲功能,增加游戲的耐玩性和趣味性。</p><p>  2.3 縮寫及縮略語(yǔ)</p><p>  坦克大戰(zhàn):基本元素為構(gòu)成坦克大戰(zhàn)游戲及其相關(guān)行為所必須的各個(gè)部分:“坦克大戰(zhàn)的基礎(chǔ)功能”,“復(fù)活”,“自殺(防卡死)”,“無(wú)盡模式”,“獨(dú)孤求敗模式”,“血條顯示”,“等級(jí)與分?jǐn)?shù)的計(jì)算”,“超級(jí)火力”及“隨機(jī)膠囊的投放”。</p><p>  類:表示對(duì)現(xiàn)實(shí)生活中

32、一類具有共同特征的事物的抽象,是面向?qū)ο缶幊痰幕A(chǔ)。類具有行為(behavior),它描述一個(gè)對(duì)象能夠做什么以及做的方法(method),它們是可以對(duì)這個(gè)對(duì)象進(jìn)行操作的程序和過(guò)程。</p><p><b>  2.4 項(xiàng)目描述</b></p><p>  本坦克大戰(zhàn)游戲的實(shí)現(xiàn)較為簡(jiǎn)單,只能稱為一個(gè)不成熟的半成品。軟件的設(shè)計(jì)要求雖然已經(jīng)達(dá)到,但是本坦克大戰(zhàn)游戲的局限性也

33、是很明顯的。隨著時(shí)代的發(fā)展,日益更新的編程技術(shù),對(duì)于軟件的要求不再局限于功能的實(shí)現(xiàn)。對(duì)于軟件的界面包裝是軟件成功的第一步。</p><p>  界面包裝的不完備,沒(méi)有實(shí)現(xiàn)多人同時(shí)進(jìn)行游戲,這些都是本坦克大戰(zhàn)的不足之處。但是,本坦克大戰(zhàn)游戲在設(shè)計(jì)的時(shí)候也加入了一些自己的創(chuàng)新想法,這個(gè)游戲的趣味性是沒(méi)問(wèn)題的,這是它的優(yōu)點(diǎn)。</p><p>  總的來(lái)說(shuō),本軟件是學(xué)習(xí)和初步應(yīng)用性質(zhì)比較濃重的開發(fā)

34、,作為一項(xiàng)課程設(shè)計(jì)是有其啟發(fā)和突破意義的。</p><p>  2.4.1 軟件的開發(fā)目標(biāo)</p><p>  1.開發(fā)一個(gè)具有創(chuàng)新意味的坦克大戰(zhàn)游戲,讓跟多的用戶可以體驗(yàn)舊游戲的新玩法,提高游戲的被接受度和趣味性。</p><p>  2.將自己的所學(xué)應(yīng)用到實(shí)踐之中,提高自身的動(dòng)手能力,使自身能夠切實(shí)掌握一門技能,利用JAVA語(yǔ)言進(jìn)行游戲設(shè)計(jì)初窺軟件工程的實(shí)現(xiàn)流程

35、。</p><p>  2.4.2 應(yīng)用范圍</p><p>  可用于開發(fā)人員的交流和學(xué)習(xí)。</p><p>  2.理論上能夠滿足一部分人對(duì)于“舊游戲新玩法”的需求,其目的在于使體驗(yàn)過(guò)本游戲的玩家可以回想起過(guò)去的經(jīng)典,找回以往雖然簡(jiǎn)陋但卻快樂(lè)的游戲時(shí)光。</p><p>  第三章 算法概要設(shè)計(jì)</p><p>&

36、lt;b>  3.1 軟件結(jié)構(gòu)</b></p><p>  1.坦克大戰(zhàn)游戲概念詳見:2.3縮寫及縮略語(yǔ)。</p><p>  2.本坦克大戰(zhàn)游戲按類(詳見2.3)可以分為六大模塊:</p><p>  (1)坦克大戰(zhàn)管理類(Tankclient)。</p><p>  (2)坦克類(Tank)</p><

37、;p>  (3)炮彈類(Shell)</p><p>  (4)血條類(Blood)</p><p>  (5)爆炸類(Explosion)</p><p>  (6)墻體類(Wall)</p><p>  3.處理流程及模塊的層次結(jié)構(gòu)和調(diào)用關(guān)系簡(jiǎn)圖如圖1所示:</p><p><b>  圖 1&l

38、t;/b></p><p><b>  3.2 數(shù)據(jù)結(jié)構(gòu)</b></p><p>  3.2.1 邏輯結(jié)構(gòu)設(shè)計(jì)</p><p>  這里將給出本系統(tǒng)內(nèi)所使用的每個(gè)數(shù)據(jù)結(jié)構(gòu)的名稱、標(biāo)識(shí)符以及它們之中每個(gè)數(shù)據(jù)項(xiàng)、記錄、文卷和系的標(biāo)識(shí)、定義、長(zhǎng)度及它們之間的層次的或表格的相互關(guān)系。</p><p><b>  

39、坦克類信息表格 </b></p><p><b>  坦克管理類信息 </b></p><p><b>  膠囊信息表格 </b></p><p><b>  爆炸類信息</b></p><p><b>  子彈信息表格 </b></p&

40、gt;<p>  第四章 算法詳細(xì)設(shè)計(jì)</p><p><b>  4.1 程序描述</b></p><p>  本坦克大戰(zhàn)游戲通過(guò)監(jiān)聽用戶的鍵盤輸入對(duì)我方坦克即游戲的相關(guān)模式進(jìn)行相應(yīng)的操作。</p><p>  用戶只要給出坦克方向,坦克便會(huì)根據(jù)方向相應(yīng)的改變坦克的坐標(biāo),再通過(guò)坦克大戰(zhàn)管理類的線程重畫不斷的將坦克畫出,從而達(dá)到坦

41、克連續(xù)移動(dòng)的效果:當(dāng)用戶按住方向鍵,我方坦克的move方法就會(huì)執(zhí)行,松開按鍵就會(huì)關(guān)閉移動(dòng)方法。將方向判斷和移動(dòng)方法分開處理,而方向是由鍵盤監(jiān)聽實(shí)現(xiàn)的,這樣就可以避免監(jiān)聽事件不均勻造成的坦克移動(dòng)卡頓的問(wèn)題。</p><p>  游戲中的敵方坦克和子彈都是通過(guò)改變坐標(biāo),或者設(shè)定是否存活的屬性并通坦克大戰(zhàn)管理類線程重畫不斷的將當(dāng)前屏幕中存活的子彈數(shù)和坦克數(shù)畫出來(lái)實(shí)現(xiàn)動(dòng)態(tài)的改變效果的。</p><p&

42、gt;<b>  4.2 算法</b></p><p>  4.2.1 坦克大戰(zhàn)游戲管理類算法</p><p>  坦克大戰(zhàn)管理類是啟動(dòng)游戲的主類。游戲界面的啟動(dòng)還有游戲應(yīng)該有的成員(敵我坦克,子彈,墻體等等)都在這個(gè)管理類內(nèi)添加和重畫。</p><p>  在解決屏幕閃屏的時(shí)候,使用了雙緩沖技術(shù)。根據(jù)線程在調(diào)用repaint方法重畫時(shí)會(huì)先調(diào)用

43、update方法然后再調(diào)用paint方法,可以通過(guò)重寫update方法解決這個(gè)問(wèn)題。</p><p>  游戲坦克,子彈的增加和刪除是通過(guò)對(duì)坦克大戰(zhàn)管理類的各項(xiàng)集合進(jìn)行增刪操作來(lái)實(shí)現(xiàn)的。</p><p>  4、坦克大戰(zhàn)管理類設(shè)計(jì)源碼:</p><p>  import java.awt.*;</p><p>  import java.aw

44、t.event.*;</p><p>  import java.util.*;</p><p>  import java.util.List;</p><p>  public class TankClient extends Frame {</p><p>  public static final int screenWeight =

45、 800;</p><p>  public static final int screenHeight = 600;</p><p>  Image offImageScreen = null;</p><p>  public static int num = 0;//無(wú)盡模式使用次數(shù)(次數(shù)越多,敵方坦克越多)</p><p>  pri

46、vate boolean challenge = false;//求敗模式開關(guān)</p><p>  Tank myTank = null ;</p><p>  List<Tank> tanks = new ArrayList<Tank>();//敵方坦克集合</p><p>  List<Shell> shells = new

47、ArrayList<Shell>();//彈藥集合</p><p>  List<Wall> walls = new ArrayList<Wall>();//墻體集合</p><p>  Blood blood = null;</p><p>  public static void main(String[] args) {&

48、lt;/p><p>  TankClient tc = new TankClient();</p><p>  tc.lunchClient();</p><p><b>  }</b></p><p>  public boolean isChallenge() {</p><p>  return

49、 challenge;</p><p><b>  }</b></p><p>  public void setChallenge(boolean challenge) {</p><p>  this.challenge = challenge;</p><p><b>  }</b></

50、p><p>  //啟動(dòng)面板(游戲)</p><p>  public void lunchClient(){</p><p>  myTank = new Tank(50,50,true,this);</p><p>  //窗口出來(lái)前加入10輛敵方坦克</p><p>  for(int i = 0;i < 10

51、;i++)</p><p><b>  {</b></p><p>  Tank t = new Tank(200 + 40*i,myTank.getY(),false,this);</p><p>  t.eTank();</p><p>  tanks.add(t);</p><p><

52、b>  }</b></p><p>  //啟動(dòng)游戲時(shí)加入墻體</p><p>  Wall w1 = new Wall(200,200,500,20,0,this);</p><p>  walls.add(w1);</p><p>  Wall w2 = new Wall(220,220,20,300,1,this);&

53、lt;/p><p>  walls.add(w2);</p><p>  setSize(screenWeight,screenHeight);</p><p>  setTitle("TankWar");</p><p>  setLocation(100,100);</p><p>  setBac

54、kground(Color.BLACK);</p><p>  this.addWindowListener(new WindowAdapter(){</p><p>  public void windowClosing(WindowEvent e){</p><p>  System.exit(0);</p><p><b> 

55、 }</b></p><p><b>  });</b></p><p>  setVisible(true);</p><p>  this.setResizable(false);</p><p>  this.addKeyListener(new KeyMonitor());</p>&l

56、t;p>  new Thread(new ThreadClient()).start();</p><p><b>  }</b></p><p>  public void paint(Graphics g){</p><p>  Color c = g.getColor();</p><p>  g.setCo

57、lor(Color.green);</p><p>  g.drawString("屏幕中存在的子彈數(shù) : " + shells.size() , 30, 50);</p><p>  g.drawString("屏幕中的敵方坦克數(shù) : " + tanks.size(), 30, 70);</p><p>  g.drawSt

58、ring("復(fù) 活 : F2", 30, 90);</p><p>  g.drawString("超 級(jí) 火 力 : O", 30, 110);</p><p>  g.drawString("無(wú) 盡 模 式 : F3

59、", 30, 130);</p><p>  g.drawString("獨(dú) 孤 求 敗 : F4", 30, 150);</p><p>  g.drawString("等 級(jí)" + myTank.getLevel(), 700, 530);</p><p>  g.draw

60、String("分 數(shù)" + myTank.getScore(), 700, 550);</p><p>  g.drawString("提示:我方坦克卡死," +"\n" + "請(qǐng)按F12自殺", 600, 570);</p><p>  g.setColor(c);</p><p&

61、gt;<b>  //回血膠囊</b></p><p>  //隨機(jī)出現(xiàn)回復(fù)血條</p><p>  Random rn = new Random();</p><p>  int visit = rn.nextInt(300);</p><p>  if(visit == 31)</p><p&g

62、t;  blood = new Blood(1,this);</p><p>  else if(visit == 30)</p><p>  blood = new Blood(0,this);</p><p>  if(blood != null)</p><p>  blood.drawBlood(g);</p><

63、;p>  //每次重畫檢測(cè)碰撞</p><p>  hitCheck();</p><p><b>  //墻體畫出</b></p><p>  if(walls.size() != 0)</p><p><b>  {</b></p><p>  for(in

64、t i = 0;i < walls.size();i++)</p><p>  walls.get(i).drawWall(g);</p><p><b>  }</b></p><p><b>  //彈藥畫出</b></p><p>  if(shells.size() != 0){<

65、;/p><p>  for(int i = 0;i < shells.size();i++)</p><p><b>  {</b></p><p>  Shell s = shells.get(i);</p><p>  if(s.isLive())</p><p>  s.drawShell

66、(g);</p><p><b>  else</b></p><p>  shells.remove(s);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //我放坦克畫出<

67、/b></p><p>  if(myTank.isLive())</p><p>  myTank.drawTank(g);</p><p><b>  //敵方坦克畫出</b></p><p>  if(tanks.size() != 0)</p><p>  for(int i = 0

68、;i < tanks.size();i++)</p><p><b>  {</b></p><p>  Tank t = tanks.get(i);</p><p>  if(t.isLive())</p><p>  t.drawTank(g);</p><p>  t.eTank();

69、//敵方坦克移動(dòng)</p><p>  t.hitTank(myTank, g);//敵方攻擊我方</p><p><b>  }</b></p><p>  myTank.hitTanks(g);//我方攻擊敵方</p><p><b>  }</b></p><p>  /

70、/雙緩沖解決閃屏問(wèn)題(調(diào)用repaint方法重畫時(shí)會(huì)先調(diào)用update方法然后再調(diào)用paint方法)</p><p>  //重寫update方法設(shè)置背景</p><p>  public void update(Graphics g){</p><p>  if(offImageScreen == null){</p><p>  offI

71、mageScreen = this.createImage(screenWeight, screenHeight);</p><p><b>  }</b></p><p>  Graphics gOffScreen = offImageScreen.getGraphics();</p><p>  Color c = gOffScreen.g

72、etColor();</p><p>  gOffScreen.setColor(Color.BLACK);</p><p>  gOffScreen.fillRect(0, 0, screenWeight, screenHeight);</p><p>  gOffScreen.setColor(c);</p><p>  paint(gO

73、ffScreen);</p><p>  g.drawImage(offImageScreen, 0, 0, null);</p><p><b>  }</b></p><p>  //按鍵監(jiān)聽調(diào)用Tank類的方法</p><p>  class KeyMonitor extends KeyAdapter {</

74、p><p>  public void keyPressed(KeyEvent e){</p><p>  myTank.keyPressed(e);</p><p><b>  }</b></p><p>  public void keyReleased(KeyEvent e){</p><p>

75、  myTank.keyReleased(e);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //重畫配置</b></p><p>  class ThreadClient implements Runnable

76、{</p><p>  public void run() {</p><p>  while(true){</p><p><b>  try {</b></p><p>  Thread.sleep(50);</p><p>  } catch (InterruptedException e)

77、 {</p><p>  // TODO Auto-generated catch block</p><p>  System.out.println("1號(hào)錯(cuò)誤");</p><p><b>  }</b></p><p>  repaint();</p><p><

78、b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  public void hitCheck(){</p><p>  //兩輛坦克不能重合</p><p>  for(int i = 0;

79、i < tanks.size();i++)</p><p><b>  {</b></p><p>  if(myTank.getRect().intersects(tanks.get(i).getRect()))</p><p><b>  {</b></p><p>  tanks.get

80、(i).stay();</p><p>  myTank.stay();</p><p><b>  }</b></p><p>  for(int j = 0;j < tanks.size();j++)</p><p><b>  {</b></p><p>  if

81、(i == j) continue;</p><p>  if(tanks.get(i).getRect().intersects(tanks.get(j).getRect()))</p><p><b>  {</b></p><p>  tanks.get(i).stay();</p><p>  tanks.get

82、(j).stay();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //坦克與墻的碰撞檢測(cè)</p><p>  for(int j = 0;j < wa

83、lls.size();j++)</p><p><b>  { </b></p><p>  if(myTank.getRect().intersects(walls.get(j).getRect()))</p><p><b>  {</b></p><p>  myTank.stay()

84、;</p><p><b>  }</b></p><p>  for(int i = 0;i < tanks.size();i++)</p><p><b>  {</b></p><p>  if(tanks.get(i).getRect().intersects(walls.get(j

85、).getRect()))</p><p><b>  {</b></p><p>  tanks.get(i).stay();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&l

86、t;/b></p><p><b>  //子彈與墻</b></p><p>  for(int i = 0;i < shells.size();i++)</p><p><b>  {</b></p><p>  for(int j = 0;j < walls.size();j+

87、+)</p><p><b>  {</b></p><p>  if(shells.get(i).getRect().intersects(walls.get(j).getRect()) && walls.get(j).getNumber() != 1)</p><p><b>  {</b></

88、p><p>  shells.get(i).setLive(false);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(int i = 0;i <

89、shells.size();i++)</p><p><b>  {</b></p><p>  for(int j = 0;j < shells.size();j++)</p><p><b>  {</b></p><p>  if(i == j) continue;</p>

90、<p>  if(shells.get(i).getRect().intersects(shells.get(j).getRect()) && </p><p>  shells.get(i).isGood() != shells.get(j).isGood())</p><p><b>  {</b></p><p&g

91、t;  shells.get(i).setLive(false);</p><p>  shells.get(j).setLive(false);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p

92、><p><b>  }</b></p><p><b>  }</b></p><p>  4.2.2 坦克類算法</p><p>  坦克類是坦克大戰(zhàn)的重要模塊,這里包含了坦克應(yīng)該有的成員屬性(詳見邏輯結(jié)構(gòu)設(shè)計(jì))。坦克大戰(zhàn)管理類的按鍵監(jiān)聽使用的就是在坦克類中實(shí)現(xiàn)的keyPressed方法和KeyRe

93、leased方法。</p><p>  在這個(gè)類中還包含了坦克的draw方法,方向判斷方法以及移動(dòng)方法(包含敵我雙方坦克的相關(guān)操作)。</p><p>  坦克類還實(shí)現(xiàn)了坦克血條的方法,實(shí)現(xiàn)了計(jì)算坦克分?jǐn)?shù)和等級(jí)的功能,以及發(fā)射炮彈,擊殺敵方的方法。我方擊殺敵方一輛坦克將獲得100分。子彈的有效攻擊是通過(guò)判斷子彈的類型和坦克的類型是否一致來(lái)實(shí)現(xiàn)的,有效的打擊必須保證子彈的類型和坦克的類型相反

94、,再通過(guò)碰撞檢測(cè)來(lái)確定是否擊中目標(biāo)最終達(dá)到擊殺的效果。</p><p>  碰撞檢測(cè)是通過(guò)判斷兩個(gè)對(duì)象所占的對(duì)應(yīng)方框范圍是否重合來(lái)實(shí)現(xiàn)的。</p><p>  在坦克類的KeyReleased監(jiān)聽方法中實(shí)現(xiàn)了游戲的各種模式和功能。它們的實(shí)現(xiàn)都是通過(guò)修改對(duì)應(yīng)的對(duì)象實(shí)例的信息來(lái)實(shí)現(xiàn)的。</p><p>  敵方坦克的簡(jiǎn)易人工智能是通過(guò)隨機(jī)步數(shù),即讓敵方坦克在移動(dòng)隨機(jī)的步

95、數(shù)之后再隨機(jī)的切換移動(dòng)方向,在方向切換的同時(shí)打開敵方坦克的攻擊開關(guān)。即完成敵方坦克的自我隨機(jī)移動(dòng)和攻擊,達(dá)到基本人工智能的要求。</p><p>  超級(jí)火力功能是通過(guò)連續(xù)創(chuàng)建8個(gè)不同方向的炮彈來(lái)實(shí)現(xiàn)的。而炮彈的移動(dòng)采用的是只要賦予了方向便朝相應(yīng)的方向移動(dòng),從而達(dá)到打開“超級(jí)火力”攻擊按鈕的時(shí)候,坦克可以朝8個(gè)方向同時(shí)發(fā)射炮彈的效果。</p><p>  8、坦克類設(shè)計(jì)源碼:</p&

96、gt;<p>  import java.awt.*;</p><p>  import java.awt.event.*;</p><p>  import java.util.Random;</p><p>  public class Tank {</p><p>  private static final int Sp

97、eech = 5;//坦克速度</p><p>  private static int Level = 0;//坦克等級(jí)</p><p>  private static int Score = 0;//坦克分?jǐn)?shù)</p><p>  private int x;</p><p>  private int y;//坦克坐標(biāo)</p>

98、;<p>  private int oldX;</p><p>  private int oldY;</p><p>  private int life = 30;//坦克生命</p><p>  private int width = 30;</p><p>  private int height = 30;//坦克寬

99、高</p><p>  private boolean live = true;//存活與否</p><p>  private boolean good;//坦克敵我分別</p><p>  private TankClient tc = null;</p><p>  private boolean bU = false,bL = fal

100、se,bR = false,bD = false;</p><p>  enum Direction {L,LU,LD,R,RU,RD,U,D,STOP}</p><p>  Direction dir = Direction.STOP;//移動(dòng)方向</p><p>  Direction ptDir = Direction.D;//炮筒方向</p>

101、<p>  //以下成員作為eTank()方法的成員使用</p><p>  Random r = new Random();</p><p>  private int step = r.nextInt(12) + 3;//移動(dòng)的步數(shù),移動(dòng)隨即的步數(shù)然后改變方向(加3是為了不讓隨機(jī)數(shù)為0)</p><p>  public static void mai

102、n(String[] args) {</p><p>  // TODO Auto-generated method stub</p><p><b>  }</b></p><p>  public int getLife() {</p><p>  return life;</p><p>&

103、lt;b>  }</b></p><p>  public void setLife(int life) {</p><p>  this.life = life;</p><p><b>  }</b></p><p>  public static void setLevel(int level)

104、{</p><p>  Level = level;</p><p><b>  }</b></p><p>  public static void setScore(int score) {</p><p>  Score = score;</p><p><b>  }</b

105、></p><p>  public static int getScore() {</p><p>  return Score;</p><p><b>  }</b></p><p>  public static int getLevel() {</p><p>  return L

106、evel;</p><p><b>  }</b></p><p>  public boolean isLive() {</p><p>  return live;</p><p><b>  }</b></p><p>  public void setLive(boo

107、lean live) {</p><p>  this.live = live;</p><p><b>  }</b></p><p>  public void setGood(boolean good) {</p><p>  this.good = good;</p><p><b&

108、gt;  }</b></p><p>  public Tank(int x,int y,boolean good,TankClient tc){</p><p>  this.x = x;</p><p>  this.y = y;</p><p>  this.good = good;</p><p>

109、  this.tc = tc;</p><p><b>  }</b></p><p>  public void drawTank(Graphics g){</p><p>  Color c = g.getColor();</p><p>  if(this.isGood()){</p><p&g

110、t;  g.setColor(Color.RED);</p><p>  g.fillOval(x, y, width, height);</p><p><b>  }</b></p><p><b>  else{</b></p><p>  g.setColor(Color.BLUE);<

111、;/p><p>  g.fillOval(x, y, width, height);</p><p><b>  }</b></p><p>  g.setColor(c);</p><p>  drawPT(g);</p><p>  if(isGood())</p><p&g

112、t;<b>  { </b></p><p>  drawBloodBar(g); </p><p>  move();//每畫一次調(diào)用移動(dòng)方法一次 </p><p><b>  }</b></p><p><b>  }</b></p><p> 

113、 public void drawBloodBar(Graphics g){</p><p>  int bHeight = 10;</p><p>  Color c = g.getColor();</p><p>  g.setColor(Color.orange);</p><p>  g.drawRect(x, y - 10, 30,

114、 10);</p><p>  g.setColor(Color.RED);</p><p>  g.fillRect(x, y - 10, life, bHeight);</p><p>  g.setColor(c);</p><p><b>  }</b></p><p><b>

115、  //炮筒繪制</b></p><p>  public void drawPT(Graphics g){</p><p>  Color c = g.getColor();</p><p>  g.setColor(Color.WHITE);</p><p>  switch(ptDir){</p><p&

116、gt;  case L:g.drawLine(getX() + width/2, getY() + height/2, getX() - 5, getY() + height/2);break; </p><p>  case LU:g.drawLine(getX() + width/2, getY() + height/2, getX(), getY());break; </p><p>

117、;  case LD:g.drawLine(getX() + width/2, getY() + height/2, getX(), getY() + height);break; </p><p>  case R:g.drawLine(getX() + width/2, getY() + height/2, getX() + width + 5, getY() + height/2);break; </

118、p><p>  case RU:g.drawLine(getX() + width/2, getY() + height/2, getX() + width, getY());break; </p><p>  case RD:g.drawLine(getX() + width/2, getY() + height/2, getX() + width, getY() + height);bre

119、ak; </p><p>  case U:g.drawLine(getX() + width/2, getY() + height/2, getX() + width/2, getY() - 5);break; </p><p>  case D:g.drawLine(getX() + width/2, getY() + height/2, getX() + width/2, getY(

120、) + height + 5);break; </p><p><b>  }</b></p><p>  g.setColor(c);</p><p><b>  }</b></p><p><b>  //敵方坦克移動(dòng)</b></p><p>  p

121、ublic void eTank(){</p><p>  if(!isGood())</p><p><b>  { </b></p><p>  Direction[] dirs = Direction.values();</p><p>  if(step == 0)</p><p>

122、<b>  {</b></p><p>  step = r.nextInt(20) + 3;</p><p>  if(tc.isChallenge())</p><p>  superFire();</p><p><b>  else</b></p><p>  fir

123、e();//敵方坦克開火 </p><p>  int rn = r.nextInt(dirs.length);</p><p>  dir = dirs[rn];</p><p><b>  } </b></p><p><b>  move();</b></p><p

124、><b>  step--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //按鍵監(jiān)聽</b></p><p>  public void keyPressed(KeyEvent

125、 e){</p><p>  int key = e.getKeyCode();</p><p>  switch(key){</p><p>  case KeyEvent.VK_W:</p><p>  bU = true;break;</p><p>  case KeyEvent.VK_D:</p>

126、<p>  bR = true;break;</p><p>  case KeyEvent.VK_S:</p><p>  bD = true;break;</p><p>  case KeyEvent.VK_A:</p><p>  bL = true;break;</p><p><b>

127、;  }</b></p><p>  setDirection();</p><p><b>  }</b></p><p>  public void keyReleased(KeyEvent e) {</p><p>  int key = e.getKeyCode();</p><p

128、>  switch(key){</p><p>  case KeyEvent.VK_W:</p><p>  bU = false;break;</p><p>  case KeyEvent.VK_D:</p><p>  bR = false;break;</p><p>  case KeyEvent.V

129、K_S:</p><p>  bD = false;break;</p><p>  case KeyEvent.VK_A:</p><p>  bL = false;break;</p><p>  case KeyEvent.VK_J:</p><p>  if(tc.myTank.isLive())</p&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論