坦克大戰(zhàn)源碼
《坦克大戰(zhàn)源碼》由會員分享,可在線閱讀,更多相關(guā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"); //獲取當(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)場 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;
//暫停開始開關(guān)
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 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);
//初始化圖片
//下面的方法第一個爆炸效果不明顯
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ù)的重載,用于重復(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();
//啟動敵人坦克
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();
//設(shè)其速度為0
ets.get(i).setSpeed(0);
//取出各個坦克
EnemyTank et=ets.get(i);
//再取出每一顆子彈
for(int j=0;j 29、
//設(shè)其速度為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();
//設(shè)其速度為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;i 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.x 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.x 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");
//設(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、
//判斷開火 空格鍵發(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;
// //設(shè)其速度為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)系上傳者。文件的所有權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)后保健知識講座
- 《音樂小屋》課件2
- 2019屆高考物理二輪復(fù)習(xí)專題二能量與動量第7講動能定理的應(yīng)用課件
- 灝忓涓€騫寸駭鍥介槻鏁欒偛璇句歡
- 高中地理一輪二輪三輪復(fù)習(xí)氣象災(zāi)害集備1
- 人教英語必修二同課異構(gòu)課件:Unit2TheOlympicGamesSectionAWarmingUpandReading2
- 人教版小學(xué)語文二年級上冊《黃山奇石》PPT課件
- 6分?jǐn)?shù)混合運(yùn)算(二)第1-課時課件
- 黃河的主人(教育精品)
- 術(shù)前肺功能測定及其臨床意義
- 變態(tài)心理學(xué)和健康心理學(xué)知識專題知識宣講
- 肝纖維化無創(chuàng)性診斷--課件
- 512垂線(1)(教育精品)
- 熒光幻彩金蔥粉耐溶劑金蔥粉
- 第4章音頻媒體2