【Java实战】Java实现简易坦克对战小游戏

来源:互联网 发布:杀敌算法百度云 编辑:程序博客网 时间:2024/05/16 15:10

摘要:前期学习了Java入门的相关基础,现在通过这个小项目来熟悉巩固所学。该程序主要实现了一个简易的坦克对战小游戏,提供UI界面

//此程序用来实现一个简易的坦克对战小游戏!//Version:1.0//  @Author:Yongchun_zhapackage cha09;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.*;public class L9_1 extends JFrame implements ActionListener{ Mypanel mp=null; GameStage gs=null; JMenuBar mb=null; JMenu mu=null; JMenuItem mi=null; JMenuItem mi1=null; JMenuItem mi2=null; JMenuItem mi3=null; public static void main(String[] args) {      L91 l91=new L9_1(); } public L9_1() {  mb=new JMenuBar();  mu=new JMenu("Game");  mu.setMnemonic('G');  mi=new JMenuItem("New Game");  mi.setMnemonic('N');  mi1=new JMenuItem("Go on Game");  mi1.setMnemonic('P');  mi2=new JMenuItem("Save&Exit");  mi2.setMnemonic('S');  mi3=new JMenuItem("Exit");  mi3.setMnemonic('E');  mi.addActionListener(this);  mi.setActionCommand("newGame");  mi1.addActionListener(this);  mi1.setActionCommand("goongame");  mi2.addActionListener(this);  mi2.setActionCommand("saveexit");  mi3.addActionListener(this);  mi3.setActionCommand("exit");  mu.add(mi);  mu.add(mi1);  mu.add(mi2);  mu.add(mi3);  mb.add(mu);  this.setJMenuBar(mb);  gs=new GameStage();  Thread ff=new Thread(gs);  ff.start();  this.add(gs);  this.setIconImage(new ImageIcon("image/tank.jpg").getImage());  this.setTitle("TANK_WAR");//设置用户界面  this.setSize(400,500);//设置窗口大小,数字代表像素  this.setLocation(300,260);//设置窗体位置  this.setResizable(false);//设置窗体大小是否可调整  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭进程     this.setVisible(true);//true 显示,false不显示 } public void actionPerformed(ActionEvent e) {  if(e.getActionCommand().equals("newGame"))  {   mp=new Mypanel();   this.remove(gs);   this.add(mp);   Thread bb=new Thread(mp);   bb.start();   this.addKeyListener(mp);   this.setVisible(true);  }  else if(e.getActionCommand().equals("goongame"))  {  }  else if(e.getActionCommand().equals("saveexit"))  {   Record record=new Record();   record.setNumAt(mp.numArmyTank);   record.saveGame();   System.exit(0);  }  else if(e.getActionCommand().equals("exit"))  {   Record.writeRecord();   System.exit(0);  } }}class Mypanel extends JPanel implements KeyListener,Runnable{ MyTank mt=null; ArmyTank at=null; Explode bz=null; Vector armyTankV=new Vector(); Vector bzV=new Vector(); int numArmyTank=3; Image tp1=null; Image tp2=null; Image tp3=null; public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void keyPressed(KeyEvent e) {  if(e.getKeyCode()==KeyEvent.VK_W ||e.getKeyCode()==KeyEvent.VK_UP)  {   this.mt.setDirection(0);   this.mt.turnUp();  }  else if(e.getKeyCode()==KeyEvent.VK_A ||e.getKeyCode()==KeyEvent.VK_DOWN)  {   this.mt.setDirection(1);   this.mt.turnDown();  }  else if(e.getKeyCode()==KeyEvent.VK_S ||e.getKeyCode()==KeyEvent.VK_LEFT)  {   this.mt.setDirection(2);   this.mt.turnLeft();  }  else if(e.getKeyCode()==KeyEvent.VK_D ||e.getKeyCode()==KeyEvent.VK_RIGHT)  {   this.mt.setDirection(3);   this.mt.turnRight();  }  if(e.getKeyCode()==KeyEvent.VK_J)  {   if(this.mt.zdV.size()<8)   {    this.mt.shutBullet();   }  }  this.repaint(); } public Mypanel() {  Shengyin music=new Shengyin("./tank.wav");  music.start();  Record.readRecord();  mt=new MyTank(140,232);  for(int i=0;i  {       at=new ArmyTank(i*181+5,0);       at.setDirection(2);       Thread cc=new Thread(at);       cc.start();       Bullet zd=new Bullet(at.x+10,at.y+30,2);       at.dzdV.add(zd);       Thread ee=new Thread(zd);       ee.start();       armyTankV.add(at);  }  tp1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg1.gif"));  tp2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg2.gif"));  tp3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg3.gif")); } public void paint(Graphics g) {  super.paint(g);  g.fillRect(0, 0, 400, 300);//设置画布大小  if(mt.life==true)  {   this.drawTank(mt.getX(), mt.getY(), g, mt.direction , 0);  }  for(int i=0;i  {    at=armyTankV.get(i);    if(at.life)    {     this.drawTank(at.getX(), at.getY(), g, at.direction, 1);    }    for(int j=0;j    {     Bullet zd=at.dzdV.get(j);     if(zd.life)     {      g.setColor(Color.white);      g.fill3DRect(zd.x,zd.y,3,3,false);     }     else     {      at.dzdV.remove(zd);     }    }  }  for(int i=0;i  {   Bullet zd=mt.zdV.get(i);   if(zd!=null && mt.zd.life==true)   {    g.setColor(Color.white);    g.fill3DRect(zd.x,zd.y , 3,3,false );   }   if(zd.life==false)   {    mt.zdV.remove(zd);   }  }  for(int i=0;i  {   bz=bzV.get(i);   if(bz.lifeLength>6)   {    g.drawImage(tp1, bz.x, bz.y, 30,30,this);   }   else if(bz.lifeLength>3)   {    g.drawImage(tp2, bz.x, bz.y, 30,30,this);   }   else   {    g.drawImage(tp3, bz.x, bz.y, 30,30,this);   }   bz.lifeLengthDecrease();   if(bz.lifeLength==0)   {    bzV.remove(bz);   }  }  this.showInformation(g); } public void drawTank(int x,int y,Graphics g,int direction,int type) {  switch(type)  {  case 0://my tank   g.setColor(Color.yellow);   break;  case 1://army's tank   g.setColor(Color.green);   break;  }  switch(direction)  {  case 0://up   g.fill3DRect(x,y, 5, 30, false);   g.fill3DRect(x+15,y, 5, 30,false);   g.fill3DRect(x+5,y+5, 10, 20, false);   g.fillOval(x+5,y+10, 10, 10);   g.drawLine(x+10,y+15,x+10,y-3);   break;  case 1://down   g.fill3DRect(x,y, 5, 30, false);   g.fill3DRect(x+15,y, 5, 30,false);   g.fill3DRect(x+5,y+5, 10, 20, false);   g.fillOval(x+5,y+10, 10, 10);   g.drawLine(x+10,y+15,x+10,y+33);   break;  case 2://left   g.fill3DRect(x,y, 30, 5, false);   g.fill3DRect(x,y+15, 30, 5,false);   g.fill3DRect(x+5,y+5, 20, 10, false);   g.fillOval(x+10,y+5, 10, 10);   g.drawLine(x+15,y+10,x-3,y+10);   break;  case 3://right   g.fill3DRect(x,y, 30, 5, false);   g.fill3DRect(x,y+15, 30, 5,false);   g.fill3DRect(x+5,y+5, 20, 10, false);   g.fillOval(x+10,y+5, 10, 10);   g.drawLine(x+20,y+10,x+30,y+10);   break;  } } public void showInformation(Graphics g) {  this.drawTank(80, 330, g, 0, 0);  this.drawTank(150,330, g, 0, 1);  g.setColor(Color.black);  g.drawString(Record.getNumAt()+"", 116,350);//整形数据后面加上“”,会把整形数据转换为String类型。  g.drawString(Record.getNumMt()+"",186,350 );  g.setFont(new Font("Bodoni MT",Font.CENTER_BASELINE,15));  g.setColor(Color.BLACK);  g.setFont(new Font("Bodoni MT",Font.BOLD,20));  g.drawString("The number of Army Tanks you shutted:", 10,400);  g.setColor(Color.DARK_GRAY);  g.drawString(Record.getSumShutNumAt()+"",370,400 ); }public boolean shutted(Bullet zd,Tank tk) {  boolean b2=false;  switch(tk.direction)  {  case 0:  case 1:   if(zd.x>tk.x && zd.xtk.y && zd.y   {    zd.life=false;    tk.life=false;    Explode bz=new Explode(tk.x,tk.y);    bzV.add(bz);    b2=true;   }   break;  case 2:  case 3:   if(zd.x>tk.x && zd.xtk.y && zd.y   {    zd.life=false;    tk.life=false;    b2=true;    Explode bz=new Explode(tk.x,tk.y);    bzV.add(bz);    b2=true;   }   break;  }  return b2; } public void shuttedArmy() {  for(int i=0;i  {   Bullet zd=mt.zdV.get(i);   if(zd.life)   {    for(int j=0;j    {     ArmyTank at=armyTankV.get(j);     if(at.life)     {      if(this.shutted(zd, at))      {       Record.atDc();       Record.numShutAt();      }      this.shutted(zd, at);     }    }   }  } } public void shuttedMine() {  for(int i=0;i  {   ArmyTank at=armyTankV.get(i);   for(int j=0;j   {    Bullet zd=at.dzdV.get(j);    this.shutted(zd, mt);    if(this.shutted(zd, mt))    {     Record.mtDc();    }   }   this.repaint();  } } public void run() {  while(true)  {   try   {    Thread.sleep(100);    this.repaint();   }   catch(Exception e)   {}   for(int i=0;i   {    Bullet zd=mt.zdV.get(i);    if(zd.life)    {     for(int j=0;j     {      ArmyTank at=armyTankV.get(j);      if(at.life)      {       this.shuttedArmy();      }     }    }    this.repaint();   }   for(int i=0;i   {    Bullet zd=at.dzdV.get(i);    if(mt.life)    {     this.shuttedMine();    }   }   this.repaint();  } }}class GameStage extends JPanel implements Runnable{ int time=0; public void paint(Graphics g) {  super.paint(g);  g.fillRect(0,0,400,300);  if(time%2==0)  {   g.setColor(Color.orange);   g.setFont(new Font("Blackoak Std",Font.BOLD,20));   g.drawString("Welcome To", 50,140);   g.setFont(new Font("Blackoak Std",Font.PLAIN,15));   g.drawString("TANK WAR GAME", 30,170);  } } public void run() {  while(true)  {   try   {    Thread.sleep(500);   }catch(Exception e){}   time++;   this.repaint();  } }}//material lasspackage cha09;import java.io.*;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class Tank{ int x=0,y=0; int direction=0; int speed=5; boolean life=true; public int getDirection() {  return direction; } public void setDirection(int direction) {  this.direction = direction; } public int getSpeed() {  return speed; } public void setSpeed(int speed) {  this.speed = speed; } public int getX() {  return x; } public void setX(int x) {  this.x = x; } public int getY() {  return y; } public void setY(int y) {  this.y = y; } public Tank(int x,int y) {  this.x=x;  this.y=y; }}class Bullet implements Runnable{ int x,y; int direction; int speed=5; boolean life=true; public Bullet(int x,int y,int direction) {  this.x=x;  this.y=y;  this.direction=direction; } public void run() {  while(true)  {   try   {    Thread.sleep(50);   }   catch(Exception e)   {}   switch(direction)   {   case 0:    y-=speed;    break;   case 1:    y+=speed;    break;   case 2:    x-=speed;    break;   case 3:    x+=speed;    break;   }   if(x<0||x>400||y<0||y>300)   {    this.life=false;   }  } }}class MyTank extends Tank{ Vector zdV=new Vector(); Bullet zd=null; public MyTank(int x,int y) {  super(x,y); } public void turnUp() {  y-=speed; } public void turnDown() {  y+=speed; } public void turnLeft() {  x-=speed; } public void turnRight() {  x+=speed; } public void shutBullet() {  switch(this.direction)  {  case 0:    zd=new Bullet(x+10,y,0);    zdV.add(zd);   break;  case 1:   zd=new Bullet(x+10,y+30,1);   zdV.add(zd);      break;  case 2:   zd=new Bullet(x,y+10,2);   zdV.add(zd);      break;  case 3:   zd=new Bullet(x+30,y+10,3);   zdV.add(zd);      break;  }  Thread aa=new Thread(zd);  aa.start(); }}class ArmyTank extends Tank implements Runnable{ int time=0; int direction; Bullet zd=null; Vector dzdV=new Vector(); Vector armyTankV=null; public ArmyTank(int x,int y) {  super(x, y); } public boolean Impact() {  boolean b=true;  switch(this.direction)  {  case 0:  case 1:   for(int i=0;i   {    ArmyTank at=armyTankV.get(i);    if(at!=this)    {     if(this.x>=at.x+20 || this.x+20<=at.x || (this.x<=at.x+20 && this.x+20>=at.x && (this.y+30<=at.y || this.y<=at.y+30)))     {      return true;     }     if(this.y>=at.y+20 || this.y+30<=at.y || (this.y>=at.y-30 && this.y<=at.y+20 && (this.x>at.x+30) || (this.x+20<=at.x)))     {      return true;     }    }   }   break;  case 2:  case 3:   for(int i=0;i   {    ArmyTank at=armyTankV.get(i);    if(at!=this)    {     if(at.x+20<=this.x || at.x>=this.x+30 || (this.x>=at.x-30 && this.x<=at.x+20 &&(this.y>=at.y+30 || this.y+20<=at.y)))     {      return true;     }     if(this.y>=at.y+20 || this.y+20<=at.y || (this.y>=at.y-20 && this.y<=at.y+20 &&(this.x>=at.x+30 || this.x+30<=at.x)))     {      return true;     }    }   }   break;  }  return b; } public void run() {  int speed=2;  while(true)  {      switch(this.direction)      {      case 0:       for(int i=0;i<30;i++)       {        if(y>0 && Impact())        {         y-=speed;        }        try     {      Thread.sleep(50);     }catch(Exception e){}       }       break;      case 1:        for(int i=0;i<30;i++)        {         if(y<240 && Impact())         {          y+=speed;         }         try      {       Thread.sleep(50);      }catch(Exception e){}        }        break;      case 2:       for(int i=0;i<30;i++)       {        if(x>0 && Impact())        {         x-=speed;        }        try     {      Thread.sleep(50);     }catch(Exception e){}       }       break;      case 3:       for(int i=0;i<30;i++)       {        if(x<360 && Impact())        {         x+=speed;        }        try     {      Thread.sleep(50);     }catch(Exception e){}       }       break;       }      this.direction=(int)(Math.random()*4);      if(this.life==false)      {       break;      }      this.time++;      if(time%2==0)      {       if(life)       {        if(dzdV.size()<8)        {         switch(direction)         {         case 0:          zd=new Bullet(x+10,y,0);          dzdV.add(zd);          break;         case 1:          zd=new Bullet(x+10,y+30,1);          dzdV.add(zd);          break;         case 2:          zd=new Bullet(x+10,y+10,2);          dzdV.add(zd);          break;         case 3:          zd=new Bullet(x+30,y+10,3);          dzdV.add(zd);          break;         }         Thread dd=new Thread(zd);         dd.start();        }       }      }  } }}class Explode{ int x,y; int lifeLength=9; boolean life=true; public Explode(int x,int y) {  this.x=x;  this.y=y; } public void lifeLengthDecrease() {  if(lifeLength>0)  {   lifeLength--;  }  else  {   this.life=false;  } }}class Record{ Vector armyTankV=null; private static int numAt=10; private static int numMt=2; private static int sumShutNumAt=0; private static FileOutputStream fo=null; private static FileInputStream fi=null; public static int getSumShutNumAt() {  return sumShutNumAt; } public static void setSumShutNumAt(int sumShutNumAt) {  Record.sumShutNumAt = sumShutNumAt; } public static void numShutAt() {  sumShutNumAt++; } public static int getNumAt() {  return numAt; } public static void setNumAt(int numAt) {  Record.numAt = numAt; } public static int getNumMt() {  return numMt; } public static void setNumMt(int numMt) {  Record.numMt = numMt; } public static void atDc() {  numAt--; } public static void mtDc() {  numMt--; } public static void writeRecord() {  try  {   fo=new FileOutputStream("F:/java/Part2/writeRecord.txt");   fo.write(sumShutNumAt);  }  catch(Exception e){}  finally  {   try   {    fo.close();   }   catch(Exception e){}  } } public static void readRecord() {  try  {   fi=new FileInputStream("F:/java/Part2/writeRecord.txt");   sumShutNumAt=fi.read();  }  catch(Exception e){}  finally  {   try   {    fi.close();   }   catch(Exception e){}  } } public void saveGame() {  try  {   fo=new FileOutputStream("F:/java/Part2/writeRecord.txt");   fo.write(sumShutNumAt);   for(int i=0;i   {    ArmyTank at=armyTankV.get(i);    if(at.life)    {     int zb=at.x;     int zb1=at.y;     int zb2=at.direction;     fo.write(zb);     fo.write(zb1);     fo.write(zb2);    }   }  }  catch(Exception e)  {}  finally  {   try   {    fo.close();    fi.close();   }   catch(Exception e){}  } }}class Location{ int x,y; int location; public Location(int x,int y,int location) {  this.x=x;  this.y=y;  this.location=location; }}class Shengyin extends Thread { private String wjm; public Shengyin(String ypwj) {   wjm=ypwj; } public void run() {  File wjl = new File(wjm);  AudioInputStream ypsrl = null;  try {   ypsrl = AudioSystem.getAudioInputStream(wjl);  } catch (Exception e){}  AudioFormat format = ypsrl.getFormat();  SourceDataLine aqsj = null;  DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);  try {   aqsj = (SourceDataLine) AudioSystem.getLine(info);   aqsj.open(format);  } catch (Exception e){}  aqsj.start();  int zjtj = 0;  byte[] hczj = new byte[1024];  try {   while (zjtj != -1) {    zjtj = ypsrl.read(hczj, 0, hczj.length);    if (zjtj >= 0)     aqsj.write(hczj, 0, zjtj );   }  } catch (Exception e){}  finally {   aqsj.drain();   aqsj.close();  } }}
原创粉丝点击