版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 坦克大戰(zhàn)--java課程設(shè)計(jì)
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- 基于java坦克大戰(zhàn)課程設(shè)計(jì)
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)---基于java的坦克大戰(zhàn)
- java課程設(shè)計(jì)----基于java的坦克大戰(zhàn)
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告.doc
- java關(guān)于坦克大戰(zhàn)的課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)坦克大戰(zhàn)游戲(含代碼)
- 基于java語(yǔ)言的坦克大戰(zhàn)
- 基于java語(yǔ)言的坦克大戰(zhàn)
- 課程設(shè)計(jì)報(bào)告--坦克大戰(zhàn)
- 基于java的坦克大戰(zhàn)軟件程序設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-- 坦克大戰(zhàn)游戲設(shè)計(jì)(java版)
- java版坦克大戰(zhàn)
- 新世紀(jì)坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)畢業(yè)設(shè)計(jì)論文
- 基于java的游戲坦克大戰(zhàn)
- java語(yǔ)言課程設(shè)計(jì)---記事本程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論