坦克大戰(zhàn)源碼
《坦克大戰(zhàn)源碼》由會員分享,可在線閱讀,更多相關(guān)《坦克大戰(zhàn)源碼(46頁珍藏版)》請?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;import java.io.File;import java.io.IOEx
2、ception;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=null;/退出游戲JMenuItem jmi2=null;/存盤退出JMenuItem jmi3=null;/繼續(xù)上一局JMenuItem jmi4=null;public stat
3、ic void main(String args) / TODO Auto-generated method stubMyTankGame5 bn=new MyTankGame5();/構(gòu)造函數(shù)public MyTankGame5()/創(chuàng)建菜單欄選項(xiàng)jmb=new JMenuBar();jm1=new JMenu(游戲(G);/創(chuàng)建快捷方式j(luò)m1.setMnemonic(G);jmi1=new JMenuItem(開始新游戲(N);jmi1.setMnemonic(N);/注冊監(jiān)聽jmi1jmi1.addActionListener(this);jmi1.setActionCommand(ne
4、wgame);jmi2=new JMenuItem(退出該局游戲(Q);jmi2.setMnemonic(Q);/注冊監(jiān)聽jmi2jmi2.addActionListener(this);jmi2.setActionCommand(exit);jmi3=new JMenuItem(存盤退出游戲(C);jmi3.setMnemonic(C);/注冊監(jiān)聽jmi3jmi3.addActionListener(this);jmi3.setActionCommand(saveExit);jmi4=new JMenuItem(繼續(xù)上一局(R);jmi4.setMnemonic(R);/注冊監(jiān)聽jmi4jm
5、i4.addActionListener(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(msp);t1.start();/mp=new MyPanel(); /this.add(mp);/注冊監(jiān)聽/this.addKeyListen
6、er(mp);/啟動mp線程/Thread t2=new Thread(mp);/t2.start();/窗口大小this.setSize(MyPanel.bx1+230,MyPanel.by1+150);this.setTitle(坦克橫行);ImageIcon icon = new ImageIcon(Images/yan.png);this.setIconImage(icon.getImage();this.setLocation(250,150);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(tr
7、ue);Overridepublic void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubif(arg0.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
8、Visible(true);/簡單退出else if(arg0.getActionCommand().equals(exit)/用戶點(diǎn)擊退出/保存擊毀的敵人Recorder.keepRecording();System.exit(0);/存盤退出處理else if(arg0.getActionCommand().equals(saveExit)/System.out.print(111);/獲取當(dāng)前值Recorder.setEts(mp.ets);/保存擊毀的敵人和敵人的坐標(biāo)Recorder.keepRecAndEnemyTank();/退出System.exit(0);/繼續(xù)上一局else
9、if(arg0.getActionCommand().equals(continue)/創(chuàng)建戰(zhàn)場mp=new MyPanel(continue); this.add(mp);/注冊監(jiān)聽this.addKeyListener(mp);/啟動mp線程Thread t2=new Thread(mp);t2.start();this.remove(msp);this.setVisible(true);/開始提示面板class MyStartPanel extends JPanel implements Runnableint times=0;public void paint(Graphics g)s
10、uper.paint(g);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);Overridepublic void run() / TODO Auto-generated method stubwhile(true)try Thread.sleep(500); catch
11、 (Exception e) / TODO Auto-generated catch blocke.printStackTrace();times+;/重畫 閃爍效果this.repaint();/我的面板class MyPanel extends JPanel implements KeyListener,Runnablestatic int h=300;/坦克初始位置static int z=200;/暫停開始開關(guān)static int power=2;/背景區(qū)域大小static int bx1=400;static int by1=300;/聲音控制static int audio=0;/
12、定義一個我的坦克Hero hero=null;/定義地方的坦克組Vector 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 flag)/恢復(fù)記錄Recorder.getRecording();/播放聲音AePlayWave ap=new
13、AePlayWave(D:CHENks.wav);ap.start();/構(gòu)造我的坦克hero=new Hero(h,z);/構(gòu)造初始敵人this.startEnemyTank(flag);/初始化圖片/下面的方法第一個爆炸效果不明顯image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(/beng.png);image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(/beng2.png);image3=Toolkit.getDefaul
14、tToolkit().getImage(Panel.class.getResource(/beng3.png);/try /image1=ImageIO.read(new File(shanshui.jpg);/image2=ImageIO.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 fl
15、ag)if(flag.equals(newgame)/構(gòu)造敵方坦克for(int i=0;iensize;i+)/創(chuàng)建敵方坦克 敵人的初始位置EnemyTank et=new EnemyTank(i+1)*35,0);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(s);Thread t2=new Thread(s);t2.start();/啟動敵人坦克Thread
16、 t=new Thread(et);t.start();elsenodes=new Recorder().getNodesAndEnemy();/構(gòu)造敵方坦克for(int i=0;inodes.size();i+)/取出NodeNode 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);/給敵人添加子彈S
17、hot s=new Shot(et.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ù)的重載,用于重復(fù)產(chǎn)生敵人(int)(Math.random()*270),(int)(Math.random()*360)public void startEnemyTank()/構(gòu)造敵方坦克/創(chuàng)建敵方坦克 敵人的初始位置 位置隨機(jī)EnemyTank et=new EnemyTank(int)(Math.random()*370),(int)(
18、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(s);Thread t2=new Thread(s);t2.start();/啟動敵人坦克Thread t=new Thread(et);t.start();/畫提示信息的坦克public void showInfo(Graphics g)/提示信息this.drawTank(80
19、, 330, g,0, 1);g.setColor(Color.black);g.drawString(Recorder.getEnlife()+, 115, 350);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.drawS
20、tring(*, 470, 112);g.drawString(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;ithis.ets.size();i+)/取出各個坦克速度int esp0=ets.get(i).getSpeed();/設(shè)其速度為0ets
21、.get(i).setSpeed(0);/取出各個坦克EnemyTank et=ets.get(i);/再取出每一顆子彈for(int j=0;jet.ss1.size();j+)/取出各個子彈速度int ess0=et.ss1.get(j).getSpeed();/設(shè)其速度為0et.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.setC
22、olor(Color.RED);g.drawString(WINNER, 120, 150);for(int i=0;ithis.ets.size();i+)/取出各個坦克速度int esp0=ets.get(i).getSpeed();/設(shè)其速度為0ets.get(i).setSpeed(0);/取出各個坦克EnemyTank et=ets.get(i);/再取出每一顆子彈for(int j=0;jet.ss1.size();j+)/取出各個子彈速度int ess0=et.ss1.get(j).getSpeed();/設(shè)其速度為0et.ss1.get(j).setSpeed(0);/重寫pa
23、intpublic void paint(Graphics g)super.paint(g);g.fillRect(0, 0, bx1, by1); /填充背景顏色this.showInfo(g);if(hero.isLive&Hero.counter!=Hero.newlife)/畫我的坦克this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);else if(!hero.isLive&Hero.counterHero.newlife)hero.isLive=true;Hero.counter+;/畫我的坦克this.d
24、rawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);/遍歷Vector畫出子彈&Hero.counter!=Hero.newlifefor(int i=0;ihero.ss.size();i+)Shot myshot=hero.ss.get(i);/畫一顆子彈if(myshot!=null&myshot.isLive)g.setColor(Color.yellow);g.fill3DRect(myshot.x, myshot.y, 3, 3, false);/g.fillOval(myshot.x-1, myshot.y, 5,
25、5);if(myshot.isLive=false)/刪除死亡的子彈hero.ss.remove(myshot);/畫出炸彈for(int i=0;i2)g.drawImage(image3, b.x, b.y, 30, 30, this);else if(b.life1)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:CHENbz.wav);ap1.start();/Hero輸了
26、if (Hero.counter = Hero.newlife )/提示聲音AePlayWave ap = new AePlayWave(D:CHENgameover.wav);ap.start();audio+;/HERO 勝利!/沒有敵人了就贏了else if (Recorder.getEnlife() = MyPanel.ensize - EnemyTank.newlife& audio = 0) /提示聲音AePlayWave ap = new AePlayWave(D:CHENwinner.wav);ap.start();audio+;/讓b的生命值減小b.lifeDown();/減
27、小到0就去掉if(b.life=0)bombs.remove(b);/畫敵方坦克for(int i=0;iets.size();i+)EnemyTank et=ets.get(i);if(et.isLive)this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 1);/畫出敵人子彈for(int j=0;jet.ss1.size();j+)/取出子彈Shot enemyshot=et.ss1.get(j);if(enemyshot.isLive)g.setColor(Color.RED);g.fill3DRect(enemyshot.x-
28、1, enemyshot.y, 3, 3, false);else/如果敵人子彈死亡就把他從Vector中去掉et.ss1.remove(enemyshot);/有敵人被消滅就在畫一個,而且不能超過10個if(!et.isLive&EnemyTank.counteret.x&s.xet.y&s.yet.x&s.xet.y&s.yet.y+20)/創(chuàng)建炸彈Bomb b=new Bomb(et.x, et.y);/放入Vectorbombs.add(b);/擊中/子彈死亡s.isLive=false;/敵人死亡et.isLive=false;if(et!=hero)/敵人數(shù)目減少Recorder.
29、reduceEnlife();/記錄我的戰(zhàn)績Recorder.deadenemy();else if(et=hero)Recorder.reduceMylife();break;/判斷敵人是否擊中我public void hitMe()/取出敵人的坦克for(int i=0;ithis.ets.size();i+)/取出坦克EnemyTank et=ets.get(i);/取出每一顆子彈for(int j=0;jet.ss1.size();j+)/取出子彈Shot enemyshot=et.ss1.get(j);if(hero.isLive)this.hitTank(enemyshot, he
30、ro);/判斷是否擊中了敵人public void hitenemytank()/判斷是否擊中for(int i=0;ihero.ss.size();i+)/取出子彈Shot myshot=hero.ss.get(i);/判斷是否有效if(myshot.isLive)/取出每個坦克與他判斷for(int j=0;jets.size();j+)/取出坦克EnemyTank et=ets.get(j);if(et.isLive)this.hitTank(myshot, et);/播放爆炸聲音/AePlayWave ap1=new AePlayWave(D:CHENfs.wav);/ap1.star
31、t();/畫坦克的函數(shù)public void drawTank(int x,int y,Graphics g, int direct, int type)/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, 30,false);/2.y右邊的矩形g.fill3DRect(x+15, y, 5, 30
32、,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+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,
33、 30, 5,false);/上輪g.fill3DRect(x, y+15, 30, 5,false);/下輪g.fill3DRect(x+5, y+6, 19, 10,false);/中間g.setColor(Color.GRAY);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.左邊的
34、矩形g.fill3DRect(x, y, 5, 30,false);/hero.getX(),hero.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(x+10, y+14, 2, 20,fa
35、lse);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);g.fillOval(x+9, y+5, 10, 10);/中間圓g.setColor(Color.DARK_GRAY);g.fill3DRect(x-6, y+9,
36、21, 2,false);/炮筒g.setColor(Color.blue);g.fill3DRect(x-7, y+8, 3, 5,false);break;/鍵按下處理/a表示向左,s向下,d向右,w向上;或者用方向鍵也行public void keyPressed(KeyEvent arg0) / TODO Auto-generated method stubif(arg0.getKeyCode()=KeyEvent.VK_W|arg0.getKeyCode()=KeyEvent.VK_UP)/System.out.println(ok);/設(shè)置我的坦克方向 向上if(hero.isLi
37、ve)this.hero.setDirect(0);this.hero.moveUp();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)/向下if(hero.isLive)this.hero.setDirect(2
38、);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();/判斷開火 空格鍵發(fā)射if(arg0.getKeyCode()=KeyEvent.VK_SPACE)/只能連發(fā)5發(fā)子彈if(hero.ss.size()=4&hero.isLive)/開火this.hero.shotEnemy();/暫停/繼續(xù) 游戲/if(arg0.getKe
39、yCode()=KeyEvent.VK_P)/for(int i=0;ithis.ets.size();i+)/if(power%2=0)/取出各個坦克速度/int esp0=ets.get(i).getSpeed();/記住該速度/tempspeed=esp0;/設(shè)其速度為0/ets.get(i).setSpeed(0);/取出各個坦克/EnemyTank et=ets.get(i);/再取出每一顆子彈/for(int j=0;jet.ss1.size();j+)/取出各個子彈速度/int ess0=et.ss1.get(j).getSpeed();/記住該速度/int ess1=ess0;
40、/設(shè)其速度為0/et.ss1.get(j).setSpeed(0);/else /ets.get(i).setSpeed(esp1);/et.ss1.get(j).setSpeed(0);/power+;/調(diào)用repaint重畫this.repaint();Overridepublic void keyReleased(KeyEvent arg0) / TODO Auto-generated method stubOverridepublic void keyTyped(KeyEvent arg0) / TODO Auto-generated method stubOverridepublic
41、 void run() / TODO Auto-generated method stub/每100毫秒重繪while(true)try Thread.sleep(100); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();/判斷是否添加新子彈 for(int i=0;iets.size();i+)EnemyTank et=ets.get(i);if(et.isLive)/ets.size()為敵人可以連發(fā)子彈的數(shù)目if(et.ss1.size()2)Shot s=null;
42、/沒有子彈,添加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);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
43、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.sound.sampled.*;import javax.swing.JPanel;class Nodeint 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。