坦克大戰(zhàn)源碼

上傳人:仙*** 文檔編號(hào):32149461 上傳時(shí)間:2021-10-13 格式:DOC 頁(yè)數(shù):46 大?。?35KB
收藏 版權(quán)申訴 舉報(bào) 下載
坦克大戰(zhàn)源碼_第1頁(yè)
第1頁(yè) / 共46頁(yè)
坦克大戰(zhàn)源碼_第2頁(yè)
第2頁(yè) / 共46頁(yè)
坦克大戰(zhàn)源碼_第3頁(yè)
第3頁(yè) / 共46頁(yè)

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《坦克大戰(zhàn)源碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《坦克大戰(zhàn)源碼(46頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 坦克大戰(zhàn)源碼 根據(jù)韓順平老師視頻所作 /**坦克大戰(zhàn)4.0 * 防重疊 */ package com.TankGame5; import java.awt.*; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; i

2、mport java.io.File; import java.io.IOException; import java.util.Vector; public class MyTankGame5 extends JFrame implements ActionListener{ //提示面板 MyStartPanel msp=null; //游戲面板 MyPanel mp=null; //游戲菜單 //開(kāi)始游戲 JMenuBar jmb=null; JMenu jm1=null; //開(kāi)始游戲 JMenuItem jmi1=n

3、ull; //退出游戲 JMenuItem jmi2=null; //存盤(pán)退出 JMenuItem jmi3=null; //繼續(xù)上一局 JMenuItem jmi4=null; public static void main(String[] args) { // TODO Auto-generated method stub MyTankGame5 bn=new MyTankGame5(); } //構(gòu)造函數(shù) public MyTankGame5() { //創(chuàng)建菜單欄選項(xiàng) jmb=new JMenuB

4、ar(); jm1=new JMenu("游戲(G)"); //創(chuàng)建快捷方式 jm1.setMnemonic(G); jmi1=new JMenuItem("開(kāi)始新游戲(N)"); jmi1.setMnemonic(N); //注冊(cè)監(jiān)聽(tīng)jmi1 jmi1.addActionListener(this); jmi1.setActionCommand("newgame"); jmi2=new JMenuItem("退出該局游戲(Q)"); jmi2.setMnemonic(Q); //注冊(cè)監(jiān)聽(tīng)jmi2 jmi2.a

5、ddActionListener(this); jmi2.setActionCommand("exit"); jmi3=new JMenuItem("存盤(pán)退出游戲(C)"); jmi3.setMnemonic(C); //注冊(cè)監(jiān)聽(tīng)jmi3 jmi3.addActionListener(this); jmi3.setActionCommand("saveExit"); jmi4=new JMenuItem("繼續(xù)上一局(R)"); jmi4.setMnemonic(R); //注冊(cè)監(jiān)聽(tīng)jmi4 jmi4.addActio

6、nListener(this); jmi4.setActionCommand("continue"); jm1.add(jmi1); jm1.add(jmi4);//添加的順序就是菜單的順序 jm1.add(jmi3); jm1.add(jmi2); jmb.add(jm1); this.setJMenuBar(jmb); //先啟動(dòng)提示框 msp=new MyStartPanel(); this.add(msp); Thread t1=new Thread(ms

7、p); t1.start(); // mp=new MyPanel(); // this.add(mp); // //注冊(cè)監(jiān)聽(tīng) // this.addKeyListener(mp); // // //啟動(dòng)mp線程 // Thread t2=new Thread(mp); // t2.start(); //窗口大小 this.setSize(MyPanel.bx1+230,MyPanel.by1+150); this.setTitle("坦克橫行"); ImageIcon icon = new

8、 ImageIcon("Images/yan.png"); this.setIconImage(icon.getImage()); this.setLocation(250,150); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if(arg

9、0.getActionCommand().equals("newgame")) { //System.out.println("英雄的到來(lái)"); //創(chuàng)建戰(zhàn)場(chǎng) mp=new MyPanel("newgame"); this.add(mp); //注冊(cè)監(jiān)聽(tīng) this.addKeyListener(mp); //啟動(dòng)mp線程 Thread t2=new Thread(mp); t2.start(); this.remove(msp); this.set

10、Visible(true); } //簡(jiǎn)單退出 else if(arg0.getActionCommand().equals("exit")) { //用戶點(diǎn)擊退出 //保存擊毀的敵人 Recorder.keepRecording(); System.exit(0); } //存盤(pán)退出處理 else if(arg0.getActionCommand().equals("saveExit")) { //System.out.print("111"); //獲取當(dāng)前值 Rec

11、order.setEts(mp.ets); //保存擊毀的敵人和敵人的坐標(biāo) Recorder.keepRecAndEnemyTank(); //退出 System.exit(0); } //繼續(xù)上一局 else if(arg0.getActionCommand().equals("continue")) { //創(chuàng)建戰(zhàn)場(chǎng) mp=new MyPanel("continue"); this.add(mp); //注冊(cè)監(jiān)聽(tīng) this.addKeyList

12、ener(mp); //啟動(dòng)mp線程 Thread t2=new Thread(mp); t2.start(); this.remove(msp); this.setVisible(true); } } } //開(kāi)始提示面板 class MyStartPanel extends JPanel implements Runnable { int times=0; public void paint(Graphics g) { super.paint(g);

13、 g.fillRect(0, 0, MyPanel.bx1, MyPanel.by1); if(times%2==0&×<=30) { //提示信息 Font myFont=new Font("華文新魏",Font.BOLD,30); g.setFont(myFont); g.setColor(Color.YELLOW); g.drawString("READY? GO!", 100, 120); } } @Override public void run() { // TOD

14、O Auto-generated method stub while(true) { try { Thread.sleep(500); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } times++; //重畫(huà) 閃爍效果 this.repaint(); } } } //我的面板 class M

15、yPanel extends JPanel implements KeyListener,Runnable { static int h=300;//坦克初始位置 static int z=200; //暫停開(kāi)始開(kāi)關(guān) static int power=2; //背景區(qū)域大小 static int bx1=400; static int by1=300; //聲音控制 static int audio=0; //定義一個(gè)我的坦克 Hero hero=null; //定義地方的坦克組 Vector

16、Tank> ets=new Vector(); static int ensize=10;//敵人個(gè)數(shù) //定義炸彈集合 Vector bombs=new Vector(); //信息集合 Vector nodes=new Vector(); //定義2個(gè)圖片,一起組成爆炸效果 Image image1=null; Image image2=null; Image image3=null; //構(gòu)造函數(shù) public MyPanel(String fl

17、ag) { //恢復(fù)記錄 Recorder.getRecording(); //播放聲音 AePlayWave ap=new AePlayWave("D:\\CHEN\\ks.wav"); ap.start(); //構(gòu)造我的坦克 hero=new Hero(h,z); //構(gòu)造初始敵人 this.startEnemyTank(flag); //初始化圖片 //下面的方法第一個(gè)爆炸效果不明顯 image1=Toolkit.getDefaultToolkit().getI

18、mage(Panel.class.getResource("/beng.png")); image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng2.png")); image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng3.png")); // try { // image1=ImageIO.read(new File("shanshui.jpg")); // image2=I

19、mageIO.read(new File("beng2.png")); // image3=ImageIO.read(new File("beng3.png")); // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } public void startEnemyTank(String flag) { if(flag.equals("newgame")) { //構(gòu)造敵方坦克

20、 for(int i=0;i

21、0,et.y+30,2); et.ss1.add(s); Thread t2=new Thread(s); t2.start(); //啟動(dòng)敵人坦克 Thread t=new Thread(et); t.start(); } } else { nodes=new Recorder().getNodesAndEnemy(); //構(gòu)造敵方坦克 for(int i=0;i

22、e Node node=nodes.get(i); //創(chuàng)建敵方坦克 敵人的初始位置 EnemyTank et=new EnemyTank(node.x,node.y); et.setColor(0); //??? et.setDirect(node.direct); //將MyPanel創(chuàng)建的坦克交給該敵人 et.setEts(ets); //加入向量組 ets.add(et); //給敵人添加子彈 Shot s=new Shot(e

23、t.x+10,et.y+30,2); et.ss1.add(s); Thread t2=new Thread(s); t2.start(); //啟動(dòng)敵人坦克 Thread t=new Thread(et); t.start(); } } } //函數(shù)的重載,用于重復(fù)產(chǎn)生敵人(int)(Math.random()*270),(int)(Math.random()*360) public void startEnemyTank() { //構(gòu)造敵方坦克 //創(chuàng)建

24、敵方坦克 敵人的初始位置 位置隨機(jī) EnemyTank et=new EnemyTank((int)(Math.random()*370),(int)(Math.random()*270)); et.setColor(0); //??? et.setDirect(2); //將MyPanel創(chuàng)建的坦克交給該敵人 et.setEts(ets); //加入向量組 ets.add(et); //給敵人添加子彈 Shot s=new Shot(et.x+10,et.y+30,2); et.ss1.add

25、(s); Thread t2=new Thread(s); t2.start(); //啟動(dòng)敵人坦克 Thread t=new Thread(et); t.start(); } //畫(huà)提示信息的坦克 public void showInfo(Graphics g) { //提示信息 this.drawTank(80, 330, g,0, 1); g.setColor(Color.black); g.drawString(Recorder.getEnlife()+"", 115, 350)

26、; this.drawTank(180, 330, g,0, 0); g.setColor(Color.black); g.drawString(Recorder.getMylife()+"", 220, 350); Font f=new Font("宋體",Font.BOLD,25); g.setFont(f); g.drawString("您的總成績(jī)", 415, 40); this.drawTank(440, 90, g,0, 1); g.drawString("*", 470, 112); g.drawString(

27、Recorder.getDeadenemy()+"", 500, 110); //判斷結(jié)束 提示消息 //Hero輸了 if(Hero.counter==Hero.newlife) { Font f1=new Font("宋體",Font.BOLD,40); g.setFont(f1); g.setColor(Color.RED); g.drawString("GAME OVER", 110, 150); for(int i=0;i

28、 //取出各個(gè)坦克速度 int esp0=ets.get(i).getSpeed(); //設(shè)其速度為0 ets.get(i).setSpeed(0); //取出各個(gè)坦克 EnemyTank et=ets.get(i); //再取出每一顆子彈 for(int j=0;j

29、 //設(shè)其速度為0 et.ss1.get(j).setSpeed(0); } } } //HERO 勝利! //沒(méi)有敵人了就贏了 else if(Recorder.getEnlife()==MyPanel.ensize-EnemyTank.newlife) { Font f1=new Font("宋體",Font.BOLD,40); g.setFont(f1); g.setColor(Color.RED); g.drawString("WINNER",

30、120, 150); for(int i=0;i

31、 { //取出各個(gè)子彈速度 int ess0=et.ss1.get(j).getSpeed(); //設(shè)其速度為0 et.ss1.get(j).setSpeed(0); } } } } //重寫(xiě)paint public void paint(Graphics g) { super.paint(g); g.fillRect(0, 0, bx1, by1); //填充背景顏色 this.showInfo(g);

32、if(hero.isLive&&Hero.counter!=Hero.newlife) { //畫(huà)我的坦克 this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0); } else if(!hero.isLive&&Hero.counter

33、ero.direct, 0); } //遍歷Vector畫(huà)出子彈&&Hero.counter!=Hero.newlife for(int i=0;i

34、 //g.fillOval(myshot.x-1, myshot.y, 5, 5); } if(myshot.isLive==false) { //刪除死亡的子彈 hero.ss.remove(myshot); } } //畫(huà)出炸彈 for(int i=0;i2) { g.drawImage(image3, b.x, b.y,

35、 30, 30, this); } else if(b.life>1) { g.drawImage(image1, b.x, b.y, 30, 30, this); } else { g.drawImage(image2, b.x, b.y, 30, 30, this); } //播放爆炸聲音 AePlayWave ap1=new AePlayWave("D:\\CHEN\\bz.wav"); ap1.start(); //Hero輸了

36、 if (Hero.counter == Hero.newlife ) {//提示聲音 AePlayWave ap = new AePlayWave("D:\\CHEN\\gameover.wav"); ap.start(); audio++; } //HERO 勝利! //沒(méi)有敵人了就贏了 else if (Recorder.getEnlife() == MyPanel.ensize - EnemyTank.newlife && audio == 0) { //提示聲音 AePla

37、yWave ap = new AePlayWave("D:\\CHEN\\winner.wav"); ap.start(); audio++; } //讓b的生命值減小 b.lifeDown(); //減小到0就去掉 if(b.life==0) { bombs.remove(b); } } //畫(huà)敵方坦克 for(int i=0;i

38、Live) { this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 1); //畫(huà)出敵人子彈 for(int j=0;j

39、yshot.y, 3, 3, false); } else { //如果敵人子彈死亡就把他從Vector中去掉 et.ss1.remove(enemyshot); } } } //有敵人被消滅就在畫(huà)一個(gè),而且不能超過(guò)10個(gè) if(!et.isLive&&EnemyTank.counter

40、yTank(); EnemyTank.counter++; } } } //判斷子彈是否擊中敵方坦克 public void hitTank(Shot s,Tank et) { //判斷敵人坦克方向 switch(et.direct) { case 0: case 2: if(s.x>et.x&&s.xet.y&&s.y

41、 //放入Vector bombs.add(b); //擊中 //子彈死亡 s.isLive=false; //敵人死亡 et.isLive=false; if(et!=hero) { //敵人數(shù)目減少 Recorder.reduceEnlife(); //記錄我的戰(zhàn)績(jī) Recorder.deadenemy(); } //減少我的生命 else if(et==hero) { R

42、ecorder.reduceMylife(); } } break; case 1: case 3: if(s.x>et.x&&s.xet.y&&s.y

43、 if(et!=hero) { //敵人數(shù)目減少 Recorder.reduceEnlife(); //記錄我的戰(zhàn)績(jī) Recorder.deadenemy(); } else if(et==hero) { Recorder.reduceMylife(); } } break; } } //判斷敵人是否擊中我 public void hitMe() { //取出敵人的坦克 for(int

44、i=0;i

45、 } //判斷是否擊中了敵人 public void hitenemytank() { //判斷是否擊中 for(int i=0;i

46、 if(et.isLive) { this.hitTank(myshot, et); } } } // //播放爆炸聲音 // // AePlayWave ap1=new AePlayWave("D:\\CHEN\\fs.wav"); // ap1.start(); } } //畫(huà)坦克的函數(shù) public void drawTank(int x,int y,Graphics g, int direct, int type)//

47、direct方向,type類型 { switch(type) { case 1: g.setColor(Color.CYAN); break; case 0: g.setColor(Color.yellow); break; } //判斷方向 switch(direct) { //向上 case 0: //畫(huà)上方向的坦克 有五個(gè)部件構(gòu)成 //1.左邊的矩形 g.fill3DRect(x, y, 5,

48、 30,false); //2.y右邊的矩形 g.fill3DRect(x+15, y, 5, 30,false); //中間矩形 g.fill3DRect(x+5, y+6, 10, 19,false); //g.fillRect(x+5, y+6, 10, 19); //中間圓 g.setColor(Color.GRAY); g.fillOval(x+5, y+9, 10, 10); //炮筒 g.setColor(Color.DARK_GRAY); g.fill3DRect(x+

49、10, y-4, 2, 21,false); g.setColor(Color.blue); g.fill3DRect(x+8, y-8, 5, 3,false); break; case 1: //畫(huà)向右的坦克 g.fill3DRect(x, y, 30, 5,false);//上輪 g.fill3DRect(x, y+15, 30, 5,false);//下輪 g.fill3DRect(x+5, y+6, 19, 10,false);//中間 g.setColor(Color.GRAY);

50、 g.fillOval(x+9, y+5, 10, 10);//中間圓 g.setColor(Color.DARK_GRAY); g.fill3DRect(x+12, y+9, 21, 2,false);//炮筒 g.setColor(Color.blue); g.fill3DRect(x+33, y+8, 3, 5,false); break; case 2: //向下 //1.左邊的矩形 g.fill3DRect(x, y, 5, 30,false);//hero.getX(),her

51、o.getY()用x y換了 //2.y右邊的矩形 g.fill3DRect(x+15, y, 5, 30,false); //中間矩形 g.fill3DRect(x+5, y+4, 10, 19,false); //g.fillRect(x+5, y+6, 10, 19); //中間圓 g.setColor(Color.GRAY); g.fillOval(x+5, y+9, 10, 10); //炮筒 g.setColor(Color.DARK_GRAY); g.fill3DRect

52、(x+10, y+14, 2, 20,false); g.setColor(Color.blue); g.fill3DRect(x+8, y+33, 5, 3,false); break; case 3: //向左 g.fill3DRect(x, y, 30, 5,false);//上輪 g.fill3DRect(x, y+15, 30, 5,false);//下輪 g.fill3DRect(x+7, y+6, 19, 10,false);//中間 g.setColor(Color.GRAY);

53、 g.fillOval(x+9, y+5, 10, 10);//中間圓 g.setColor(Color.DARK_GRAY); g.fill3DRect(x-6, y+9, 21, 2,false);//炮筒 g.setColor(Color.blue); g.fill3DRect(x-7, y+8, 3, 5,false); break; } } //鍵按下處理 //a表示向左,s向下,d向右,w向上;或者用方向鍵也行 public void keyPressed(K

54、eyEvent arg0) { // TODO Auto-generated method stub if(arg0.getKeyCode()==KeyEvent.VK_W||arg0.getKeyCode()==KeyEvent.VK_UP) { //System.out.println("ok"); //設(shè)置我的坦克方向 向上 if(hero.isLive) { this.hero.setDirect(0); this.hero.moveUp(); }

55、} else if (arg0.getKeyCode()==KeyEvent.VK_D||arg0.getKeyCode()==KeyEvent.VK_RIGHT) { //向右 if(hero.isLive) { this.hero.setDirect(1); this.hero.moveRight(); } } else if (arg0.getKeyCode()==KeyEvent.VK_S||arg0.getKeyCode()==KeyEvent.VK_DOWN) { //

56、向下 if(hero.isLive) { this.hero.setDirect(2); this.hero.moveDown(); } } else if (arg0.getKeyCode()==KeyEvent.VK_A||arg0.getKeyCode()==KeyEvent.VK_LEFT) { //向左 if(hero.isLive) { this.hero.setDirect(3); this.hero.moveLeft(); } }

57、 //判斷開(kāi)火 空格鍵發(fā)射 if(arg0.getKeyCode()==KeyEvent.VK_SPACE) { //只能連發(fā)5發(fā)子彈 if(hero.ss.size()<=4&&hero.isLive) { //開(kāi)火 this.hero.shotEnemy(); } } // //暫停/繼續(xù) 游戲 // if(arg0.getKeyCode()==KeyEvent.VK_P) // { // for(int i=0;i

58、ts.size();i++) // { // if(power%2==0) // { // //取出各個(gè)坦克速度 // int esp0=ets.get(i).getSpeed(); // //記住該速度 // tempspeed=esp0; // //設(shè)其速度為0 // ets.get(i).setSpeed(0); // // // //取出各個(gè)坦克 // EnemyTank et=ets.get(i); //

59、 //再取出每一顆子彈 // for(int j=0;j

60、 ets.get(i).setSpeed(esp1); // // //et.ss1.get(j).setSpeed(0); // } // // } // power++; // } // //調(diào)用repaint重畫(huà) this.repaint(); } @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated met

61、hod stub } @Override public void keyTyped(KeyEvent arg0) { // TODO Auto-generated method stub } @Override public void run() { // TODO Auto-generated method stub //每100毫秒重繪 while(true) { try { Thread.sleep(100); } catch (Interrupte

62、dException e) { // TODO Auto-generated catch block e.printStackTrace(); } //判斷是否添加新子彈 for(int i=0;i

63、l; //沒(méi)有子彈,添加 switch(et.direct) { case 0: s=new Shot(et.x+9,et.y-10,0); et.ss1.add(s); break; case 1: s=new Shot(et.x+35,et.y+9,1); et.ss1.add(s); break; case 2: s=new Shot(et.x+10,et.y+35,2);

64、 et.ss1.add(s); break; case 3: s=new Shot(et.x-9,et.y+9,3); et.ss1.add(s); break; } //創(chuàng)建線程對(duì)象 Thread t=new Thread(s); //啟動(dòng) t.start(); } } } this.hit

65、enemytank(); this.hitMe(); //重繪 this.repaint(); } } } package com.TankGame5; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.io.*; import java.util.Vector; import javax.so

66、und.sampled.*; import javax.swing.JPanel; class Node { int x; int y; int direct; public Node(int x,int y,int direct) { this.x=x; this.y=y; this.direct=direct; } } //記錄坦克信息的類 class Recorder { //記錄敵人和我的坦克數(shù)量 private static int enlife=20; private static int mylife=10; private static int deadenemy=0; private static FileWriter fw=null; private static BufferedWriter bw=null; private static FileReader fr=null; private static BufferedR

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!