版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《 面向?qū)ο蟪绦蛟O計》</p><p><b> 課程設計報告</b></p><p> 題 目: 坦克大戰(zhàn)軟件設計與實現(xiàn) </p><p> 院 (系): 信息科學與工程學院 </p><p> 專業(yè)班級: 計算機科學與技術1201班 <
2、;/p><p> 20 14 年 12 月 29 日至20 15 年 1 月 9 日</p><p> 面向?qū)ο蟪绦蛟O計 課程設計任務書</p><p><b> 目錄</b></p><p> 1需求與總體設計1</p><p><b> 1.1需求分析1<
3、;/b></p><p><b> 1.2總體設計2</b></p><p> 1.2.1總體設計功能圖2</p><p> 1.2.2總體設計流程圖2</p><p><b> 1.3類圖3</b></p><p><b> 2詳細設計4
4、</b></p><p> 2.1詳細設計思路4</p><p> 2.2類圖詳細說明7</p><p> 2.3詳細設計流程圖15</p><p><b> 3編碼實現(xiàn)16</b></p><p><b> 4系統(tǒng)測試67</b></p
5、><p> 4.1菜單項測試67</p><p> 4.2游戲信息測試:69</p><p><b> 總 結(jié)77</b></p><p><b> 1需求與總體設計</b></p><p><b> 1.1需求分析</b></p&g
6、t;<p> 設計一個圖形用戶界面,將所有游戲的元素都能在此用于界面上表現(xiàn)出來,界面能夠接受用戶的操作,具有人機交互功能。用戶可以選擇重新開始游戲,退出游戲,暫停游戲和查找游戲幫助。</p><p> 界面中包含坦克,樹,河流,阻擋墻和游戲用戶所要保護的“家”。</p><p> 坦克:坦克分為兩種,敵方坦克和用戶控制的坦克。用戶方和敵方坦克均可以發(fā)射子彈,可以改變路徑
7、的行走,且在行走過程中遇到墻等阻礙物和游戲邊界時要改變方向,而不能一直頂著障礙物不放。坦克之間不能穿越,碰撞到后自動調(diào)換方向。</p><p> 樹:界面中要包括樹林,作為遮掩物體和修飾物體,以便增加游戲的元素,使得游戲更加貼切人性化。樹的數(shù)目不限,以游戲整體界面清晰美觀來決定數(shù)目。</p><p> 河流:界面中要包括河流,河流作用與樹林相同,同樣河流的數(shù)目不限,以游戲界面整體美觀度
8、來決定數(shù)目。</p><p> 墻:墻體分為兩種,普通的墻和鐵墻,普通的墻在受到子彈襲擊時會損壞,而鐵墻可以阻礙子彈的穿越。兩方的坦克均不能穿越兩種墻體,但都可以摧毀普通墻體。普通墻體的數(shù)目配合其他元素合理安排,鐵墻則不宜過多,不然游戲難度太低甚至因為坦克不能穿越鐵墻而使得游戲無法進行下去。</p><p> “家”:用戶方除了有一輛自己的坦克外還有一個要保護的家,家由普通墻體包圍,家
9、受到子彈攻擊后游戲立即結(jié)束,用戶方則輸了本局游戲。</p><p> 子彈:子彈可以由敵方和用戶方發(fā)射,且發(fā)射出去的子彈可以直線移動,直到碰到障礙物就消失,子彈可以穿越樹林和河流。敵方坦克受到一顆子彈攻擊會爆炸從而導致死亡,死亡后坦克消失。用戶方受到子彈攻擊后會減少壽命,且受到四次攻擊則死亡,此時如還有敵方坦克存在,則用戶方輸?shù)舯敬斡螒颉?lt;/p><p> 爆炸:當子彈射擊到坦克身上時
10、,要產(chǎn)生爆炸效果。</p><p> 方向:坦克和子彈都有方向,可以選擇上下左右四個方向,且子彈的方向從屬于坦克的方向。</p><p><b> 1.2總體設計</b></p><p> 1.2.1總體設計功能圖</p><p> 1.2.2總體設計流程圖</p><p><b&g
11、t; 1.3類圖</b></p><p><b> 2詳細設計</b></p><p> 2.1詳細設計思路</p><p><b> 圖形用戶界面</b></p><p> 圖形用戶界面要用到Java課程里的第10章的知識,需要用到抽象窗口工具集即AWT和Swing來設計實
12、現(xiàn),由于游戲需要有功能按鍵來控制游戲的重新開始,退出,暫停,幫助等,所以在實現(xiàn)過程中,設計菜單項。 </p><p> 坦克,河流,樹,家,墻等都是調(diào)用各自類里面的draw函數(shù)來畫出來,最后new一個圖形面板出來,把所有的元素都add進面板就可以了。界面的構(gòu)造在程序中由TankClient類的構(gòu)造方法來完成,即沒構(gòu)造一個用戶類都會產(chǎn)生這樣一個包含
13、各種游戲元素在內(nèi)的界面。由于畫面是靜止的,而我們游戲的畫面要求是動態(tài)的,游戲中的坦克和子彈都是在不斷的動,可穿透的普通墻體也在“動”,所以對于畫面,必須要不斷的更新,重畫才能產(chǎn)生動態(tài)的效果。</p><p> 在程序中,此部分功能也是由TankClient類里的update函數(shù)和framPaint函數(shù)共同實現(xiàn),將“動”的元素進行重畫,而不動的元素如菜單項就不用重畫,所以這也是為什么把菜單項設計進TankClie
14、nt類的構(gòu)造方法中。當然,圖形用戶界面中也包括對各種界面元素的大小,位置和顏色等設計,細節(jié)問題這里就不贅述。</p><p><b> 界面中的元素</b></p><p> 界面中的元素都是在構(gòu)造界面的時候用界面實例對象的add方法加入進去的,且“動”的元素要不斷更新重畫。</p><p><b> 坦克</b>&
15、lt;/p><p> 坦克主要由Tank類來實現(xiàn)。坦克的屬性:速度(有X軸和Y軸速度之分),坦克大小,坦克所在新的位置(X坐標和Y坐標),坦克是否還活著,行動方向等。所有的這些屬性都有一個初始化值,從而在游戲一開始就可以運行。</p><p> 在設計過程中,坦克出現(xiàn)的位置由坐標而定。用戶方之后的位置由鍵盤監(jiān)聽方向,按指定方向以恒定的速度前進——此速度為全局靜態(tài)變量,當沒有接受到鍵盤的控制
16、時,則保持靜止。敵方的坦克則是根據(jù)隨機數(shù)來控制隨機的方向和路徑的,當敵方坦克撞到阻礙物時,會轉(zhuǎn)回到前一步的位置,從而解決了坦克撞到阻礙物不回頭的問題,這個功能由Tank類里的changToOldDir()方法實現(xiàn)。</p><p> 坦克的方向和子彈發(fā)射以及游戲的重新開始都是由鍵盤來控制的,所以在Tank類里面必須要實現(xiàn)這些功能。</p><p> Tank類的keyPressed()
17、方法用于接受鍵盤的按鍵監(jiān)聽,接收到相應的鍵盤信息后,如接收到F,則表示發(fā)射子彈,所以此時要調(diào)用Tank類里的fire()方法,fire()方法不帶傳遞參數(shù),因為子彈的方向總是從屬于坦克的方向和位置。 </p><p> 由于坦克在碰到墻,界面邊界和“家”等阻礙物時要改變方向,所以在Tank里面必須對于每一種阻礙物要設計一個方法來作為應對策略,當然解決方法是把下一步的位置調(diào)整到上一步的位置。</p>
18、<p> 用戶方Tank還可以吃紅心來增加自己的生命值,得到一個紅心,增加100生命值。所以在程序中坦克必須要有一個方法來判斷當坦克接觸到紅心時,生命值增加的方法。程序中用eat()方法來實現(xiàn)“吃”紅心并且增加生命值,當然,這其中要使得坦克的生命值不會超過自己生命的極限值200,所以判斷的時候,當生命小于等于100時,直接加100生命值,但是當生命值大于100時,就只能使生命值加滿到極限值200.當然,說到生命值,一定要在
19、圖形用戶界面中顯示出來,所以在Tank類里面一定要設計一個方法,來畫出生命的增減過程,在Tank類里面是用DrawBloodbBar()來刻畫。</p><p><b> 樹林</b></p><p> 樹林主要是用來做修飾物體的,具有不透明性。由一個Tree類來描述,Tree有兩個屬性,位置和長寬。樹的類里有一個自己的構(gòu)造方法,當然還有一個必不可少的draw()
20、方法。</p><p><b> 河流</b></p><p> 河流的作用與樹林類似,這里不再贅述。</p><p><b> 墻體</b></p><p> 墻體分為普通墻和鐵墻。普通墻可以被子彈損壞,而鐵墻則不會。</p><p><b> 普通墻&
21、lt;/b></p><p> 普通墻有以下幾個屬性:墻的固定長度和寬度,墻的位置坐標,墻體是由圖片加入到圖形用戶界面來表示的。程序中用CommonWall類來描述普通墻,此類里有一個構(gòu)造方法,用于傳遞參數(shù),還有一個draw()方法,來畫指定位置的墻,另外還有個getRect()方法來構(gòu)造長方形實例。</p><p><b> 金屬墻</b></p&g
22、t;<p> 金屬墻的參數(shù)和普通墻完全類似,只不過金屬墻不能被子彈穿破,但這個屬性在接下來討論的子彈的屬性里面,由于上面已經(jīng)給出里普通墻的屬性,所以這里將不再贅述金屬墻的屬性了。</p><p><b> 家:</b></p><p> 家是由Home類來抽象的,具體的屬性有:家的大小,家的位置,家的存活狀態(tài),與樹林和河流一樣,家還有draw()和
23、自己的構(gòu)造方法,作用也和前面的一樣,但是家還有一些新的方法,因為可以在游戲中重新開始游戲,所以要有設置方法讓家重新“活”起來,當然,有時候要判斷家現(xiàn)在的存活狀態(tài),所以就必須要isLive()和setLive()兩個方法了。除此之外,還要有一個游戲結(jié)束界面的清理工作和提示工作,gameover()方法就是解決這個問題的。</p><p><b> 子彈:</b></p><
24、;p> 子彈的屬性:子彈前進的X軸和Y軸的速度——初始速度都為10,子彈的長度和寬度——初始的長寬都為10,子彈的位置,子彈的方向,子彈是否live等。由于不同方向的子彈其實是圖片,所以這里要考慮不同圖片的選擇用對應的方向來指定,所以要建立Map鍵值對,用String屬性的方向來指定不同的圖片。如:imgs.put("L", bulletImages[0]);</p><p> 類里
25、面慣例有個構(gòu)造方法,用來默認傳遞位置和方向,當然這里用到了同構(gòu),另外一個構(gòu)造函數(shù)來取得子彈的狀態(tài)和界面。darw()方法和move()方法來控制畫子彈和移動子彈</p><p> 接下來就是要考慮到子彈打到個=各元素上的反應,敵方的子彈打到敵方時,不會殺死自己人,所以這里只要直接return true就可以了,不用移除子彈碰到的坦克,更不用調(diào)用爆炸來顯示爆炸效果。</p><p><
26、;b> 具體代碼如下:</b></p><p> public boolean hitTanks(List<Tank> tanks) {//當子彈打到坦克時</p><p> for (int i = 0; i < tanks.size(); i++) {</p><p> if (hitTank(tanks.get(i)
27、)) { //對每一個坦克,調(diào)用hitTank</p><p> return true;</p><p><b> }</b></p><p><b> }</b></p><p> return false;</p><p><b> }<
28、;/b></p><p> 子彈打到其他坦克上時用hitTank(Tank t)方法,子彈打到墻上時用hitWall(CommonWall w)方法,打到金屬墻上時用hitWall(MetalWall w)方法,打到家時用hitHome()方法,當然在這些方法里,都要作相應的操作來表示接受到子彈的效果,普通墻要移除對應的位置,所以在方法里面又要調(diào)用remove()方法來移除,如打到家上,就要把home的生
29、命設置為false,從而結(jié)束游戲。實現(xiàn)如下:</p><p> public boolean hitHome() { //當子彈打到家時</p><p> if (this.live && this.getRect().intersects(tc.home.getRect())) {</p><p> this.live = false;&
30、lt;/p><p> this.tc.home.setLive(false); //當家接受一槍時就死亡</p><p> return true;</p><p><b> }</b></p><p> return false;</p><p><b> }</b>
31、</p><p> 還有,當子彈射擊到敵方時,敵方坦克爆炸;當敵方射擊到用戶方時,用戶方要減少生命值,每接受一槍,就執(zhí)行t.setLife(t.getLife() - 50); // 受一粒子彈壽命減少50,接受4槍就死,總生命值200,當然方法里面還要做其他很多的判斷,如生命值是否小于0,如果是的話就執(zhí)行t.setLive(false);從而結(jié)束游戲。</p><p><b&g
32、t; 爆炸:</b></p><p> 坦克的爆炸效果獨立出來用一個類來描述,爆炸的屬性:位置和存活狀態(tài),另外,畫爆炸效果的時候要取得用戶界面控制,所以要定義private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小異。</p><p><b> 菜單功能</b></p
33、><p> 菜單功能包括游戲的重新開始,暫停,退出等。這些功能的用戶界面放在了TankClient的構(gòu)造方法里,用到的是面板類和相應的監(jiān)聽功能,實現(xiàn)出來很簡單。</p><p><b> 2.2類圖詳細說明</b></p><p> Direction 是一個枚舉類 有L, U, R, D, STOP表示左,上,右, 下
34、和靜止五個狀態(tài)</p><p> River 描述河流的類</p><p><b> 屬性:</b></p><p> Home 表示用戶方的家的類</p><p><b> 屬性:</b></p><p> Tree 描述樹林的類 </p&g
35、t;<p><b> 屬性: </b></p><p> Bullets 描述子彈的類</p><p><b> 屬性:</b></p><p> GetBlood 血包描述類</p><p><b> 屬性:</b></p><
36、;p> CommonWall 普通墻的類</p><p><b> 屬性:</b></p><p> MetalWall 金屬墻的類</p><p><b> 屬性:</b></p><p> BombTank 坦克爆炸類</p><p><b
37、> 屬性:</b></p><p> Tank 描述Tank的類</p><p><b> 屬性:</b></p><p> TankClient 坦克用戶類,繼承Frame,實現(xiàn)ActionListener接口</p><p> 實例化各個類的容器:</p><p&
38、gt; List<River> theRiver = new ArrayList<River>();</p><p> List<Tank> tanks = new ArrayList<Tank>();</p><p> List<BombTank> bombTanks = new ArrayList<BombTank
39、>();</p><p> List<Bullets> bullets = new ArrayList<Bullets>();</p><p> List<Tree> trees = new ArrayList<Tree>();</p><p> List<CommonWall> homeWal
40、l = new ArrayList<CommonWall>(); // 實例化對象容器</p><p> List<CommonWall> otherWall = new ArrayList<CommonWall>();</p><p> List<MetalWall> metalWall = new ArrayList<Metal
41、Wall>();</p><p> 下面列表只列出主要方法和變量</p><p><b> 屬性:</b></p><p> 用戶類主要是綜合調(diào)用各個類來協(xié)作完成完成游戲的設計。</p><p> 2.3詳細設計流程圖</p><p><b> 3編碼實現(xiàn)</b&g
42、t;</p><p><b> 源代碼</b></p><p> import java.awt.Graphics;</p><p> import java.awt.Image;</p><p> import java.awt.Rectangle;</p><p> import j
43、ava.awt.Toolkit;</p><p> import java.util.ArrayList;</p><p> import javax.swing.JOptionPane;</p><p> import java.awt.*;</p><p> import java.util.HashMap;</p>
44、<p> import java.util.List;</p><p> import java.util.Map;</p><p> import java.util.Random;</p><p> import java.awt.Color;</p><p> import java.awt.Font;</p
45、><p> import java.awt.event.*;</p><p> import java.util.*;</p><p> public class TankClient extends Frame implements ActionListener {</p><p> public static void main(St
46、ring[] args) {</p><p> new TankClient(); // 實例化</p><p><b> }</b></p><p> private static final long serialVersionUID = 1L;</p><p> public static final in
47、t Fram_width = 800; // 靜態(tài)全局窗口大小</p><p> public static final int Fram_length = 600;</p><p> public static boolean printable = true;</p><p> MenuBar jmb = null;</p><p>
48、; Menu jm1 = null, jm2 = null, jm3 = null, jm4 = null;</p><p> MenuItem jmi1 = null, jmi2 = null, jmi3 = null, jmi4 = null, jmi5 = null,</p><p> jmi6 = null, jmi7 = null, jmi8 = null, jmi9 =
49、null;</p><p> Image screenImage = null;</p><p> Tank homeTank = new Tank(300, 560, true, Direction.STOP, this);// 實例化坦克</p><p> GetBlood blood = new GetBlood(); // 實例化生命</p>
50、;<p> Home home = new Home(373, 545, this);// 實例化home</p><p> List<River> theRiver = new ArrayList<River>();</p><p> List<Tank> tanks = new ArrayList<Tank>();&l
51、t;/p><p> List<BombTank> bombTanks = new ArrayList<BombTank>();</p><p> List<Bullets> bullets = new ArrayList<Bullets>();</p><p> List<Tree> trees = ne
52、w ArrayList<Tree>();</p><p> List<CommonWall> homeWall = new ArrayList<CommonWall>(); // 實例化對象容器</p><p> List<CommonWall> otherWall = new ArrayList<CommonWall>();
53、</p><p> List<MetalWall> metalWall = new ArrayList<MetalWall>();</p><p> public void update(Graphics g) {</p><p> screenImage = this.createImage(Fram_width, Fram_leng
54、th);</p><p> Graphics gps = screenImage.getGraphics();</p><p> Color c = gps.getColor();</p><p> gps.setColor(Color.GRAY);</p><p> gps.fillRect(0, 0, Fram_width, Fr
55、am_length);</p><p> gps.setColor(c);</p><p> framPaint(gps);</p><p> g.drawImage(screenImage, 0, 0, null);</p><p><b> }</b></p><p> public
56、 void framPaint(Graphics g) {</p><p> Color c = g.getColor();</p><p> g.setColor(Color.green); // 設置字體顯示屬性</p><p> Font f1 = g.getFont();</p><p> g.setFont(new Font
57、("TimesRoman", Font.BOLD, 20));</p><p> g.drawString("區(qū)域內(nèi)還有敵方坦克: ", 200, 70);</p><p> g.setFont(new Font("TimesRoman", Font.ITALIC, 30));</p><p> g.
58、drawString("" + tanks.size(), 400, 70);</p><p> g.setFont(new Font("TimesRoman", Font.BOLD, 20));</p><p> g.drawString("剩余生命值: ", 500, 70);</p><p>
59、g.setFont(new Font("TimesRoman", Font.ITALIC, 30));</p><p> g.drawString("" + homeTank.getLife(), 650, 70);</p><p> g.setFont(f1);</p><p> if (tanks.size() ==
60、 0 && home.isLive() && homeTank.isLive()) {</p><p> Font f = g.getFont();</p><p> g.setFont(new Font("TimesRoman", Font.BOLD, 60)); // 判斷是否贏得比賽</p><p>
61、this.otherWall.clear();</p><p> g.drawString("你贏了! ", 310, 300);</p><p> g.setFont(f);</p><p><b> }</b></p><p> if (homeTank.isLive() == false
62、) {</p><p> Font f = g.getFont();</p><p> g.setFont(new Font("TimesRoman", Font.BOLD, 40));</p><p> tanks.clear();</p><p> bullets.clear();</p><
63、;p> g.setFont(f);</p><p><b> }</b></p><p> g.setColor(c);</p><p> for (int i = 0; i < theRiver.size(); i++) { // 畫出河流</p><p> River r = theRiver.
64、get(i);</p><p> r.draw(g);</p><p><b> }</b></p><p> for (int i = 0; i < theRiver.size(); i++) {</p><p> River r = theRiver.get(i);</p><p&g
65、t; homeTank.collideRiver(r);</p><p> r.draw(g);</p><p><b> }</b></p><p> home.draw(g); // 畫出home</p><p> homeTank.draw(g);// 畫出自己家的坦克</p><p&
66、gt; homeTank.eat(blood);// 充滿血--生命值</p><p> for (int i = 0; i < bullets.size(); i++) { // 對每一個子彈</p><p> Bullets m = bullets.get(i);</p><p> m.hitTanks(tanks); // 每一個子彈打到坦克上&
67、lt;/p><p> m.hitTank(homeTank); // 每一個子彈打到自己家的坦克上時</p><p> m.hitHome(); // 每一個子彈打到家里是</p><p> for (int j = 0; j < metalWall.size(); j++) { // 每一個子彈打到金屬墻上</p><p> Me
68、talWall mw = metalWall.get(j);</p><p> m.hitWall(mw);</p><p><b> }</b></p><p> for (int j = 0; j < otherWall.size(); j++) {// 每一個子彈打到其他墻上</p><p> Com
69、monWall w = otherWall.get(j);</p><p> m.hitWall(w);</p><p><b> }</b></p><p> for (int j = 0; j < homeWall.size(); j++) {// 每一個子彈打到家的墻上</p><p> Common
70、Wall cw = homeWall.get(j);</p><p> m.hitWall(cw);</p><p><b> }</b></p><p> m.draw(g); // 畫出效果圖</p><p><b> }</b></p><p> for (i
71、nt i = 0; i < tanks.size(); i++) {</p><p> Tank t = tanks.get(i); // 獲得鍵值對的鍵</p><p> for (int j = 0; j < homeWall.size(); j++) {</p><p> CommonWall cw = homeWall.get(j);<
72、;/p><p> t.collideWithWall(cw); // 每一個坦克撞到家里的墻時</p><p> cw.draw(g);</p><p><b> }</b></p><p> for (int j = 0; j < otherWall.size(); j++) { // 每一個坦克撞到家以外的
73、墻</p><p> CommonWall cw = otherWall.get(j);</p><p> t.collideWithWall(cw);</p><p> cw.draw(g);</p><p><b> }</b></p><p> for (int j = 0; j
74、< metalWall.size(); j++) { // 每一個坦克撞到金屬墻</p><p> MetalWall mw = metalWall.get(j);</p><p> t.collideWithWall(mw);</p><p> mw.draw(g);</p><p><b> }</b>
75、</p><p> for (int j = 0; j < theRiver.size(); j++) {</p><p> River r = theRiver.get(j); // 每一個坦克撞到河流時</p><p> t.collideRiver(r);</p><p> r.draw(g);</p>&l
76、t;p> // t.draw(g);</p><p><b> }</b></p><p> t.collideWithTanks(tanks); // 撞到自己的人</p><p> t.collideHome(home);</p><p> t.draw(g);</p><p>
77、;<b> }</b></p><p> blood.draw(g);</p><p> for (int i = 0; i < trees.size(); i++) { // 畫出trees</p><p> Tree tr = trees.get(i);</p><p> tr.draw(g);<
78、;/p><p><b> }</b></p><p> for (int i = 0; i < bombTanks.size(); i++) { // 畫出爆炸效果</p><p> BombTank bt = bombTanks.get(i);</p><p> bt.draw(g);</p>
79、<p><b> }</b></p><p> for (int i = 0; i < otherWall.size(); i++) { // 畫出otherWall</p><p> CommonWall cw = otherWall.get(i);</p><p> cw.draw(g);</p>&l
80、t;p><b> }</b></p><p> for (int i = 0; i < metalWall.size(); i++) { // 畫出metalWall</p><p> MetalWall mw = metalWall.get(i);</p><p> mw.draw(g);</p><p
81、><b> }</b></p><p> homeTank.collideWithTanks(tanks);</p><p> homeTank.collideHome(home);</p><p> for (int i = 0; i < metalWall.size(); i++) {// 撞到金屬墻</p>
82、<p> MetalWall w = metalWall.get(i);</p><p> homeTank.collideWithWall(w);</p><p> w.draw(g);</p><p><b> }</b></p><p> for (int i = 0; i < oth
83、erWall.size(); i++) {</p><p> CommonWall cw = otherWall.get(i);</p><p> homeTank.collideWithWall(cw);</p><p> cw.draw(g);</p><p><b> }</b></p>&l
84、t;p> for (int i = 0; i < homeWall.size(); i++) { // 家里的坦克撞到自己家</p><p> CommonWall w = homeWall.get(i);</p><p> homeTank.collideWithWall(w);</p><p> w.draw(g);</p>&
85、lt;p><b> }</b></p><p><b> }</b></p><p> public TankClient() {</p><p> // printable = false;</p><p> // 創(chuàng)建菜單及菜單選項</p><p> j
86、mb = new MenuBar();</p><p> jm1 = new Menu("游戲");</p><p> jm2 = new Menu("暫停/繼續(xù)");</p><p> jm3 = new Menu("幫助");</p><p> jm4 = new Men
87、u("游戲級別");</p><p> jm1.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設置菜單顯示的字體</p><p> jm2.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設置菜單顯示的字體</p&g
88、t;<p> jm3.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設置菜單顯示的字體</p><p> jm4.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設置菜單顯示的字體</p><p> jmi1 = new Me
89、nuItem("開始新游戲");</p><p> jmi2 = new MenuItem("退出");</p><p> jmi3 = new MenuItem("暫停");</p><p> jmi4 = new MenuItem("繼續(xù)");</p><p
90、> jmi5 = new MenuItem("游戲說明");</p><p> jmi6 = new MenuItem("級別1");</p><p> jmi7 = new MenuItem("級別2");</p><p> jmi8 = new MenuItem("級別3&quo
91、t;);</p><p> jmi9 = new MenuItem("級別4");</p><p> jmi1.setFont(new Font("TimesRoman", Font.BOLD, 15));</p><p> jmi2.setFont(new Font("TimesRoman", Fo
92、nt.BOLD, 15));</p><p> jmi3.setFont(new Font("TimesRoman", Font.BOLD, 15));</p><p> jmi4.setFont(new Font("TimesRoman", Font.BOLD, 15));</p><p> jmi5.setFont(
93、new Font("TimesRoman", Font.BOLD, 15));</p><p> jm1.add(jmi1);</p><p> jm1.add(jmi2);</p><p> jm2.add(jmi3);</p><p> jm2.add(jmi4);</p><p>
94、jm3.add(jmi5);</p><p> jm4.add(jmi6);</p><p> jm4.add(jmi7);</p><p> jm4.add(jmi8);</p><p> jm4.add(jmi9);</p><p> jmb.add(jm1);</p><p>
95、 jmb.add(jm2);</p><p> jmb.add(jm4);</p><p> jmb.add(jm3);</p><p> jmi1.addActionListener(this);</p><p> jmi1.setActionCommand("NewGame");</p><
96、p> jmi2.addActionListener(this);</p><p> jmi2.setActionCommand("Exit");</p><p> jmi3.addActionListener(this);</p><p> jmi3.setActionCommand("Stop");</p
97、><p> jmi4.addActionListener(this);</p><p> jmi4.setActionCommand("Continue");</p><p> jmi5.addActionListener(this);</p><p> jmi5.setActionCommand("help
98、");</p><p> jmi6.addActionListener(this);</p><p> jmi6.setActionCommand("level1");</p><p> jmi7.addActionListener(this);</p><p> jmi7.setActionComman
99、d("level2");</p><p> jmi8.addActionListener(this);</p><p> jmi8.setActionCommand("level3");</p><p> jmi9.addActionListener(this);</p><p> jmi9.s
100、etActionCommand("level4");</p><p> this.setMenuBar(jmb);// 菜單Bar放到JFrame上</p><p> this.setVisible(true);</p><p> for (int i = 0; i < 10; i++) { // 家的格局</p>&l
101、t;p> if (i < 4)</p><p> homeWall.add(new CommonWall(350, 580 - 21 * i, this));</p><p> else if (i < 7)</p><p> homeWall.add(new CommonWall(372 + 22 * (i - 4), 517, this
102、));</p><p><b> else</b></p><p> homeWall.add(new CommonWall(416, 538 + (i - 7) * 21, this));</p><p><b> }</b></p><p> for (int i = 0; i <
103、 32; i++) {</p><p> if (i < 16) {</p><p> otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墻布局</p><p> otherWall.add(new CommonWall(500 + 20 * i, 180, this));</
104、p><p> otherWall.add(new CommonWall(200, 400 + 20 * i, this));</p><p> otherWall.add(new CommonWall(500, 400 + 20 * i, this));</p><p> } else if (i < 32) {</p><p>
105、otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this));</p><p> otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this));</p><p> otherWall.add(new CommonWall(220, 400 + 20 * (i -
106、16), this));</p><p> otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this));</p><p><b> }</b></p><p><b> }</b></p><p> for (int i = 0
107、; i < 20; i++) { // 金屬墻布局</p><p> if (i < 10) {</p><p> metalWall.add(new MetalWall(140 + 30 * i, 150, this));</p><p> metalWall.add(new MetalWall(600, 400 + 20 * (i), this
108、));</p><p> } else if (i < 20)</p><p> metalWall.add(new MetalWall(140 + 30 * (i - 10), 180, this));</p><p><b> else</b></p><p> metalWall.add(new Me
109、talWall(500 + 30 * (i - 10), 160, this));</p><p><b> }</b></p><p> for (int i = 0; i < 4; i++) { // 樹的布局</p><p> if (i < 4) {</p><p> trees.add(ne
110、w Tree(0 + 30 * i, 360, this));</p><p> trees.add(new Tree(220 + 30 * i, 360, this));</p><p> trees.add(new Tree(440 + 30 * i, 360, this));</p><p> trees.add(new Tree(660 + 30 *
111、i, 360, this));</p><p><b> }</b></p><p><b> }</b></p><p> theRiver.add(new River(85, 100, this));</p><p> for (int i = 0; i < 20; i++) {
112、// 初始化20輛坦克</p><p> if (i < 9) // 設置坦克出現(xiàn)的位置</p><p> tanks.add(new Tank(150 + 70 * i, 40, false, Direction.D, this));</p><p> else if (i < 15)</p><p> tanks.ad
113、d(new Tank(700, 140 + 50 * (i - 6), false, Direction.D,</p><p><b> this));</b></p><p><b> else</b></p><p><b> tanks</b></p><p>
114、.add(new Tank(10, 50 * (i - 12), false, Direction.D,</p><p><b> this));</b></p><p><b> }</b></p><p> this.setSize(Fram_width, Fram_length); // 設置界面大小</
115、p><p> this.setLocation(280, 50); // 設置界面出現(xiàn)的位置</p><p><b> this</b></p><p> .setTitle("坦克大戰(zhàn)——(重新開始:R鍵 開火:F鍵) 姓名:黃金星 班級:計科1201 學號
116、:20121183019");</p><p> this.addWindowListener(new WindowAdapter() { // 窗口監(jiān)聽關閉</p><p> public void windowClosing(WindowEvent e) {</p><p> System.exit(0);</p><p>
117、;<b> }</b></p><p><b> });</b></p><p> this.setResizable(false);</p><p> this.setBackground(Color.GREEN);</p><p> this.setVisible(true);<
118、/p><p> this.addKeyListener(new KeyMonitor());// 鍵盤監(jiān)聽</p><p> new Thread(new PaintThread()).start(); // 線程啟動</p><p><b> }</b></p><p> private class PaintTh
119、read implements Runnable {</p><p> public void run() {</p><p> while (printable) {</p><p> repaint();</p><p><b> try {</b></p><p> Thread.
120、sleep(50);</p><p> } catch (InterruptedException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><
121、;b> }</b></p><p><b> }</b></p><p> private class KeyMonitor extends KeyAdapter {</p><p> public void keyReleased(KeyEvent e) { // 監(jiān)聽鍵盤釋放</p><p>
122、; homeTank.keyReleased(e);</p><p><b> }</b></p><p> public void keyPressed(KeyEvent e) { // 監(jiān)聽鍵盤按下</p><p> homeTank.keyPressed(e);</p><p><b> }&l
123、t;/b></p><p><b> }</b></p><p> public void actionPerformed(ActionEvent e) {</p><p> if (e.getActionCommand().equals("NewGame")) {</p><p> p
124、rintable = false;</p><p> Object[] options = { "確定", "取消" };</p><p> int response = JOptionPane.showOptionDialog(this, "您確認要開始新游戲!", "",</p><
125、p> JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,</p><p> options, options[0]);</p><p> if (response == 0) {</p><p> printable = true;</p><p> this
126、.dispose();</p><p> new TankClient();</p><p><b> } else {</b></p><p> printable = true;</p><p> new Thread(new PaintThread()).start(); // 線程啟動</p>
127、<p><b> }</b></p><p> } else if (e.getActionCommand().endsWith("Stop")) {</p><p> printable = false;</p><p> } else if (e.getActionCommand().equals(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java坦克大戰(zhàn)課程設計報告
- java坦克大戰(zhàn)課程設計報告
- 基于java坦克大戰(zhàn)課程設計
- java坦克大戰(zhàn)課程設計報告
- java課程設計---基于java的坦克大戰(zhàn)
- java課程設計----基于java的坦克大戰(zhàn)
- java坦克大戰(zhàn)課程設計報告.doc
- java語言程序課程設計-- 坦克大戰(zhàn)
- java關于坦克大戰(zhàn)的課程設計報告
- java課程設計坦克大戰(zhàn)游戲(含代碼)
- 課程設計報告--坦克大戰(zhàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設計報告-- 坦克大戰(zhàn)游戲設計(java版)
- java版坦克大戰(zhàn)
- 新世紀坦克大戰(zhàn)課程設計報告
- java坦克大戰(zhàn)畢業(yè)設計論文
- 基于java語言的坦克大戰(zhàn)
- 基于java的游戲坦克大戰(zhàn)
- 基于java語言的坦克大戰(zhàn)
- 基于java的坦克大戰(zhàn)軟件程序設計
- 基于java的坦克大戰(zhàn)游戲開發(fā)
評論
0/150
提交評論