TankWar游戏(图片版)----阶段六

来源:互联网 发布:夏朝存在吗 知乎 编辑:程序博客网 时间:2024/04/30 13:17

游戏素材:https://pan.baidu.com/s/1i4Z2Cip

阶段六实现敌方坦克的产生,受伤害死亡的效果。

初始化游戏时产生10辆敌方坦克,左右分别4辆,上方3辆。

1、初始化敌方坦克

TankClient中创建集合用来存放敌方坦克:
public List<Tank> tanks = new LinkedList<Tank>();
在launchFrame()后添加敌方坦克:
for(int i=0;i<4;i++){//左右分别产生4辆坦克Tank t1 = new Tank(10,150*i,5,Direction.D,false,tc);//在tank类中有变量good用于设置己方(true)还是敌方(false)Tank t2 = new Tank(1300,150*i,5,Direction.D,false,tc);tanks.add(t1);tanks.add(t2);}for(int i=1;i<=3;i++){//上方产生3辆敌方坦克Tank t = new Tank(350*i,40,5,Direction.D,false,tc);tanks.add(t);}
画出敌方tank:
for(int i=0; i<tanks.size(); i++) {Tank t = tanks.get(i);t.draw(g);}
效果图(右边4辆产生了,GIF中没显示罢了):

2、敌方坦克的走位与开火

此游戏中没有实现AI,所以敌方坦克的走位我们设计为随机走位
随机走位思想:
随机选取一个方向走几步,产生一个随机数是否大于某值,大于则开火,再随机选取方向走位,产生一个随机数是否大于某值,大于则开火,如此反复。

在tank类中添加属性:
private static Random r = new Random();private int step=r.nextInt(12);//随机走多少步
在move()方法中添加:
if(!good) {Direction[] dirs = Direction.values();if(step == 0) {step = r.nextInt(12) + 3;int rn = r.nextInt(dirs.length);dir = dirs[rn];//获取随机方向}step --;if(r.nextInt(40) > 38) this.fire();//产生的随机数大于38就开火}
效果图:


3、中弹死亡效果(己方子弹不受伤害)

子弹类添加属性:good。用于判断是不是己方子弹。
游戏中的碰撞检测:
在游戏中判断是否中弹基本思路是基于矩形的碰撞检测,java中可以很方便的让我们可以得到自身的矩形,使用getRect()方法。
在子弹类中添加方法:
public boolean hitTank(Tank t) {if(this.live && this.getRect().intersects(t.getRect()) && t.getAlive() && this.good != t.isgood()) {//不是己方子弹并且发生了碰撞t.setAlive(false);//坦克死亡this.live = false;//子弹应该消失return true;}return false;}public boolean hitTanks(List<Tank> tanks) {for(int i=0; i<tanks.size(); i++) {if(hitTank(tanks.get(i))) {return true;}}return false;}
在TankClient的paint()方法中添加代码:
m.hitTanks(tanks);m.hitTank(mytank);

4、坦克死亡后从集合中移除

public void draw(Graphics g){//添加代码if(!isAlive) {if(!good) {tc.tanks.remove(this);//坦克死亡,移除此对象}return;}
效果图:









原创粉丝点击