用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

花花shij    -  云代码空间

——

Java坦克

2017-11-02|824阅||

摘要:/*  *  * 功能:坦克大战5.0版  * 画出坦克  * 可以上下左右移动  * 坦克可以连发子弹  * 实现坦克爆炸得效果  * 防止敌人坦克重叠  * 1.决定吧这段代码放在EnemyTank中  * 可以分关  * 1.专门写一个Panel,他说一个空的  * 2.

/*
 *
 * 功能:坦克大战5.0版
 * 画出坦克
 * 可以上下左右移动
 * 坦克可以连发子弹
 * 实现坦克爆炸得效果
 * 防止敌人坦克重叠
 * 1.决定吧这段代码放在EnemyTank中
 * 可以分关
 * 1.专门写一个Panel,他说一个空的
 * 2.让字体闪烁
 *
 * 可以在玩游戏得时候暂停和继续
 *
 * 1.当用户点击暂停是,把子弹和坦克得速度都设置为0
 * 并让坦克得方向不要变化
 * 可以记录玩家得成绩
 * 1.用文件流
 * 2.单写一个类,来记录这些成绩
 * 3.先完成保存共击毁多少辆敌人坦克
 * 4.存盘退出,可以记录未消灭坦克得状态,并可以恢复
 * 5.java如何操作声音文件
 *
 */
package com;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.Reader;
import java.util.*;
public class MyTankGame1 extends JFrame implements ActionListener{
 MyPanel mp=null;
 //定义一个开始面板
 MystartPanel msp=null;
 //做出我的菜单
 JMenuBar jmb=null;
 //开始游戏
 JMenu jm1=null;
 JMenuItem jmi1=null;
 JMenuItem jmi2=null;
 JMenuItem jmi3=null;
 JMenuItem jmi4=null;
 public static void main(String[] args) {
  MyTankGame1 mt=new MyTankGame1();
 }
 //构造函数
 public MyTankGame1()
 {
  //创建菜单及菜单选项
  jmb=new JMenuBar();
  jm1=new JMenu("游戏(G)");
  //设置快捷方式
  jm1.setMnemonic('G');
  jmi1=new JMenuItem("开始新游戏(N)");
  jmi1.setMnemonic('N');
  //对jmi1响应
  jmi1.addActionListener(this);
  jmi1.setActionCommand("newGame");
  
  jmi2=new JMenuItem("退出游戏(E)");
  jmi2.setMnemonic('E');
  //对jmi2响应
  jmi2.addActionListener(this);
  jmi2.setActionCommand("exit");
  
  jmi3=new JMenuItem("存盘退出(C)");
  jmi3.setMnemonic('C');
  //对jmi3进行注册监听
  jmi3.addActionListener(this);
  jmi3.setActionCommand("saveExit");
  
  jmi4=new JMenuItem("继续上局(S)");
  //注册监听
  jmi4.addActionListener(this);
  jmi4.setActionCommand("conGame");
  
  jm1.add(jmi1);
  jm1.add(jmi2);
  jm1.add(jmi3);
  jm1.add(jmi4);
  
  jmb.add(jm1);
  
  
  
  msp=new MystartPanel();
  this.add(msp);
  Thread t=new Thread(msp);
  t.start();
  
  
  this.setJMenuBar(jmb);
  this.setTitle("坦克大战");
  this.setSize(400,500);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setVisible(true);
  
  
  
 }
 public void actionPerformed(ActionEvent a){
  //对用户不同得点击做出不同得处理
  if(a.getActionCommand().equals("newGame"))
  {
   //创建战场面板
   mp=new MyPanel("newGame");
   //启动mp线程
   Thread t=new Thread(mp);
   t.start();
   //先删除旧得面板
   this.remove(msp);
   
   this.add(mp);
   
   //注册监听
   this.addKeyListener(mp);
   //显示,刷新
   this.setVisible(true);
  }
  else if(a.getActionCommand().equals("exit"))
  {
   //用户点击了退出系统得菜单
   
   //保存击毁敌人得数量
   Recorder.keepRecording();
   System.exit(0);
  }
  else if(a.getActionCommand().equals("saveExit"))
  {
   //工作
   Recorder er=new Recorder();
   er.setEts(mp.ets);
   //保存击毁敌人得数量和敌人得坐标
   er.keepRecAndEnemyTank();
   //退出
   System.exit(0);
  }
  else if(a.getActionCommand().equals("conGame"))
  {
   //恢复
   //创建战场面板
   mp=new MyPanel("con");
   
   
   //启动mp线程
   Thread t=new Thread(mp);
   t.start();
   //先删除旧的面板
   this.remove(msp);
   
   this.add(mp);
   
   //注册监听
   this.addKeyListener(mp);
   //显示,刷新
   this.setVisible(true);
  }
 }
}
//就是一个提示作用
class MystartPanel extends JPanel implements Runnable
{
 int times=0;
 public void paint(Graphics g)
 {
  super.paint(g);
  g.fillRect(0, 0, 400, 300);
  //提示信息
  if(times%2==0)
  {
   g.setColor(Color.yellow);
   //开关信息的字体
   Font myFont=new Font("华文新魏",Font.BOLD,30);
   g.setFont(myFont);
   g.drawString("start",150,150);
  }
 }
 public void run()
 {
  while(true){
   //休眠一秒
   try {
    Thread.sleep(400);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   times++;
   //重画
   this.repaint();
  }
 }
}

//我的面板
class MyPanel extends JPanel implements KeyListener,Runnable
{
 //初始化一个我的坦克
 Hero hero=null;
 //判断是继续上局还是新游戏
 
 //定义敌人的坦克
 Vector<EnemyTank> ets=new Vector<EnemyTank>();
 Vector<Node> nodes=new Vector<Node>();
 //定义一个炸弹集合
 Vector<Bomb> bombs=new Vector<Bomb>();
 
 
 int enSize=5;
 
 //定义三张图片,三张图片才能组成一颗炸弹
 Image image1=null;
 Image image2=null;
 Image image3=null;
 //构造函数
 public MyPanel(String flag)
 {
  //恢复记录
  Recorder.getRecording();
  hero=new Hero(170,260);
  
  
  if(flag.equals("newGame"))
  {
   //初始化敌人的坦克
   for(int i=0;i<enSize;i++)
   {
    //创建一辆敌人的坦克对象
    EnemyTank et=new EnemyTank((i+1)*50,0);
    et.setColor(0);
    et.setDirect(2);
    //将MyPanel的敌人坦克向量交给敌人坦克
    et.setEts(ets);
    
    //启动敌人坦克
    Thread t=new Thread(et);
    t.start();
    //给敌人坦克添加一颗子弹
    Shot s=new Shot(et.x+10,et.y+30,2);
    //加给敌人坦克
    et.ss.add(s);
    Thread t2=new Thread(s);
    t2.start();
    //加入到Vector中
    ets.add(et);
   }
  }
  else
  {
   nodes=new Recorder().getNodeAndEnMums();
   //初始化敌人坦克
   for(int i=0;i<nodes.size();i++)
   {
    System.out.println("go on");
    Node node=nodes.get(i);
    //创建一辆敌人的坦克对象
    EnemyTank et=new EnemyTank(node.x,node.y);
    et.setColor(0);
    et.setDirect(node.direct);
    //将MyPanel的敌人坦克向量交给该敌人坦克
    et.setEts(ets);
    
    //启动敌人坦克
    Thread t=new Thread(et);
    t.start();
    //给敌人坦克添加一颗子弹
    Shot s=new Shot(et.x+10,et.y+30,2);
    //加入给敌人坦克
    et.ss.add(s);
    Thread t2=new Thread(s);
    t2.start();
    //加入到Vector中
    ets.add(et);
   }
  }
  //初始化图片
  image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
  image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
  image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
  
 }
 //画出提示信息
 public void showInfo(Graphics g)
 {
  //画出敌人提示信息坦克(该坦克不参与战斗)
  this.drawTank(100,300,g,0,0);
  g.setColor(Color.BLACK);
  g.drawString(Recorder.getEnNum()+"",100,380);
  //画出自己提示信息坦克(该坦克不参与战斗)
  this.drawTank(200,330,g,0,1);
  g.setColor(Color.BLACK);
  g.drawString(Recorder.getMyLife()+"",205,380);
  //画出玩家的总成绩
  g.setColor(Color.BLACK);
  Font f=new Font("宋体",Font.BOLD,20);
  g.setFont(f);
  g.drawString("总成绩:",250,360);
  this.drawTank(330,340,g,0,0);
  
  g.setColor(Color.BLACK);
  g.drawString(Recorder.getAllEnNum()+"", 335, 390);
  
 }
 //重写paint
 public void paint(Graphics g)
 {
  super.paint(g);
  g.fillRect(0,0, 400, 300);
  //画出提示信息
  this.showInfo(g);
  //画出自己的坦克
  if(hero.islive)
  {
   this.drawTank(hero.getX(),hero.getY(),g,this.hero.getDirect(),1);
  }
  //从ss中取出每颗子弹,并画出
  for(int i=0;i<this.hero.ss.size();i++)
  {
   Shot myShot=hero.ss.get(i);
   //画出一个子弹
   if(hero.s!=null&&myShot.islive==true)
   {
    g.draw3DRect(myShot.x, myShot.y, 1, 1,false);
   }
   if(myShot.islive==false)
   {
    //从ss中删除掉该子弹
    hero.ss.remove(myShot);
   }
  }
  //画出炸弹
  for(int i=0;i<bombs.size();i++)
  {
   //取出炸弹
   Bomb b=bombs.get(i);
   if(b.life>6)
   {
    g.drawImage(image1,b.x,b.y,30,30,this);
    
   }
   else if(b.life>3)
   {
    g.drawImage(image2,b.x,b.y,30,30,this);
   }
   else
   {
    g.drawImage(image3,b.x,b.y,30,30,this);
   }
   //让生命值减小
   b.lifeDown();
   //如果炸弹生命值为0,就让该炸弹从bombs向量中去掉
   if(b.life==0)
   {
    bombs.remove(b);
   }
   
   
  }
  
  
  //画出敌人的坦克
  for(int i=0;i<ets.size();i++)
  {
   EnemyTank et=ets.get(i);
   if(et.islive==true)
   {
    this.drawTank(et.getX(),et.getY(),g,et.getDirect(),0);
    //在画出敌人子弹
    for(int j=0;i<et.ss.size();j++)
    {
     //取出子弹
     Shot enemyShot=et.ss.get(j);
     if(enemyShot.islive)
     {
      g.draw3DRect(enemyShot.x,enemyShot.y,1,1,false);
     }
     else
     {
      //如果敌人的坦克死亡了就从Vector去掉
      et.ss.remove(enemyShot);
     }
    }
   }
  }
 }
 //敌人的坦克是否击中我
 public void hitMe()
 {
  //取出每一个敌人的坦克
  for(int i=0;i<this.ets.size();i++)
  {
   //取出坦克
   EnemyTank et=ets.get(i);
   //取出每一颗子弹
   for(int j=0;j<et.ss.size();j++)
   {
    //取出子弹
    Shot enemyTank=et.ss.get(j);
    if(hero.islive)
    {
     this.hitTank(enemyTank,hero);
     
    }
   }
  }
 }
 
 //判断我的子弹是否击中踢人的坦克
 public void hitEnemyTank()
 {
  //判断是否击中敌人的坦克
  for(int i=0;i<hero.ss.size();i++)
  {
   //取出子弹
   Shot myShot=hero.ss.get(i);
   //判断子弹是否有效
   if(myShot.islive==true)
   {
    //取出每个坦克与它判断
    for(int j=0;j<this.ets.size();j++)
    {
     //取出坦克
     EnemyTank et=ets.get(j);
     if(et.islive==true)
     {
      if(this.hitTank(myShot,et))
      {
       //减少敌人坦克数量
       Recorder.reduceEnNum();
       //增加消灭敌人的数量
       Recorder.addEnNumRec();
      }
     }
    }
   }
   
  }
 }
 
 //写一个函数专门判断子弹是否击中敌人坦克
 public boolean hitTank(Shot s,Tank et)
 {
  boolean b2=false;
  
  //判断改坦克的方向
  switch(et.direct)
  {
  //如果敌人坦克此时的方向是上或下
  case 0:
  case 2:
   if(s.x>et.x&&s.x<(et.x+20)&&et.y<s.x&&s.y<(et.y+30))
   {
    //击中
    //子弹死亡
    s.islive=false;
    //敌人坦克死亡
    et.islive=false;
    b2=true;
    //创建一颗炸弹,放入Vector
    Bomb b=new Bomb(et.x,et.y);
    bombs.add(b);
    
      
   }
   break;
  case 1:
  case 3:
   
   if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20)
   {
    //击中
    //子弹死亡
    s.islive=false;
    //敌人坦克死亡
    et.islive=false;
    b2=true;
    //创建一颗炸弹,放入Vector
    Bomb b=new Bomb(et.x,et.y);
    bombs.add(b);
   }
  }
  return b2;
 }
 //画出坦克函数
 public void drawTank(int x,int y,Graphics g,int direct,int type)
 {
  //判断是什么类型的坦克
  switch(type)
  {
  case 0:
   g.setColor(Color.cyan);
   break;
  case 1:
   g.setColor(Color.yellow);
   break;
   
  }
  //判断方向
  switch(direct)
  {
  //向上
  case 0:
   //画出我的坦克(到时再封装成一个函数)
   //1.画出左边的矩形
   g.fillRect(x, y, 5, 30);
   //画出右边的矩形
   g.fillRect(x+15,y, 5, 30);
   //画出中间的矩形
   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);
   break;
   
  //向右
  case 1:
   //画坦克
   //画出上面的矩形
   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+30, y+10);
   break;
   
   //向下
   case 2:
   //画坦克
   //画出上面的矩形
   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+10, y+5, 10, 10);
   //画出炮筒
   g.drawLine(x+10, y+15, x+10, y+30);
   break; 
   
   //向左
   case 3:
    //画坦克
    //画出上面的矩形
    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, y+10);
    break;       
   
  }
 }
 //键按下处理,a表示向左,s表示向下,d表示向右,w表示向上
 public void keyPressed(KeyEvent e)
 {
  if(e.getKeyCode()==KeyEvent.VK_W)
  {
   //设置我的坦克的方向
   //向上
   this.hero.setDirect(0);
   this.hero.moveUp();
   
  }
  else if(e.getKeyCode()==KeyEvent.VK_D)
  {
   //向右
   this.hero.setDirect(1);
   this.hero.moveRight();
  }
  else if(e.getKeyCode()==KeyEvent.VK_S)
  {
   //向下
   this.hero.setDirect(2);
   this.hero.moveDown();
  }
  else if(e.getKeyCode()==KeyEvent.VK_A)
  {
   //向左
   this.hero.setDirect(3);
   this.hero.moveLeft();
  }
  
  //判断玩家是否发射子弹
  if(e.getKeyCode()==KeyEvent.VK_J)
  {
   if(this.hero.ss.size()<=4)
   {
    this.hero.ShotEnemy();
   }
  }
  //必须重新绘制Panel
  this.repaint();
 }
 
 public void keyReleased(KeyEvent e)
 {
  
 }
 public void keyTyped(KeyEvent e)
 {
  
 }
 public void run()
 {
  //每隔100毫秒重绘
  while(true)
  {
   try{
    Thread.sleep(100);
   }catch(InterruptedException e)
   {
    e.printStackTrace();
   }
   this.hitEnemyTank();
   //函数,判断敌人的子弹是否击中我了
   this.hitMe();
   
   //重绘
   this.repaint();
   
  }
 }
 
}
顶 0踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: 花花shij
    • 等级: 初级程序员
    • 积分: 12
    • 代码: 0 个
    • 文章: 7 篇
    • 随想: 0 条
    • 访问: 4 次
    • 关注

    人气文章

    人气代码

      最新提问

        站长推荐