坦克大戰(zhàn)源碼

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

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

0 積分

下載資源

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

資源描述:

《坦克大戰(zhàn)源碼》由會員分享,可在線閱讀,更多相關《坦克大戰(zhàn)源碼(46頁珍藏版)》請在裝配圖網(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; //游戲菜單 //開始游戲 JMenuBar jmb=null; JMenu jm1=null; //開始游戲 JMenuItem jmi1=n

3、ull; //退出游戲 JMenuItem jmi2=null; //存盤退出 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)建菜單欄選項 jmb=new JMenuB

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

5、ddActionListener(this); jmi2.setActionCommand("exit"); jmi3=new JMenuItem("存盤退出游戲(C)"); jmi3.setMnemonic(C); //注冊監(jiān)聽jmi3 jmi3.addActionListener(this); jmi3.setActionCommand("saveExit"); jmi4=new JMenuItem("繼續(xù)上一局(R)"); jmi4.setMnemonic(R); //注冊監(jiān)聽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); //先啟動提示框 msp=new MyStartPanel(); this.add(msp); Thread t1=new Thread(ms

7、p); t1.start(); // mp=new MyPanel(); // this.add(mp); // //注冊監(jiān)聽 // this.addKeyListener(mp); // // //啟動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("英雄的到來"); //創(chuàng)建戰(zhàn)場 mp=new MyPanel("newgame"); this.add(mp); //注冊監(jiān)聽 this.addKeyListener(mp); //啟動mp線程 Thread t2=new Thread(mp); t2.start(); this.remove(msp); this.set

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

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

12、ener(mp); //啟動mp線程 Thread t2=new Thread(mp); t2.start(); this.remove(msp); this.setVisible(true); } } } //開始提示面板 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++; //重畫 閃爍效果 this.repaint(); } } } //我的面板 class M

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

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

17、ag) { //恢復記錄 Recorder.getRecording(); //播放聲音 AePlayWave ap=new AePlayWave("D:\\CHEN\\ks.wav"); ap.start(); //構(gòu)造我的坦克 hero=new Hero(h,z); //構(gòu)造初始敵人 this.startEnemyTank(flag); //初始化圖片 //下面的方法第一個爆炸效果不明顯 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(); //啟動敵人坦克 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(); //啟動敵人坦克 Thread t=new Thread(et); t.start(); } } } //函數(shù)的重載,用于重復產(chǎn)生敵人(int)(Math.random()*270),(int)(Math.random()*360) public void startEnemyTank() { //構(gòu)造敵方坦克 //創(chuàng)建

24、敵方坦克 敵人的初始位置 位置隨機 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(); //啟動敵人坦克 Thread t=new Thread(et); t.start(); } //畫提示信息的坦克 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("您的總成績", 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、 //取出各個坦克速度 int esp0=ets.get(i).getSpeed(); //設其速度為0 ets.get(i).setSpeed(0); //取出各個坦克 EnemyTank et=ets.get(i); //再取出每一顆子彈 for(int j=0;j

29、 //設其速度為0 et.ss1.get(j).setSpeed(0); } } } //HERO 勝利! //沒有敵人了就贏了 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、 { //取出各個子彈速度 int ess0=et.ss1.get(j).getSpeed(); //設其速度為0 et.ss1.get(j).setSpeed(0); } } } } //重寫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) { //畫我的坦克 this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0); } else if(!hero.isLive&&Hero.counter

33、ero.direct, 0); } //遍歷Vector畫出子彈&&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); } } //畫出炸彈 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 勝利! //沒有敵人了就贏了 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); } } //畫敵方坦克 for(int i=0;i

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

39、yshot.y, 3, 3, false); } else { //如果敵人子彈死亡就把他從Vector中去掉 et.ss1.remove(enemyshot); } } } //有敵人被消滅就在畫一個,而且不能超過10個 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)績 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)績 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(); } } //畫坦克的函數(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: //畫上方向的坦克 有五個部件構(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: //畫向右的坦克 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"); //設置我的坦克方向 向上 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、 //判斷開火 空格鍵發(fā)射 if(arg0.getKeyCode()==KeyEvent.VK_SPACE) { //只能連發(fā)5發(fā)子彈 if(hero.ss.size()<=4&&hero.isLive) { //開火 this.hero.shotEnemy(); } } // //暫停/繼續(xù) 游戲 // if(arg0.getKeyCode()==KeyEvent.VK_P) // { // for(int i=0;i

58、ts.size();i++) // { // if(power%2==0) // { // //取出各個坦克速度 // int esp0=ets.get(i).getSpeed(); // //記住該速度 // tempspeed=esp0; // //設其速度為0 // ets.get(i).setSpeed(0); // // // //取出各個坦克 // 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重畫 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; //沒有子彈,添加 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)建線程對象 Thread t=new Thread(s); //啟動 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

展開閱讀全文
溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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