版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> Java課程設(shè)計</b></p><p><b> 任 務(wù) 書</b></p><p> 簡單電子游戲坦克大戰(zhàn)的設(shè)計</p><p><b> 1、主要內(nèi)容:</b></p><p> 設(shè)計一個簡單的坦克大戰(zhàn)電子游戲,可以允許多位玩家在
2、局域網(wǎng)</p><p><b> 中同時對戰(zhàn)</b></p><p> 系統(tǒng)要求:游戲具有圖形游戲界面,能讓用戶看到游戲所給出的反饋。</p><p> 有人機交互功能,使用戶操作指定的游戲元素,并且坦克具有生命值,能</p><p> 攻擊敵方,無法攻擊友方,而且坦克的攻擊具有視覺效果!</p>
3、<p> 具體要求(包括技術(shù)要求等):</p><p> 1.需要有圖形游戲界面,讓用戶能看到游戲給出的反饋</p><p> 2.有人機交互功能,使用戶能操作指定的游戲元素</p><p> 3.不同隊伍的坦克,須顯示不同外觀,已分辨敵我</p><p> 4.坦克能夠開火,攻擊敵方,但不能攻擊隊友</p>
4、<p> 5需要有不可被子彈穿透的墻</p><p> 6.坦克有生命值,并非被擊中一次就會爆炸</p><p> 7游戲結(jié)束后可重新開始</p><p> 學習并掌握以下技術(shù):Java、JavaBean 等</p><p> 熟練使用以下開發(fā)工具:Myeclipse 等</p><p> 實現(xiàn)
5、系統(tǒng)上述的功能。</p><p><b> 進度安排:</b></p><p> 12月28日 ~ 12月 29日:課程設(shè)計選題,查找參考資料 </p><p> 12月30日 ~ 1月1日: 完成系統(tǒng)設(shè)計和數(shù)據(jù)庫設(shè)計</p><p> 1月2日 ~ 1月4日: 完成程序代碼的編寫</p>
6、;<p> 1月4日 ~ 1月5日:系統(tǒng)測試與完善</p><p> 1月5日 ~ 1月6日:完成課程設(shè)計報告,準備答辯</p><p><b> 分工: </b></p><p><b> 摘 要</b></p><p> 隨著計算機的普及以及對電子游戲的認識,電子
7、游戲已被越來越多的人選作放松、娛樂的休閑方式;電子游戲既不需要專門購買游戲器材,也不需要寬闊的游戲場地,只需要一臺能獨立完成任務(wù)的計算機即可,它可以是人們工作、學習時用的計算機,并不需要另行配置,這比起傳統(tǒng)休閑游戲即省錢又省事。局域網(wǎng)游戲更是可以將現(xiàn)實空間中零散的計算機,組織起來,使其在邏輯空間中集中起來,使游戲的組織、開展變得輕松。如此輕松而又安逸的休閑方式,使得越來越多的人嘗試,甚至已經(jīng)將電子游戲作為主要休閑方式,既然有如此多的人使
8、用,那其中必然存在巨大的商機,即使人們不愿意為一個小小的休閑游戲花費金錢,但在游戲中添加廣告、游戲相關(guān)服務(wù)也包藏了巨大的財富;當然電子游戲的制作如今已是空前的火爆,大大小小的游戲公司橫空出世,都想在電子游戲制作這個行業(yè)里占據(jù)一席之地,而一款成功的電子游戲需要精心的策劃、分析、設(shè)計,只有這樣才能獲得游戲中包藏的財富,以及做出一款真正能夠讓玩家娛樂、放松的游戲,而不是騙取玩家錢財?shù)墓ぞ摺?lt;/p><p> 關(guān)鍵字:
9、電子游戲;坦克大戰(zhàn);</p><p><b> 目 錄</b></p><p> 一、 系統(tǒng)分析- 1 -</p><p> 可行性分析- 1 -</p><p> 需求分析- 1 -</p><p> 二、 概要設(shè)計- 2 -</p><p> 工作流
10、程圖- 2 -</p><p> 項目規(guī)劃- 3 -</p><p> 開發(fā)及運行環(huán)境- 3 -</p><p> 三、 詳細設(shè)計與算法實現(xiàn)- 4 -</p><p> 游戲主窗口- 4 -</p><p> 游戲元素- 8 -</p><p> 四、 測試- 10 -
11、</p><p> 測試環(huán)境- 10 -</p><p> 測試結(jié)果- 10 -</p><p> 五、 軟件截圖- 11 -</p><p> 六、 總結(jié)- 14 -</p><p> 七、 參考文獻- 15 -</p><p><b> 系統(tǒng)分析</b&
12、gt;</p><p><b> 可行性分析</b></p><p><b> 技術(shù)可行性</b></p><p> 軟件使用swing、GUI、Socket、面向?qū)ο笤O(shè)計等技術(shù)實現(xiàn),這些技術(shù)均已是非常成熟的技術(shù),之前已有相當多使用這些技術(shù)的成功案例,故現(xiàn)使用這些技術(shù)是可行的。</p><p>
13、;<b> 經(jīng)濟可行性</b></p><p> 本軟件為免費軟件,將免費提供軟件的下載、運行和維護服務(wù),軟件暫無收入,待公布之后隨著使用者越來越多,將添加相應(yīng)的廣告、服務(wù),從而增加收入,若使用者寥寥無幾,將再次分析是否重新策劃軟件或者放棄開發(fā),以減少損失。</p><p><b> 需求分析</b></p><p>
14、; 通過反復(fù)研究以及市場調(diào)查,得知游戲須具有以下功能:</p><p> 需要有圖形游戲界面,讓用戶能看到游戲給出的反饋</p><p> 不同隊伍的坦克,須顯示不同外觀,已分辨敵我</p><p> 坦克能夠開火,攻擊敵方</p><p><b> 坦克有生命值</b></p><p>
15、; 游戲結(jié)束時須判斷哪一隊勝利</p><p> 游戲結(jié)束后可重新開始</p><p> 游戲的操作、進度等須提供相應(yīng)說明,以告知玩家</p><p><b> 概要設(shè)計</b></p><p><b> 工作流程圖</b></p><p><b> 項
16、目規(guī)劃</b></p><p> 本游戲是一個典型的電子小游戲,應(yīng)具有如下結(jié)構(gòu):</p><p><b> 游戲主窗口</b></p><p> 游戲的一切效果、進度、消息等都將由游戲主窗口展示</p><p><b> 封裝的游戲元素</b></p><p&
17、gt; 游戲元素包括:坦克、子彈、等游戲必須的元素</p><p><b> 開發(fā)及運行環(huán)境</b></p><p><b> 開發(fā)時硬件環(huán)境</b></p><p> CPU:Inter P7350</p><p> 顯卡:NVIDIA GeForce 105M </p>
18、<p> 內(nèi)存:金士頓2G/DDR2-667</p><p> 顯示器:三星液晶14寸/分辨率:1280X800</p><p><b> 開發(fā)時軟件環(huán)境</b></p><p> 操作系統(tǒng):Windows7</p><p><b> JDK:1.5.0</b></p>
19、;<p> IDE:Eclipse3.4.0</p><p><b> 運行時硬件環(huán)境</b></p><p> CPU:Inter P7350</p><p> 顯卡:NVIDIA GeForce 105M</p><p> 內(nèi)存:金士頓2G/DDR2-667</p><p
20、><b> 運行時軟件環(huán)境</b></p><p> 操作系統(tǒng):Windows 7</p><p><b> JRE:1.6.0</b></p><p> 顯示器:三星液晶14寸/分辨率:1280X800</p><p><b> 詳細設(shè)計與算法實現(xiàn)</b>&l
21、t;/p><p><b> 游戲主窗口</b></p><p> 游戲主窗口是人機交互的窗口,對玩家而言,他們只和游戲主窗口打交道,并不關(guān)心游戲內(nèi)部是如何實現(xiàn)的,所以游戲主窗口部分最重要的便是游戲數(shù)據(jù)的輸入、輸出。</p><p> 在程序中須創(chuàng)建一個類TankClient,繼承自Frame來創(chuàng)建一個窗口。</p><p&
22、gt;<b> 游戲數(shù)據(jù)的輸入</b></p><p> 游戲中坦克需要能往上、下、左、右四個方向運動,故須設(shè)立4個按鍵,使其能操作坦克,另須設(shè)一個鍵控制坦克開火。為方便操作,本游戲設(shè)置方向鍵分別表示上下左右,空格表示開火。</p><p> 具體實現(xiàn)為在TankClient類中添加內(nèi)部的適配器類代碼如下:</p><p><b&g
23、t; /**</b></p><p> * 方向鍵被按下后標記被按下的鍵</p><p> * @param e 鍵盤事件</p><p><b> */</b></p><p> public void keyPressed(KeyEvent e) {</p><p>
24、int keyCode = e.getKeyCode();</p><p> switch (keyCode) {</p><p> case KeyEvent.VK_LEFT:</p><p> bL = true;</p><p><b> break;</b></p><p> c
25、ase KeyEvent.VK_UP:</p><p> bU = true;</p><p><b> break;</b></p><p> case KeyEvent.VK_RIGHT:</p><p> bR = true;</p><p><b> break;<
26、;/b></p><p> case KeyEvent.VK_DOWN:</p><p> bD = true;</p><p><b> break;</b></p><p> case KeyEvent.VK_CONTROL:</p><p> if (!this.hasMyM
27、issile())</p><p><b> fire();</b></p><p><b> break;</b></p><p> case KeyEvent.VK_A:</p><p> superFire();</p><p><b> break
28、;</b></p><p> case KeyEvent.VK_F2:</p><p> tc = null;</p><p> new TankClient("TankClient", 50, 10, 3);</p><p><b> break;</b></p>
29、<p><b> }</b></p><p> locateDirection();</p><p><b> }</b></p><p><b> /**</b></p><p> * 方向鍵被松開后標記被松開的鍵</p><p>
30、 * @param e 鍵盤事件</p><p><b> */</b></p><p> public void keyReleased(KeyEvent e) {</p><p> int keyCode = e.getKeyCode();</p><p> switch (keyCode) {</p
31、><p> case KeyEvent.VK_LEFT:</p><p> bL = false;</p><p><b> break;</b></p><p> case KeyEvent.VK_UP:</p><p> bU = false;</p><p>&
32、lt;b> break;</b></p><p> case KeyEvent.VK_RIGHT:</p><p> bR = false;</p><p><b> break;</b></p><p> case KeyEvent.VK_DOWN:</p><p>
33、 bD = false;</p><p><b> break;</b></p><p><b> }</b></p><p> locateDirection();</p><p><b> }</b></p><p><b>
34、/**</b></p><p> * 根據(jù)按下的鍵定位方向</p><p><b> */</b></p><p> public void locateDirection() {</p><p> if (bL && !bU && !bR && !bD
35、)</p><p> dir = Direction.L;</p><p> if (bL && bU && !bR && !bD)</p><p> dir = Direction.LU;</p><p> if (!bL && bU && !bR &a
36、mp;& !bD)</p><p> dir = Direction.U;</p><p> if (!bL && bU && bR && !bD)</p><p> dir = Direction.RU;</p><p> if (!bL && !bU &
37、;& bR && !bD)</p><p> dir = Direction.R;</p><p> if (!bL && !bU && bR && bD)</p><p> dir = Direction.RD;</p><p> if (!bL &&a
38、mp; !bU && !bR && bD)</p><p> dir = Direction.D;</p><p> if (bL && !bU && !bR && bD)</p><p> dir = Direction.LD;</p><p> if
39、(!bL && !bU && !bR && !bD)</p><p> dir = Direction.STOP;</p><p><b> }</b></p><p><b> /**</b></p><p> * 根據(jù)方向移動坦克</
40、p><p><b> */</b></p><p> public void move() {</p><p> lastX = x;</p><p> lastY = y;</p><p> switch (dir) {</p><p><b> cas
41、e L:</b></p><p> x -= SPEED;</p><p><b> break;</b></p><p><b> case LU:</b></p><p> x -= XYSPEED;</p><p> y -= XYSPEED;&l
42、t;/p><p><b> break;</b></p><p><b> case U:</b></p><p> y -= SPEED;</p><p><b> break;</b></p><p><b> case RU:<
43、;/b></p><p> x += XYSPEED;</p><p> y -= XYSPEED;</p><p><b> break;</b></p><p><b> case R:</b></p><p> x += SPEED;</p>
44、<p><b> break;</b></p><p><b> case RD:</b></p><p> x += XYSPEED;</p><p> y += XYSPEED;</p><p><b> break;</b></p>
45、<p><b> case D:</b></p><p> y += SPEED;</p><p><b> break;</b></p><p><b> case LD:</b></p><p> x -= XYSPEED;</p><
46、;p> y += XYSPEED;</p><p><b> break;</b></p><p> case STOP:</p><p><b> break;</b></p><p><b> }</b></p><p> if (
47、dir != Direction.STOP)</p><p> ptDir = dir;</p><p><b> //控制坦克不出界</b></p><p> if (x < 0)</p><p><b> x = 0;</b></p><p> if (y
48、 < 30) </p><p><b> y = 30;</b></p><p> if (x > TankClient.WINDOW_WIDTH - this.RADIUS * 2)</p><p> x = TankClient.WINDOW_WIDTH - this.RADIUS * 2;</p><
49、p> if (y > TankClient.WINDOW_HEIGHT - this.RADIUS * 2)</p><p> y = TankClient.WINDOW_HEIGHT - this.RADIUS * 2;</p><p><b> }</b></p><p><b> /**</b>&
50、lt;/p><p> * 根據(jù)坦克的位置和炮筒的方向發(fā)射炮彈</p><p><b> */</b></p><p> public void fire() {</p><p> if (!this.live) </p><p><b> return;</b><
51、/p><p> int x = this.x + Tank.RADIUS - Missile.RADIUS;</p><p> int y = this.y + Tank.RADIUS - Missile.RADIUS;</p><p> Missile m = new Missile(x, y, this.good, ptDir, this, tc);</
52、p><p> tc.missiles.add(m);</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 畫炮筒</b></p><p> * @param g Graphics對象<
53、/p><p><b> */</b></p><p> public void drawPT(Graphics g) {</p><p> int x1 = this.x + Tank.RADIUS;</p><p> int y1 = this.y + Tank.RADIUS;</p><p&g
54、t; int x2 = this.x + Tank.RADIUS;</p><p> int y2 = this.y + Tank.RADIUS;</p><p> switch (ptDir) {</p><p><b> case L:</b></p><p> x2 = x1 - PT_LENGTH;&l
55、t;/p><p><b> break;</b></p><p><b> case LU:</b></p><p> x2 = x1 - PT_XY;</p><p> y2 = y1 - PT_XY;</p><p><b> break;</b&g
56、t;</p><p><b> case U:</b></p><p> y2 = y1 - PT_LENGTH;</p><p><b> break;</b></p><p><b> case RU:</b></p><p> x2 =
57、x1 + PT_XY;</p><p> y2 = y1 - PT_XY;</p><p><b> break;</b></p><p><b> case R:</b></p><p> x2 = x1 + PT_LENGTH;</p><p><b>
58、 break;</b></p><p><b> case RD:</b></p><p> x2 = x1 + PT_XY;</p><p> y2 = y1 + PT_XY;</p><p><b> break;</b></p><p><b
59、> case D:</b></p><p> y2 = y1 + PT_LENGTH;</p><p><b> break;</b></p><p><b> case LD:</b></p><p> x2 = x1 - PT_XY;</p><p
60、> y2 = y1 + PT_XY;</p><p><b> break;</b></p><p><b> }</b></p><p> g.drawLine(x1, y1, x2, y2);</p><p><b> }</b></p>&l
61、t;p><b> 游戲數(shù)據(jù)的輸出</b></p><p> 玩家需要從游戲輸出數(shù)據(jù)中獲得游戲信息,如坦克在往上行駛、坦克發(fā)了顆子彈、坦克爆炸等,這些均需要通過游戲數(shù)據(jù)的輸出來告知玩家。</p><p> 由于TankClient繼承自Frame,F(xiàn)rame類中的方法paint,可以在窗口中繪制圖形,滿足了游戲需要圖形界面的需求</p><
62、;p><b> 代碼如下:</b></p><p><b> //主面版 </b></p><p> public void paint(Graphics g) {</p><p> if (this == null) </p><p><b> return;</b
63、></p><p> if (!myTank.isLive()) {</p><p> if (-- this.myTankNum > 0) {</p><p> myTank = new Tank(Tank_X, Tank_Y, true, this);</p><p><b> } else {</b&
64、gt;</p><p> g.drawString("GameOver!", 350, 280);</p><p> g.drawString("按F2鍵重新開始..", 340, 300);</p><p><b> return;</b></p><p><b>
65、; }</b></p><p><b> }</b></p><p> if (tankAllNum == 0) {</p><p> g.drawString(".:恭喜過關(guān)!:.", 350, 280);</p><p> g.drawString("按F2鍵重新開
66、始..", 340, 300);</p><p><b> return;</b></p><p><b> }</b></p><p> this.reinforceTank();</p><p> this.drawWalls(g);</p><p>
67、 this.drawMissiles(g);</p><p> this.drawMyTank(g);</p><p> this.drawEnemyTanks(g);</p><p> this.drawExplodes(g);</p><p> this.drawTreasure(g);</p><p>
68、 this.drawMessage(g);</p><p><b> }</b></p><p><b> /**</b></p><p> * 重寫update方法,先將窗體上的圖形畫在圖片對象上,再一次性顯示</p><p><b> */</b></p>
69、;<p> public void update(Graphics g) {</p><p> if (offScreenImage == null) {</p><p> offScreenImage = this.createImage(WINDOW_WIDTH, WINDOW_HEIGHT);</p><p><b> }<
70、;/b></p><p> Graphics gImage = offScreenImage.getGraphics();</p><p> Color c = gImage.getColor();</p><p> gImage.setColor(Color.GREEN);</p><p> gImage.fillRect(0
71、, 0, WINDOW_WIDTH, WINDOW_HEIGHT);</p><p> gImage.setColor(c);</p><p> paint(gImage);</p><p> g.drawImage(offScreenImage, 0, 0, null);</p><p><b> }</b>&
72、lt;/p><p><b> /**</b></p><p> * 用線程重畫,每隔一段時間重畫窗體</p><p> * @author Magci</p><p><b> *</b></p><p><b> */</b></p>
73、<p> private class PaintThread implements Runnable {</p><p><b> /**</b></p><p> * 每隔REFRESH_RATE毫秒重畫一次窗體</p><p><b> */</b></p><p> p
74、ublic void run() {</p><p> while (true) {</p><p> repaint();</p><p><b> try {</b></p><p> Thread.sleep(REFRESH_RATE);</p><p> } catch (Int
75、erruptedException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b
76、> }</b></p><p><b> /**</b></p><p> * 監(jiān)聽鍵盤事件,按方向鍵控制坦克移動</p><p> * @author Magci</p><p><b> *</b></p><p><b> */&
77、lt;/b></p><p> private class KeyMonitor extends KeyAdapter {</p><p><b> /**</b></p><p> * 處理按鍵被按下事件</p><p><b> */</b></p><p>
78、; public void keyPressed(KeyEvent e) {</p><p> myTank.keyPressed(e);</p><p><b> }</b></p><p><b> /**</b></p><p> * 處理按鍵被松開事件</p><
79、;p><b> */</b></p><p> public void keyReleased(KeyEvent e) {</p><p> myTank.keyReleased(e);</p><p><b> }</b></p><p><b> }</b>
80、</p><p><b> /**</b></p><p><b> * 敵方坦克增援</b></p><p><b> */</b></p><p> public void reinforceTank() {</p><p> if (ta
81、nkNum < tankMaxNum && tankAllNum > tankNum) {</p><p> int i = rand.nextInt(10);</p><p> Tank enemyTank = new Tank(200 + 50 * i, 100, false, this);</p><p> if (!enem
82、yTank.collidesWithTank(myTank, true) && !enemyTank.collidesWithTanks(enemyTanks, true)) {</p><p> enemyTanks.add(enemyTank);</p><p> this.tankNum ++;</p><p><b> }&l
83、t;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p><b> * 加入墻</b></p><p> * @param g
84、Graphics對象</p><p><b> */</b></p><p> public void drawWalls(Graphics g) {</p><p> for (int i = 0; i < walls.size(); i++) {</p><p> Wall wall = walls.g
85、et(i);</p><p> wall.draw(g);</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p><b> * 畫我方坦克</b&g
86、t;</p><p> * @param g Graphics對象</p><p><b> */</b></p><p> public void drawMyTank(Graphics g) {</p><p> if (myTank != null) {</p><p> myTa
87、nk.draw(g);</p><p> myTank.collidesWithWalls(walls);</p><p> if (trea != null)</p><p> myTank.eatTreasure(trea);</p><p><b> }</b></p><p>&l
88、t;b> }</b></p><p><b> /**</b></p><p><b> * 畫敵方坦克</b></p><p> * @param g Graphics對象</p><p><b> */</b></p><p&
89、gt; public void drawEnemyTanks(Graphics g) {</p><p> for (int i = 0; i < enemyTanks.size(); i++) {</p><p> Tank enemyTank = enemyTanks.get(i);</p><p> enemyTank.draw(g);</
90、p><p> enemyTank.collidesWithWalls(walls);</p><p> enemyTank.collidesWithTank(myTank, false);</p><p> enemyTank.collidesWithTanks(enemyTanks, false);</p><p><b>
91、}</b></p><p><b> }</b></p><p><b> /**</b></p><p><b> * 畫炮彈</b></p><p> * @param g Graphics對象</p><p><b>
92、 */</b></p><p> public void drawMissiles(Graphics g) {</p><p> for (int i = 0; i < missiles.size(); i++) {</p><p> Missile m = missiles.get(i);</p><p> if
93、 (m != null) {</p><p> m.draw(g);</p><p> m.hitTanks(enemyTanks);</p><p> m.hitTank(myTank);</p><p> m.hitWalls(walls);</p><p> m.hitMissiles(missiles
94、);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p><b> * 加入爆炸 </
95、b></p><p> * @param g Graphics對象</p><p><b> */</b></p><p> public void drawExplodes(Graphics g) {</p><p> for (int i=0; i < explodes.size(); i++)
96、{</p><p> Explode e = explodes.get(i);</p><p> e.draw(g);</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b><
97、/p><p><b> * 出現(xiàn)寶物</b></p><p> * @param g Graphics對象</p><p><b> */</b></p><p> public void drawTreasure(Graphics g) {</p><p> if (
98、rand.nextInt(100) == 0)</p><p> trea = null;</p><p> if (rand.nextInt(300) == 0) {</p><p> int x = rand.nextInt(785);</p><p> int y = rand.nextInt(555);</p>
99、<p> trea = new Treasure(x,y + 30,15,15);</p><p><b> }</b></p><p> if (trea != null) {</p><p> trea.collidesWithWalls(walls);</p><p> trea.draw(g)
100、;</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p><b> * 打印信息</b></p><p> * @param g Graphi
101、cs對象</p><p><b> */</b></p><p> public void drawMessage(Graphics g) {</p><p> g.drawString("EnemyTanks Count: " + enemyTanks.size(), 10, 50);</p><
102、p> g.drawString("All EnemyTanks Count: " + this.tankAllNum, 10, 70);</p><p> g.drawString("MyTank Count: " + this.myTankNum, 10, 90);</p><p> g.drawString("MyTank
103、Life: " + myTank.getLife(), 10, 110);</p><p><b> }</b></p><p><b> /**</b></p><p> * 返回敵方坦克總數(shù)量</p><p> * @return 敵方坦克總數(shù)量</p><
104、p><b> */</b></p><p> public int getTankAllNum() {</p><p> return tankAllNum;</p><p><b> }</b></p><p><b> /**</b></p>
105、<p> * 設(shè)置敵方坦克總數(shù)量</p><p> * @param tankAllNum 敵方坦克總數(shù)量</p><p><b> */</b></p><p> public void setTankAllNum(int tankAllNum) {</p><p> this.tankAllNum
106、 = tankAllNum;</p><p><b> }</b></p><p><b> /**</b></p><p> * 返回當前敵方坦克數(shù)量</p><p> * @return 返回當前敵方坦克數(shù)量</p><p><b> */</b
107、></p><p> public int getTankNum() {</p><p> return tankNum;</p><p><b> }</b></p><p><b> /**</b></p><p> * 設(shè)置當前敵方坦克數(shù)量</p&
108、gt;<p> * @param tankNum 當前敵方坦克數(shù)量</p><p><b> */</b></p><p> public void setTankNum(int tankNum) {</p><p> this.tankNum = tankNum;</p><p><b>
109、; }</b></p><p><b> }</b></p><p> class Tank {</p><p><b> /**</b></p><p> * 坦克水平垂直移動時X、Y軸上的速度</p><p><b> */</b&
110、gt;</p><p> public static final int SPEED = 5;</p><p><b> /**</b></p><p> * 坦克45度移動時X、Y軸上的速度</p><p><b> */</b></p><p> public
111、static final int XYSPEED = (int) (Math.sqrt(2) * SPEED / 2);</p><p><b> /**</b></p><p><b> * 坦克的半徑</b></p><p><b> */</b></p><p>
112、 public static final int RADIUS = 15;</p><p><b> /**</b></p><p><b> * 炮筒長度</b></p><p><b> */</b></p><p> public static final int
113、 PT_LENGTH = 20;</p><p><b> /**</b></p><p> * 45度炮筒的X、Y坐標偏移量</p><p><b> */</b></p><p> public static final int PT_XY = (int) (Math.sqrt(2) *
114、 PT_LENGTH) / 2;</p><p><b> /**</b></p><p><b> * 坦克初始生命值</b></p><p><b> */</b></p><p> public static final int LIFE = 100;</p
115、><p> // 坦克左上角位置</p><p> private int x, y;</p><p> // 標記方向鍵的狀態(tài):true表示被按下,false表示被松開</p><p> private boolean bL = false, bU = false, bR = false, bD = false;</p>
116、<p> // 定義八個方向和停止狀態(tài)</p><p> enum Direction {</p><p> L, LU, U, RU, R, RD, D, LD, STOP</p><p><b> };</b></p><p><b> /**</b></p>
117、<p><b> * 坦克方向</b></p><p><b> */</b></p><p> public Direction dir = Direction.STOP;</p><p><b> /**</b></p><p><b> *
118、坦克炮筒方向</b></p><p><b> */</b></p><p> public Direction ptDir = Direction.U;</p><p> TankClient tc = null;</p><p> //標記敵我坦克,true表示我方坦克,false表示敵方坦克&l
119、t;/p><p> private boolean good;</p><p> //標記坦克生命狀態(tài)</p><p> private boolean live = true;</p><p> private Random rand = new Random();</p><p> //地方坦克改變一次方向需
120、要的步數(shù)</p><p> private int step = rand.nextInt(10) + 3;</p><p> //坦克的上一個位置</p><p> private int lastX = -1, lastY = -1;</p><p><b> //坦克的生命值</b></p>
121、<p> private int life = LIFE;</p><p><b> //坦克生命條</b></p><p> LifeBar lb = new LifeBar();</p><p><b> /**</b></p><p> * 根據(jù)坦克位置和敵我狀態(tài)創(chuàng)建一個坦
122、克</p><p> * @param x 坦克左上角X坐標</p><p> * @param y 坦克左上角Y坐標</p><p> * @param good 坦克的敵我狀態(tài)</p><p><b> */</b></p><p> public Tank(int x, int y
123、, boolean good) {</p><p> this.x = x;</p><p> this.y = y;</p><p> this.good = good;</p><p><b> }</b></p><p><b> /**</b></p&
124、gt;<p> * 根據(jù)坦克位置,敵我狀態(tài)和當前游戲窗體創(chuàng)建一個坦克</p><p> * @param x 坦克左上角X坐標</p><p> * @param y 坦克左上角Y坐標</p><p> * @param good 坦克的敵我狀態(tài)</p><p> * @param tc 當前游戲窗體</p>
125、;<p><b> */</b></p><p> public Tank(int x, int y, boolean good, TankClient tc) {</p><p> this(x, y, good);</p><p> this.tc = tc;</p><p><b>
126、 }</b></p><p><b> /**</b></p><p> * 在窗體上畫出坦克</p><p> * @param g Graphics對象</p><p><b> */</b></p><p> public void draw(G
127、raphics g) {</p><p> if (!this.live) {</p><p> if (!this.good)</p><p> tc.enemyTanks.remove(this);</p><p> tc.setTankNum(tc.getTankNum() - 1);</p><p>
128、 tc.setTankAllNum(tc.getTankAllNum() - 1);</p><p><b> return;</b></p><p><b> }</b></p><p> Color c = g.getColor();</p><p><b> if (good
129、)</b></p><p> g.setColor(Color.RED);</p><p><b> else</b></p><p> g.setColor(Color.BLUE);</p><p> g.fillOval(x, y, RADIUS * 2, RADIUS * 2);</p&g
130、t;<p><b> if (good)</b></p><p> lb.draw(g);</p><p> g.setColor(c);</p><p> drawPT(g);</p><p><b> //敵方坦克定位</b></p><p>
131、if (!good) {</p><p> if (step == 0) {</p><p> Direction[] dirs = Direction.values();</p><p> int i = rand.nextInt(dirs.length);</p><p> dir = dirs[i];</p>&l
132、t;p> if (rand.nextInt(20) == 0)</p><p> dir = Direction.D;</p><p> step = rand.nextInt(10) + 3;</p><p><b> }</b></p><p><b> step --;</b>
133、</p><p> if (!this.hasMyMissile())</p><p><b> fire();</b></p><p><b> } </b></p><p><b> move();</b></p><p><b>
134、 }</b></p><p> 程序中共有如下游戲元素:</p><p><b> Bullet:子彈</b></p><p><b> Tank:坦克</b></p><p><b> Boom:爆炸</b></p><p>
135、 Treasurt:寶物</p><p><b> 測試環(huán)境</b></p><p><b> 測試時硬件環(huán)境</b></p><p> CPU:Inter 105M</p><p> 顯卡:NVIDIA GeForce 105M</p><p> 內(nèi)存:金士頓2G
136、/DDR2-667</p><p><b> 測試時軟件環(huán)境</b></p><p> 操作系統(tǒng):Windows 7</p><p><b> JRE:1.6.0</b></p><p> 顯示器:三星液晶14寸/分辨率:1280X800</p><p><b&
137、gt; 測試結(jié)果</b></p><p> 在以上軟硬件環(huán)境中測試,游戲過程正常,滿足軟件的功能需求,結(jié)果正確無誤。</p><p><b> 發(fā)現(xiàn)的BUG及不足</b></p><p> 由于沒有添加操作說明,使玩家不知如何操作,大大地影響了游戲的可操作性。</p><p> 在測試環(huán)境測試時,出
138、現(xiàn)畫面抖動現(xiàn)象,嚴重地影響了游戲的進行,必須找到原因并改正。</p><p><b> 解決方法</b></p><p> 在程序啟動時告知玩家游戲該如何操作,使玩家能清楚、正確地開始游戲。</p><p> 經(jīng)過反復(fù)測試、論證,得知畫面抖動現(xiàn)象原因為測試環(huán)境JRE安裝問題,在重新安裝JRE后,游戲畫面恢復(fù)正常。</p>&
139、lt;p><b> 軟件截圖</b></p><p><b> 總結(jié)</b></p><p> 該游戲定位在小型休閑游戲,是一款免費、綠色、開源的一款軟件。</p><p> 本軟件是使用JAVA開發(fā)的小型電子游戲,其不僅實現(xiàn)了基本的功能需求,而且設(shè)計靈活、拓展方便、界面生動,多處使用了各種設(shè)計模式,是程序的
140、編寫效率更高,運行效率更高。由于程序中多數(shù)是面向父類或者面向接口的編程,以后如果要更換某些模塊、元素的功能,以及添加功能,是非常容易的。現(xiàn)在軟件還無收入,但隨著玩家的逐漸增多,隨時可以利用本軟件優(yōu)良的可拓展性,添加相關(guān)內(nèi)容,從而開始盈利;即便本游戲未得到玩家的喜愛,而需要再次設(shè)計游戲或者另行開發(fā)新游戲,其內(nèi)部使用的各個模塊均可以復(fù)用,這也是本軟件優(yōu)良的可重用性的體現(xiàn)。</p><p><b> 參考文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 坦克大戰(zhàn)--java課程設(shè)計
- java坦克大戰(zhàn)課程設(shè)計報告
- java坦克大戰(zhàn)課程設(shè)計報告
- 基于java坦克大戰(zhàn)課程設(shè)計
- java坦克大戰(zhàn)課程設(shè)計報告
- java課程設(shè)計---基于java的坦克大戰(zhàn)
- java課程設(shè)計----基于java的坦克大戰(zhàn)
- java坦克大戰(zhàn)課程設(shè)計報告.doc
- java語言程序課程設(shè)計-- 坦克大戰(zhàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-- 坦克大戰(zhàn)游戲設(shè)計(java版)
- java關(guān)于坦克大戰(zhàn)的課程設(shè)計報告
- 基于java的游戲坦克大戰(zhàn)
- 基于java的坦克大戰(zhàn)游戲開發(fā)
- 課程設(shè)計報告--坦克大戰(zhàn)
- 基于java的坦克大戰(zhàn)設(shè)計與實現(xiàn)代碼
- java課程設(shè)計鐘表(含代碼)
- 基于java的坦克大戰(zhàn)游戲的設(shè)計與實現(xiàn)
- 畢業(yè)設(shè)計---java編寫的坦克大戰(zhàn)的游戲設(shè)計
- java版坦克大戰(zhàn)
- 坦克大戰(zhàn)游戲設(shè)計論文
評論
0/150
提交評論