java怎么制作坦克大战

来源:爱站网时间:2020-05-11编辑:网友分享
对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧。

对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧。

详情请参照注释,这里就不多废话了,实现一下儿时的经典而已。

Blood.java

package com.hkm.TankWar;
import java.awt.*;
/**
 * 血块类,我方坦克吃了可回血;
 * @author Hekangmin
 *
 */
public class Blood {
  private int x,y,w,h;//血块的位置和宽度高度;
   
  private TankWarClient tc;
   
  private int step=0;//纪录血块移动的步数;
   
  private boolean live=true;
  public boolean isLive() {
    return live;
  }
 
  public void setLive(boolean live) {
    this.live = live;
  }
    /**
     * 纪录血块的位置;
     */
  private int[][] pos={{400,300},{400,320},{420,320},{440,300},{440,330},{480,400},{520,400},{540,400}};
        
  public Blood()
  {
    x=pos[0][0];
    y=pos[0][1];
    w=h=18;
  }
   
  public void draw(Graphics g)
  {
    if(!live) return;
     
    Color c=g.getColor();
    g.setColor(Color.CYAN);
    g.fillOval(x, y, w, h);
    g.setColor(c);
     
    move();
  }
  /**
   * 移动血块
   */
  public void move()
  {
    step++;
    if(step>=pos.length) step=0;
    else{
    x=pos[step][0];
    y=pos[step][1];
    }
  }
   
   
  public Rectangle getRect()
  {
    return new Rectangle(x,y,w,h);
  }
   
   
}

Explode.java

package com.hkm.TankWar;
import java.awt.*;
/**
 * 爆炸类
 * @author Hekangmin
 *
 */
public class Explode {
  private int x,y;//爆炸发生的位置
   
  private boolean Live=true;
   
  int dia[]={4,8,12,16,32,40,20,14,4};//用园模拟,代表圆的直径;
   
  int step=0;//区别移到第几个直径
   
  private TankWarClient tc;//持有引用
   
  public Explode(int x,int y,TankWarClient tc)
  {
    this.x=x;
    this.y=y;
    this.tc=tc;
  }
  public void draw(Graphics g)
  {
    if(!Live)
    {
      tc.explodes.remove(this);
      return;
    }
    if(step==dia.length)//如果到了最后一个直径爆炸死亡;
    {
      Live=false;
      step=0;
      return;
    }
    Color c=g.getColor();
    g.setColor(Color.YELLOW);
    g.fillOval(x, y, dia[step], dia[step]);
    g.setColor(c);
    step++;
  }
   
}

Missile.java

package com.hkm.TankWar;
import java.awt.*;
import java.awt.Event.*;
import java.awt.event.KeyEvent;
import java.util.List;
/**
 * 子弹类
 * @author Hekangmin
 *
 */
 public class Missile {
    private int x,y;//子弹的位置
    private Tank.Direction dir;//坦克方向
     
    private static final int XSPEED=10;//坦克x方向的移动速度,
    private static final int YSPEED=10;//坦克y方向的移动速度,
     
    public static final int WIDTH=10;
    public static final int HEIGHT=10;
     
    private boolean Live=true;//判断子弹是否活着
     
    private boolean good;//区分敌军子弹和我军子弹
     
    private TankWarClient tc;
     
  public Missile(int x, int y, Tank.Direction dir) {
    this.x = x;
    this.y = y;
    this.dir = dir;
  }
   
  public Missile(int x,int y,boolean good,Tank.Direction dir,TankWarClient tc)
  {
    this(x,y,dir);
    this.good=good;//将坦克好坏的属性与子弹还坏属性设为相同;
    this.tc=tc;
  }
   
  /**
   * 画出子弹
   * @param g为画笔
   */
  public void draw(Graphics g)
  {
    if(!Live)
      {
      tc.missiles.remove(this);
      return;
      }
    Color c=g.getColor();
    if(good)
    {
      g.setColor(Color.BLUE);
    }
    else g.setColor(Color.ORANGE);
    g.fillOval(x, y, WIDTH, HEIGHT);
    g.setColor(c);
     
    move();
  }
   
  /**
   * 根据坦克的方向让子弹移动
   */
  private void move() {
    switch(dir)
    {
    case L:
      x-=XSPEED;
      break;
    case LU:
      x-=XSPEED;
      y-=YSPEED;
      break;
    case U:
      y-=YSPEED;
      break;
    case RU:
      x+=XSPEED;
      y-=YSPEED;
      break;
    case R:
      x+=XSPEED;
      break;
    case RD:
      x+=XSPEED;
      y+=YSPEED;
      break;
    case D:
      y+=YSPEED;
      break;
    case LD:
      x-=XSPEED;
      y+=YSPEED;
      break;
    }
     
    if(xTankWarClient.GAME_WIDTH||y>TankWarClient.GAME_HEIGHT)//子弹越界则让其死亡;
    {
      Live=false;
    }
  }
   
   
  public boolean isLive()
  {
    return Live;
  }
 
  public Rectangle getRect()//获取子弹的矩形区域;
  {
    return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);
  }
   
  /**
   * 判断子弹与坦克碰撞;
   * @param t为坦克
   * @return返回true则表示发生碰撞,否则没有碰撞;
   */
  public boolean hitTank(Tank t)
  {
    if(this.Live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood())
    {
      if(t.isGood())
      {
        t.setLife(t.getLife()-10);
        if(t.getLife() tanks)
  {
    for(int i=0;i

Tank.java

package com.hkm.TankWar;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.*;
/**
 * 坦克类
 * @author Hekangmin
 *
 */
public class Tank {
  public static final int XSPEED=5;//坦克x方向速度
  public static final int YSPEED=5;
   
  public static final int WIDTH=30;
  public static final int HEIGHT=30;
   
  private BloodBar bb=new BloodBar();//血条
   
  private int life=100;
   
  public int getLife() {
    return life;
  }
 
  public void setLife(int life) {
    this.life = life;
  }
 
 
  private static Random r=new Random();
   
  private static int step=r.nextInt(12)+3;//定义一个数表示敌军坦克随机东的步数;
   
  private boolean bL=false,bU=false,bR=false,bD=false;
   
  enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//利用枚举类型定义坦克方向;
  private int x,y;
   
  private int oldX,oldY;//纪录上一步坦克的位置;
   
  private boolean live=true;//判断是否活着
   
  public boolean isLive() {
    return live;
  }
 
  public void setLive(boolean live) {
    this.live = live;
  }
 
 
  private boolean good;//坦克是好是坏
   
  public boolean isGood() {
    return good;
  }
 
 
  private Direction ptDir=Direction.D;//新增炮筒的方向;
   
  TankWarClient tc;//为了持有对方的引用以可以方便访问其成员变量;
   
  Direction dir=Direction.STOP;//一开始将坦克方向设为stop;
   
   
   
  public Tank(int x,int y,boolean good,Direction dir,TankWarClient tc)
  {
    this.x=x;
    this.y=y;
    this.oldX=x;
    this.oldY=y;
    this.good=good;
    this.dir=dir;
    this.tc=tc;//持有对方的引用;
  }
   
   
  public void draw(Graphics g)
  {
    if(!live)//如果死亡则不再draw;
    {  
      if(!good)
      {
        tc.tanks.remove(this);
        if(tc.tanks.size()TankWarClient.GAME_WIDTH) x=TankWarClient.GAME_WIDTH-30;
    if(y+Tank.HEIGHT>TankWarClient.GAME_HEIGHT) y=TankWarClient.GAME_HEIGHT-30;
     
    if(!good)
    {
      Direction[] dirs=Direction.values();//将枚举类型转化成数组;
       
      if(step==0)
      {
        step=r.nextInt(12)+3;
        int rn=r.nextInt(dirs.length);//产生length以内随机的整数;
        dir=dirs[rn];
      }
      step--;
      if(r.nextInt(40)>20) this.fire();//使敌军坦克发射子弹;
    }
     
  }
   
  /**
   * 处理按键
   * @param e键盘事件;
   */
  public void KeyPressed(KeyEvent e)
  {
    int key=e.getKeyCode();
    switch(key)
    {
     
    case KeyEvent.VK_LEFT:
      bL=true;
      break;
    case KeyEvent.VK_RIGHT:
      bR=true;
      break;
    case KeyEvent.VK_UP:
      bU=true;
       break;
    case KeyEvent.VK_DOWN:
      bD=true;
      break;
    }
    locationDir();
  }
   
   
  public void keyReleased(KeyEvent e) {
    int key=e.getKeyCode();
    switch(key)
    {
    case KeyEvent.VK_CONTROL:
      fire();
      break;
    case KeyEvent.VK_LEFT:
      bL=false;
      break;
    case KeyEvent.VK_RIGHT:
      bR=false;
      break;
    case KeyEvent.VK_UP:
      bU=false;
       break;
    case KeyEvent.VK_DOWN:
      bD=false;
      break;
    case KeyEvent.VK_A:
      superFire();
      break;
    case KeyEvent.VK_F2:
      reBorn();
      break;
    }
    locationDir();
  }
   
  /**
   * 发射子弹
   * @return返回子弹类型
   */
  public Missile fire() {
    if(!live)
      return null;
    int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//计算子弹发射的位置;
    int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;
    Missile m=new Missile(mx,my,good,ptDir,this.tc);////根据炮筒方向发射子弹
    tc.missiles.add(m);
    return m;
  }
   
   
  public Missile fire(Direction dir)
  {
    if(!live)
      return null;
    int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;
    int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;
    Missile m=new Missile(mx,my,good,dir,this.tc);//根据坦克的方向发射子弹;
    tc.missiles.add(m);
    return m;
  }
   
  public void superFire()
  {
    Direction[] dirs=Direction.values();
    for(int i=0;i tanks)
  {
    for(int i=0;i

TankWarClient.java

package com.hkm.TankWar;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
 
/**
 * 这个是游戏的运行窗口;
 * @author Hekangmin
 *
 */
public class TankWarClient extends Frame{
/**
 * 游戏窗口的宽度;
 */
  public static final int GAME_WIDTH=800;
   
  /**
   * 游戏窗口的高度;
   */
  public static final int GAME_HEIGHT=600;
   
  Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this);
  List tanks=new ArrayList();
  List explodes=new ArrayList();
  List missiles=new ArrayList();
  Wall w1=new Wall(300,200,20,200,this);
  Wall w2=new Wall(600,300,30,150,this);
  Blood b=new Blood();
   
  /**
   * 画一张虚拟图片;
   */
  Image OffScreenImage=null;
   
  public TankWarClient(String name)//设置文字
  {
    super(name);
  }
   
  /**
   * 运行窗口;
   */
   
  public void launchFrame()
  {
    for(int i=0;i

Wall.java

package com.hkm.TankWar;
import java.awt.*;
/**
 * 生成阻碍物墙这个类;
 * @author Hekangmin
 *
 */
 
public class Wall {
  /**
   * x,y为墙的位置,w,h为宽度高度;
   */
  int x,y,w,h;
  /**
   * 持有引用
   */
  TankWarClient tc;
   
  public Wall(int x, int y, int w, int h, TankWarClient tc) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.tc = tc;
  }
   
  public void draw(Graphics g)
  {
    Color c=g.getColor();
    g.setColor(Color.GRAY);
    g.fillRect(x,y,w,h);
    g.setColor(c);
  }
   
  /**
   * 得到墙的矩形区域;
   * @return
   */
  public Rectangle getRect()
  {
    return new Rectangle(x,y,w,h);
  }
   
}

java怎么制作坦克大战?坦克大战是我们小时候的经典游戏,本文主要面向于学过Java的人群,与学了一段时间的人提供的实现方法。

上一篇:Tomcat服务无法启动的问题的解决方法

下一篇:Java中的弱引用的介绍

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载