




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、班級(jí):坦克大戰(zhàn)實(shí)驗(yàn)報(bào)告姓名:學(xué)號(hào):一、系統(tǒng)簡(jiǎn)介使用JAVA編寫一個(gè)人機(jī)游戲,有開始啟動(dòng)面板(Stage 1),并有閃爍效果。 在開始面板中有 游戲(G)和幫助(H)兩個(gè)菜單。其中游戲(G菜單中有開始 游戲(N)、退出游戲(E、保存游戲(S)、繼續(xù)游戲(C)選項(xiàng);幫助(H)菜 單中有關(guān)于坦克如何操作的提示信息。玩家有1輛坦克(有3條命),電腦有6輛坦克,我的坦克可以通過(guò)鍵盤控 制進(jìn)行移動(dòng)和發(fā)射子彈,敵人坦克可自由運(yùn)動(dòng)并自動(dòng)發(fā)射子彈。 敵人坦克相互之 間不能重疊,敵人坦克與我的坦克不能重疊,我的坦克與敵人坦克不能重疊。當(dāng) 子彈擊中坦克時(shí)坦克死亡,并顯示爆炸效果。當(dāng)我的坦克生命為0時(shí)游戲結(jié)束(顯 示
2、GAMEOVER當(dāng)敵方的所有坦克死亡時(shí)游戲結(jié)束(顯示VICTORY)二、需求分析設(shè)計(jì)一個(gè)圖形用戶界面,將所有游戲的元素都能在此用于界面上表現(xiàn)出來(lái), 界面能夠接受用戶的操作,具有人機(jī)交互功能。用戶可以選擇開始游戲(N),退出游戲(E),保存游戲(S),繼續(xù)游戲(C),游戲幫助(H)。界面中包含我的坦克和敵人坦克以及坦克發(fā)出的子彈和爆炸后的效果。坦克:坦克分為兩種,敵人坦克和我的坦克。我的坦克和敵人坦克均可以發(fā) 射子彈,可以改變路徑行走,且在行走過(guò)程中碰到邊界或碰到其它坦克會(huì)自動(dòng)換 方向,坦克之間不能相互穿越。子彈:子彈可以由敵方坦克和我的坦克發(fā)射, 且發(fā)射出去的子彈可以直線移 動(dòng),直到碰到其它坦
3、克或超越邊界就消失。 坦克受到一顆子彈攻擊便死亡, 死亡 后坦克消失。爆炸:當(dāng)子彈射擊到坦克身上時(shí),要產(chǎn)生爆炸效果。方向:坦克和子彈都有方向,可以選擇上下左右四個(gè)方向,且子彈的方向從 屬于坦克的方向。具體功能:1、坦克可以上下左右移動(dòng)2、坦克可以發(fā)子彈(可以連發(fā),最多 5發(fā)子彈)3、當(dāng)坦克中彈時(shí),坦克消失,并顯示爆炸效果。4、我的坦克被擊中后顯示爆炸效果5、防止敵人坦克重疊運(yùn)動(dòng)、我的坦克與敵人坦克重疊運(yùn)動(dòng)、敵人坦克與我的坦 克重疊運(yùn)動(dòng)6玩游戲時(shí)可以保存游戲和繼續(xù)游戲7、記錄玩家的成績(jī)?nèi)?、系統(tǒng)設(shè)計(jì)程序流程圖:1閃爍(間 接調(diào)用Paint 0)T間隔50ms程序幵始鍵盤監(jiān)聽器初始化游戲總體框架:項(xiàng)
4、目名: Tan kGamel主類文件:MyFrame.java坦克父類文件:Tan k.java坦克子類(我的坦克):MyTank.java 33坦克子類(敵人坦克):EnemyTank.java我的面板:MyPa nel.java子彈類:Shot.java開始面板:MyStartPa nel.java記錄類:Recorder.java爆炸類:Bomb.java四、詳細(xì)設(shè)計(jì)(一)、畫坦克1、Tank類class Tankint x,y;坦克的位置int direct;/坦克的方向時(shí)為敵人的坦克int color;/坦克的顏色,值為 0時(shí)為的我的坦克,為1int speed;public Tan
5、 k(i nt x, int y) this.x = x;this.y = y;setter與getter方法(代碼略)public void moveUp() 向上移動(dòng),y坐標(biāo)值減,方向值為 y_=speed;this.setDirect(0);public void moveDow n()/ 向下移動(dòng),y坐標(biāo)值增,方向值為 y+=speed;this.setDirect(0);public void moveRight()/向右移動(dòng),x坐標(biāo)值增,方向值為 x+=speed;this.setDirect(0);public void moveLeft()/向左移動(dòng),x坐標(biāo)值減,方向值為 x-
6、=speed;this.setDirect(0);2、我的坦克類 MyTankclass MyTa nk exte nds Tankpublic MyTa nk(i nt x, i nt y) super(x, y);3、主類 MyFramepublic class MyFrame exte nds JFrameMyPa nel mp=n ull;public static void main( Stri ng args) MyFrametan kGame仁 new MyFrame();MyFrame.setVisible(true);public MyFrame() mp=new MyPa
7、nel();this.add(mp);this.setBou nds(200,200,600,500);this.setDefaultCloseOperatio n(JFrame.EXIT_ON_CLOSE);4、在 MyFrame.java 中創(chuàng)建 MyPanel 類class MyPa nel exte nds JPa nelMyTa nk myta nk=n ull;public MyPa nel()mytank=new MyTank(200,200);創(chuàng)建我的坦克并設(shè)置其初始位置重載MyPanel類的paint函數(shù)以實(shí)現(xiàn)畫坦克public void paint(Graphics g)/
8、窗口大小改變或重繪窗口時(shí),執(zhí)行repaint()時(shí)會(huì)自動(dòng)調(diào)用super.pa in t(g);g.fillRect(0,0,600,500);this.drawTank(mytank .getX(), mytank.getY(), mytank.getDirect(), mytank.getColor(), 5, g); 在MyPanel畫坦克的函數(shù),參數(shù)包括坦克的位置、方向、類型(用于設(shè)置顏色)、畫筆:public void drawTank( int x, int y, int direct, int color, int size,Graphics g) switch (color) c
9、ase 0:/我的坦克的顏色 g.setColor(Color. cyan);break;case1:g.setColor(Color. yellow);break;case 2:/敵人坦克的顏色g.setColor(Color. green);break;switch (direct) case 0:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size,false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size,fa
10、lse);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLi ne(x + 2 * size, y, x + 2 * size, y + 3 * size); break;case 3:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size,false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x +
11、2 * size, y + size, 2 * size, 2 * size); g.drawLi ne(x, y + 2 * size, x + 3 * size, y + 2 * size);break;case1:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size,false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false); g.fillOval(x + 2 * size, y + size,
12、2 * size, 2 * size);g.drawLi ne(x + 6 * size, y + 2 * size, x + 3 * size, y + 2 * size); break;case 2:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size,false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size,false);g.fillOval(x + size, y + 2 * size, 2 * size,
13、2 * size);g.drawLi ne(x + 2 * size, y + 6 * size, x + 2 * size, y + 3 * size); break;(二)、移動(dòng)坦克(事件監(jiān)聽)在主類注冊(cè)鍵盤事件監(jiān)聽,在MyPanel類中實(shí)現(xiàn)事件監(jiān)聽。在這里,本文通過(guò)另一種新的方法來(lái)實(shí)現(xiàn)坦克的移動(dòng),通過(guò)實(shí)現(xiàn)keyPressed(KeyEvent e)與 keyReleased(KeyEvent e)這兩個(gè)事件處理方法,再創(chuàng)建一個(gè)actio n()方法,即可達(dá)到坦克移動(dòng)更加敏捷順暢,并且可為后面坦克發(fā)射子彈做重要鋪墊,即可做到坦克邊移動(dòng),邊發(fā)射子彈的效果。/L表示向左,R表示向右,U表示向上
14、,D表示向下boolean L = false, R = false, U = false, D = false;Overridepublic void keyPressed(KeyEvent e) if (e.getKeyCode() = KeyEvent. VK_W) U = true; elseif (e.getKeyCode() = KeyEvent. VK_D) R = true; elseif (e.getKeyCode() = KeyEvent. VK_S) D = true; elseif (e.getKeyCode() = KeyEvent. VK_A) L = true;O
15、verridepublic void keyReleased(KeyEvent e) if (e.getKeyCode() = KeyEvent. VK_W) U = false; elseif (e.getKeyCode() = KeyEvent. VK_D) R = false; elseif (e.getKeyCode() = KeyEvent. VK_S) D = false; elseif (e.getKeyCode() = KeyEvent. VK_A) L = false;public void action() if (U) this.mytank .setDirect(O);
16、this.mytank .moveUp(); elseif (R) this.mytank .setDirect(1);this.mytank .moveRight(); elseif (D) this.mytank .setDirect(2);this.mytank .moveDown(); elseif (L) this.mytank .setDirect(3);this.mytank .moveLeft();/重新繪制窗口this.repai nt();再將action()方法放到run()中。(三)、畫出敵人的坦克1、 .創(chuàng)建敵人的坦克類EnemyTank.javapublic cla
17、ss En emyTa nk exte nds Tankpublic En emyTa nk(i nt x,i nty)super(x,y);2、在MyPanel中,創(chuàng)建敵人的坦克組ArrayList ets = new ArrayList();En emyTa nk et = null;public static int en size=6;在構(gòu)造函數(shù)中初始化敵人的坦克:/創(chuàng)建敵人坦克for (int i = 0; i en size; i+) et = new En emyTa nk(20 + i * 50, 0);在paint中畫出敵人的坦克public void pain t(Grap
18、hics g) super.pa in t(g);/畫出我的坦克if (mytank .isLive() this.drawTa nk(myta nk.getX(), myta nk.getY(), myta nk.getDirect(), myta nk.getColor(), 5, g);/畫出敵人的坦克for (int i = 0; i ets.size(); i+) et = ets.get(i);drawTank(et.getX(), et.getY(), et.getDirect(), etgetColor(), 5, g);(四)、線程-讓坦克能發(fā)射子彈并擊中敵人坦克坦克要能發(fā)射
19、子彈(按J鍵時(shí)發(fā)射子彈),子彈要以一定的速度移動(dòng),發(fā)射子彈的頻率不能過(guò)快,當(dāng)子彈擊中敵人的坦克時(shí),子彈死亡,敵人的坦克生命值減少?;舅悸罚簞?chuàng)建一個(gè)子彈類線程,在該類中定義子彈的屬性,并通過(guò)run方法實(shí)現(xiàn)子彈的移動(dòng) 在我的坦克類 MyTank()中創(chuàng)建子彈集合,添加一個(gè)方法 shotEnemy用于按方向創(chuàng) 建并子彈,同時(shí)將創(chuàng)建的子彈添加到子彈集合中,然后啟動(dòng)子彈線程在MyPanel類中添加發(fā)射子彈的事件處理:按J鍵時(shí)調(diào)用 MyTank()類的shotEnemy方法創(chuàng)建子彈在paint方法中畫出子彈。將MyPanel類改為線程類,并在其run方法中調(diào)用相關(guān)方法判斷子彈是否擊中坦克實(shí)現(xiàn)爆炸效果。1
20、創(chuàng)建子彈類Shot.java在members.java中定義子彈類,該類通過(guò)Runnable實(shí)現(xiàn)線程package Tan kWar;public classShot implements Runnableprivate int x;private int y;private int direct;private int speed=6;private boolean isLive = true;public Shot()public Shot(int x, int y, int direct) this.x = x;this.y = y;this.direct = direct;Overri
21、depublic void run() while (true)try Thread.sleep(50); catch (InterruptedException e) e.pri ntStackTrace();switch(this.direct)case 0:y-=speed;break;case1:x+=speed;break;case2:y+=speed;break;case 3:x-=speed;break;/判斷子彈是否跑出界面if (x=480|y=360)isLive = false;break;2.、在MyTank類中創(chuàng)建子彈集,并定義一個(gè)方法ShotEnemy,創(chuàng)建子彈并將
22、子彈添加到子彈集中,啟動(dòng)子彈線程。在MyTank類中添加向量ss用于存放子彈:/創(chuàng)建子彈集ArrayList ss = new ArrayList();Shot s = null;在MyTank類添加一個(gè)創(chuàng)建子彈并啟動(dòng)子彈線程的方法/ ShotEnemy創(chuàng)建子彈并將子彈添加到子彈集中,啟動(dòng)子彈線程public void shotEnemy() switch (this.direct) case 0:s = new Shot(x + 2 * size, y, 0);ss.add(s);break;case1:s = new Shot(x + 6 * size, y + 2 * size, 1);
23、ss.add(s);break;case 2:s = new Shot(x + 2 * size, y + 6 * size, 2);ss.add(s);break;case 3:s = new Shot(x, y + 2 * size, 3);ss.add(s);break;/啟動(dòng)子彈線程Thread t = new Thread(s);t.start();3、發(fā)射子彈的鍵盤事件的實(shí)現(xiàn)分另【J 在 MyPanel的 public void keyPressed(KeyEvent e)和 public voidkeyReleased(KeyEvent e)中添加按j鍵的事件。Boolean S
24、HOT= false ;public void keyPressed(KeyEvent e) if (e.getKeyCode() = KeyEvent.VK_J) SHOT= true ;Overridepublic void keyReleased(KeyEvent e) if (e.getKeyCode() = KeyEvent.VK_J) SHOT= false ;public void action。if (SHOT) if (this.mytank .isLive() & this.mytank .ss.size() = 4) / 最多可連續(xù)發(fā) 5 枚子彈this, myta nk
25、 .shotE nemy();4、畫出子彈(1)在paint方法中畫出子彈:/從ss,中取出每顆子彈,并畫出for (int i = 0; i et. x & s.getX() et. y& s.getY() et. x & s.getX() et. y& s.getY() et. y + 20) s.setLive(false);/ 子彈死亡et.setLive(false); / 敵人坦克死亡b2 = true;Bomb b = new Bomb(et. x, et.y);/ 創(chuàng)建一顆炸彈,放入 ArrayList bombs.add(b); / 放入 ArrayListreturn b2
26、;/判斷我的子彈是否擊中敵人的坦克public void hitEnemyTank() /判斷是否擊中敵人的坦克for (int i = 0; i mytank.ss.size(); i+) /取出子彈Shot myShot = myta nk .ss.get(i);/判斷子彈是否有效if (myShot.isLive() /取出每個(gè)坦克for (int j = 0; j 0) life -; else this .isLive = false;3、在MyPanel中定義三張圖片和定義爆炸集合,并在構(gòu)造函數(shù)中初始化/定義三張圖片,三張圖片才能組成一顆炸彈Image imagel = null;
27、Image image2 = null;Image image3 = null;/定義炸彈集合ArrayList bombs = new ArrayList(); Recorder recorder = null;用另一種新的方法初始化圖片,使能夠第一次擊中坦克時(shí)會(huì)產(chǎn)生爆炸效果。image1 = ImagelO. read(MyPanel. classgetResourceAsStream(bomb_1.gif);image2 = ImagelO. read(MyPanel. classgetResourceAsStream(bomb_2.gif);image3 = ImagelO. read
28、(MyPanel. classgetResourceAsStream(bomb_3.gif);4、在hitTank()中的switch結(jié)構(gòu)中創(chuàng)建炸彈switch (et.direct) /如果敵人坦克的方向是上或者是下case 0:case 2:if (s.getX() et. x & s.getX() et. y& s.getY() et. x & s.getX() et. y& s.getY() et. y + 20) s.setLive(false);/ 子彈死亡et.setLive(false); / 敵人坦克死亡b2 = true;Bomb b = new Bomb(et.x, et
29、.y);/ 創(chuàng)建一顆炸彈,放入 ArrayList bombs.add(b); / 放入 ArrayList5、在 MyPanel的paint函數(shù)中畫出炸彈/畫出炸彈for (int i = 0; i 6) g.drawlmage(image1, b.x, b.y, 30, 30, this); elseif (b.life 3) g.drawImage(image2, b.x, b.y, 30, 30, this); else g.drawImage(image3, b.x, b.y, 30, 30, this);讓b的生命值減小b.lifeDow n();/如果炸彈生命值為 0,就把該炸彈
30、從bombs向量去掉if (b.life = 0) bombs.remove(b);(六)、讓敵人的坦克動(dòng)起來(lái)并發(fā)射子彈1把敵人的坦克修改為線程類public classEnemyTank. extends Tank implements Runnable2、重載抽象方法run用于敵人坦克的運(yùn)動(dòng)Overridepublic void run() /敵人坦克改變方向switch (this.direct) case 0:/前進(jìn)一段距離后改變方向for (int i = 0; i 6 * size + speed& ! this.isTouchOtherTank() this.moveUp();e
31、lsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;case1:for (int i = 0; i 30; i+) if (x 600 - 6 * size - speed & ! this.isTouchOtherTank() this.moveRight();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;case2:/前進(jìn)一段距離后改變方向 for (int i = 0; i 30; i+) if (y 500
32、- 6 * size - speed & ! this.isTouchOtherTank() this.moveDow n();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;case 3:for (int i = 0; i 6 * size + speed& ! this.isTouchOtherTank() this.moveLeft();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;j+;if (j %
33、2 = 0)this.direct = (int) (Math. random() * 4);3、敵人的坦克之間不能重疊在EnemyTank類中添加一個(gè)方法isTouchOtherEnemy()用于判斷敵人的坦克之間是否相遇。/ isTouchOtherTank()用于判斷敵人的坦克之間是否相遇 public boolean isTouchOtherTank() for (int i = 0; i = et.x & x = et.y & y = et.x& x + 4 * size = et. y & y = et.x & x = et.y& y = et.x& x + 4 * size =
34、et. y & y = et.x& x + 6 * size = et. y & y = et.x& x + 6 * size = et.y& y + 4 * size = et.x& x + 6 * size = et. y & y = et.x& x + 6 * size = et.y& y + 4 * size = et.x & x = et.y& y + 6 * size = et.x& x + 4 * size = et.y& y + 6 * size = et.x & x = et.y& y + 6 * size = et.x& x + 4 * size = et.y& y + 6
35、 * size = et.x & x = et.y& y = et.x & x = et.y& y + 4 * size = et.x & x = et.y& y = et.x & x = et.y& y + 4 * size = mt.getX() & x = mt.getY() & y = mt.getX()& x + 4 * size = mt.getY() & y = mt.getX() & x = mt.getY() & y = mt.getX()& x + 4 * size = mt.getY() & y = mt.getX()& x + 6 * size = mt.getY()
36、& y = mt.getX()& x + 6 * size = mt.getY()& y + 4 * size = mt.getX()& x + 6 * size = mt.getY() & y = mt.getX()& x + 6 * size = mt.getY()& y + 4 * size = mt.getX() & x = mt.getY()& y + 6 * size = mt.getX()& x + 4 * size = mt.getY()& y + 6 * size = mt.getX() & x = mt.getY()& y + 6 * size = mt.getX()& x
37、 + 4 * size = mt.getY()& y + 6 * size = mt.getX() & x = mt.getY() & y = mt.getX() & x = mt.getY()& y + 4 * size = mt.getX() & x = mt.getY() & y = mt.getX() & x = mt.getY()& y + 4 * size = mt.getY() + 4 * size) return true;break;return false;6、修改EnemyTank類的run方法,在if語(yǔ)句的條件中加入判斷是否相遇的條件。Overridepublic vo
38、id run() int j = 0;while (true) /敵人坦克改變方向switch (this.direct) case 0:/前進(jìn)一段距離后改變方向for (int i = 0; i 6 * size + speed& ! thisisTouchOtherTank()& !isTouchMyTank()this.moveUp();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;case1:for (int i = 0; i 30; i+) if (x 600 - 6 * size - sp
39、eed& ! thisisTouchOtherTank()& !isTouchMyTank()this.moveRight();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break;case2:/前進(jìn)一段距離后改變方向 for (int i = 0; i 30; i+) if (y 500 - 6 * size - speed& ! thisisTouchOtherTank()& !isTouchMyTank()this.moveDow n();elsebreak;try Thread.sleep(50);
40、catch (InterruptedException ex) break;case 3:for (int i = 0; i 6 * size + speed& ! thisisTouchOtherTank()& !isTouchMyTank()this.moveLeft();elsebreak;try Thread.sleep(50); catch (InterruptedException ex) break; j+;if (j % 2 = 0)this.direct = (int) (Math. random() * 4);7、讓敵人的坦克發(fā)子彈在EnwmyTank類中,添加一個(gè)子彈集合
41、/存放敵人的子彈ArrayList ss = new ArrayList();在EnemyTank類的run()方法中給敵人的坦克添加子彈while (true) /給敵人的坦克添加子彈if (this.isLive & ss.size() 5) Shot s = null;switch (this.direct) case 0:s = new Shot( this.x + 2 * size, this.y, 0);ss.add(s);break;case1:s = new Shot(this.x + 6 * size, this.y + 2 * size, 1); ss.add(s);bre
42、ak;case2:s = new Shot(this.x + 2 * size, this.y + 6 * size, 2); ss.add(s);break;case 3:s = new Shot( this.x, this.y + 2 * size, 3);ss.add(s);break;ssadd(s);Thread t = new Thread(s);t.start();、在 MyPanel類的paint()中畫出敵人的子彈/畫出敵人的子彈for (int j = 0; j et.sssize(); j+) Shot en emyShot = et.ss.get(j);if (en e
43、myShot.isLive()g.fill3DRect(e nemyShot.getX(), en emyShot.getY(), 2, 2, false);elseet.ss.remove(e nemyShot);、在MyPanel類中添加一個(gè)函數(shù)用于判斷敵人的子彈是否擊中我/判斷敵人的子彈是否擊中我public void hitMe() for (int i = 0; i ets.size(); i+) En emyTa nk et = ets.get(i);if (et.isLive() for (int j = 0; j 0) myta nk .setLive( true);repai
44、 nt();、在MyTank類中增加下面兩個(gè)變量/判斷我的坦克是否處于無(wú)敵狀態(tài)public boolean invincible = true; 、在MyPanel類的action()方法的各個(gè)if語(yǔ)句中添加代碼用于去掉無(wú)敵狀態(tài)public void action() if (U) this.mytank .setDirect(O);this.mytank .moveUp();/關(guān)閉無(wú)敵狀態(tài)myta nk.i nvin cible = false;將紅色代碼同樣添加到其它按鍵的處理上(包括上、下、左、右和發(fā)射子彈的按鍵)(7)、修改 MyPanel類的run方法Overridepublic v
45、oid run() int k = 0;/每隔100毫秒去重繪while (true) action();try Thread.sleep(IOO); catch (Exception e) e.pri ntStackTrace();if (mytank.isLive() this.hitE nemyTa nk();if (this.mytank.invincible = false)/只有不是處于無(wú)敵狀態(tài)時(shí)才調(diào)用 this.hitMe();if (this.mytank .mySize 0 & mytank .isLive() = false & k = 20) / 當(dāng)我的坦克被擊中后的2秒
46、恢復(fù)mytank.setLive( true);/ 恢復(fù)我的坦克mytank.invincible = true;/使我的坦克處于無(wú)敵狀態(tài)k = 0;/獲取殺敵數(shù)和敵人剩余數(shù)this.recorder.setTotal(total);this.recorder.setE nsize(e nsize);this.recorder.setMySize( mytank.mySize);/重繪this.repa in t();(八)、增加提示信息及菜單1增加一個(gè)用于顯示提示信息的類 public classMyStartPanel extends JPanel implements Runnablei
47、nt times=0;/用于控制顯示public void paint(Graphics g)super.pa in t(g);g.fillRect(0,0,600,500);提示信息if (times%2=0)g.setColor(Color. yellow);開關(guān)信息的字體Font myFont= new Font(隸書,Font.BOLD ,30);g.setF on t(m yFon t);g.drawString( Stage 1,200,200);Overridepublic void run() while (true)try Thread.sleep(100); catch (
48、Exception e) times+;this.repa in t();2、修改主類(1)、在主類中定義一個(gè)開始面板:MyStartPa nel(2)、修改主類的構(gòu)造函數(shù):msp = null ;去掉原MyPanel面板的創(chuàng)建代碼,添加創(chuàng)建 MyStartPanel面板的代碼。public MyFrame()msp=new MyStartPa nel();Thread t=new Thread(msp);t.start();this.add(msp)this.setSize(600,500); 面板大小 this.setDefaultCloseOperatio n(JFrame.EXIT_O
49、N_CLOSE); this.setVisible(true);3、添加菜單用于創(chuàng)建MyPanel面板(1)、在主類中添加下面代碼:/作出我需要的菜單JMenuBar jmb = null;/ 菜單條JMenu jm1 = null;/ 菜單JMenultem jmil = null;/ 菜單項(xiàng)JMe nultem jmi2 = null;JMe nultem jmi3 = null;JMe nultem jmi4 = null;/創(chuàng)建幫助菜單JMenu Hjm1 = null;/ 菜單JMe nultemHjmi1 :=null;/菜單項(xiàng)JMe nultemHjmi2 :=null;JMe
50、nultemHjmi3 :=null;JMe nultemHjmi4 :=null;JMe nultemHjmi5 :=null;JMe nultemHjmi6 :=null;(2)、在主類的構(gòu)造方法中創(chuàng)建菜單及菜單選項(xiàng)/創(chuàng)建菜單及菜單選項(xiàng)jmb = new JMe nuBar(); jm1 = new JMenu(游戲(G);/設(shè)置快捷方式j(luò)ml.setM nemo nic( G);jmil = new JMenultem(” 開始新游戲(N); jmi2 = new JMenultem(” 退出游戲(E); jmi3 = new JMenultem(” 保存游戲(S); jmi4 = ne
51、w JMenultem(” 繼續(xù)游戲(C);/創(chuàng)建幫助菜單Hjm1 = new JMenu(”幫助(H);Hjmi1 = new JMenultem(”向上(W);Hjmi2 = new JMenultem(”向下(S);Hjmi3 = new JMenultem(” 向左(A);Hjmi4 = new JMenultem(” 向右(D);Hjmi5 = new JMenultem(”發(fā)射子彈(J);Hjmi6 = new JMenultem(”原地復(fù)活(Enter);Hjm1.add(Hjmi1 );/將菜單項(xiàng)添加到菜單中 Hjm1.add(Hjmi2 );/將菜單項(xiàng)添加到菜單中 Hjm1.
52、add(Hjmi3 );/將菜單項(xiàng)添加到菜單中 Hjm1.add(Hjmi4 );/將菜單項(xiàng)添加到菜單中 Hjm1.add(Hjmi5 );/將菜單項(xiàng)添加到菜單中 Hjm1.add(Hjmi6 );/將菜單項(xiàng)添加到菜單中 jm1 .add(jmi1 );/將菜單項(xiàng)添加到菜單中 jm1 .add(jmi2);jm1 .add(jmi3);jm1 .add(jmi4);jmb.add(jm1);將菜單添加到菜單條中 jmb.add(Hjm1 );/添加幫助菜單this.setJMenuBar(jmb);/將菜單條添加到窗體中(3)、添加一個(gè) Recorder.java類,用于保存游戲在所有需要保存
53、的對(duì)象類中,都實(shí)現(xiàn)對(duì)像序列化接口 implements Serializable,把坦克當(dāng)成一個(gè)整體對(duì)象保存信息。public classRecorder implements SerializableMyTank mytank = null;ArrayList ets = null;int ensize=0;int total=0;int mySize=0;/省略set/get方法public Recorder()、在主類中實(shí)現(xiàn)事件監(jiān)聽接口:public class MyFrame extends JFrame implements ActionListener 在主類的構(gòu)造方法中添加注冊(cè)監(jiān)
54、聽代碼:/添加注冊(cè)監(jiān)聽jmi1 .addActionListener( this);/為開始新游戲菜單項(xiàng)注冊(cè)監(jiān)聽jmi1 .setActionCommand( newgame);/ 設(shè)置其 ActionCommand 值為:newgame、在主類中實(shí)現(xiàn)接口中的抽象方法:/定義一個(gè)變量用于存放執(zhí)行菜單的次數(shù)int start num = 0;在主類中實(shí)現(xiàn)接口中的抽象方法:Overridepublic void actionPeformed(ActionEvent e) /對(duì)用戶不同的點(diǎn)擊作出不同的處理if (e.getActionCommand().equals(newgame) / 如果單擊了
55、“開始新游戲”菜單項(xiàng)if ( start num 0) if ( mp !=null )this .remove( mp); / 先刪除舊的 MyPanel 面板MyTank. mySize = 3; /我的坦克數(shù)重置為3start num = 1;/創(chuàng)建戰(zhàn)場(chǎng)面板if ( recorder != null ) recorder = null ;mp = new MyPanel( recorder );/啟動(dòng)mp線程Thread t = new Thread( mp;t.start();/先刪除舊的開始面板this .remove( msp);this .add( mp;/注冊(cè)監(jiān)聽this .addKeyListener(mp;/ 顯示,刷新JFramethis .setVisible( true ); else if (e.getActionCommand().equals(EXIT ) /記錄殺敵數(shù)/退出游戲System. exit (0); else if
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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河北省安全員《A證》考試題庫(kù)及答案
- 二零二五年度智能制造入股合同協(xié)議書
- 2025年度農(nóng)業(yè)科技企業(yè)員工借調(diào)與農(nóng)業(yè)技術(shù)推廣合同
- 2025年度個(gè)體工商戶合伙協(xié)議范文與投資融資及財(cái)務(wù)規(guī)劃協(xié)議
- 2025年度征收城市老舊危房房屋拆遷補(bǔ)償協(xié)議
- 2025年度人事專員勞動(dòng)合同(附員工培訓(xùn)服務(wù)內(nèi)容)
- 2025年度文化產(chǎn)業(yè)發(fā)展勞動(dòng)合同法規(guī)范與創(chuàng)意人才合同
- 2025年度個(gè)人租賃市場(chǎng)租賃合同電子簽名合同
- 2025年度健康養(yǎng)生館店鋪承包合作協(xié)議
- 2025年度太陽(yáng)能光伏發(fā)電站機(jī)電安裝服務(wù)協(xié)議
- (完整版)電梯的鋼結(jié)構(gòu)施工方案
- 中國(guó)近現(xiàn)代史綱要ppt全共64頁(yè)課件
- 腰椎間盤突出癥(腰痹病)中醫(yī)臨床路徑
- 教學(xué)團(tuán)隊(duì)建設(shè)總結(jié)報(bào)告
- 研發(fā)經(jīng)費(fèi)填報(bào)指標(biāo)說(shuō)明及核算方法
- 裝飾施工進(jìn)度計(jì)劃網(wǎng)絡(luò)圖及橫道圖
- 一年級(jí)思維訓(xùn)練(課堂PPT)
- 實(shí)木電腦桌書桌安裝圖
- GB_T 27025-2019 檢測(cè)和校準(zhǔn)實(shí)驗(yàn)室能力的通用要求(高清版)
- 俱樂部經(jīng)營(yíng)俱樂部經(jīng)營(yíng)
- 檢驗(yàn)和試驗(yàn)計(jì)劃(范文)11頁(yè)
評(píng)論
0/150
提交評(píng)論