JAVA坦克大战改进(二)

坦克大战预期目标

完成功能二和功能三,即
(二)增加关卡,不同关卡的地图难度、敌方坦克数量及玩家生命值都有改变
(三)增加玩家坦克的生命值,如被击中三次才会失败,退出游戏

改进思路:

不同关卡即地图(障碍物分布),种类、数量、敌人坦克数量都有不同,目前想到的方法是不同关卡调用不同的JAVA程序,每个程序中障碍物数量,敌人坦克数量均不同,主程序调用不同程序的信息实现不同关卡的功能
目前设计了三关。

第一关程序设计stage.java

import java.util.Vector;
public class Stage1 {
public static Vector<Wood>woods=new Vector<>();
public static Vector<Metal>metals=new Vector<>();
public static Vector<EnemyTank>enemyTanks=new Vector<>();
public Hero hero =new Hero(500,600);

public Hero getHero() {
	return hero;
}

public void setHero(Hero hero) {
	this.hero = hero;
}

public Vector<Wood> getWoods() {
	return woods;
}

public Vector<Metal> getMetals() {
	return metals;
}

public Vector<EnemyTank> getEnemyTanks() {
	return enemyTanks;
}
public void setWoods(Vector<Wood> woods) {
	Stage1.woods = woods;
}

public  void setMetals(Vector<Metal> metals) {
	Stage1.metals = metals;
}

public  void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
	Stage1.enemyTanks = enemyTanks;
}

//初始化地图,敌人坦克数量及速度
public  void initialzingMapOne() {
for(int j=0;j<3;j++) { 
	for(int i =0;i<6;i++) {
	woods.add(new Wood(80+j*120,80+40*i));
	}
}
for(int j=0;j<3;j++) { 
	for(int i =0;i<6;i++) {
	woods.add(new Wood(640+j*120,80+40*i));
	}
}
for(int j=0;j<3;j++) { 
	for(int i =0;i<5;i++) {
	woods.add(new Wood(80+j*120,530+40*i));
	}
}
for(int j=0;j<3;j++) { 
	for(int i =0;i<5;i++) {
	woods.add(new Wood(640+j*120,530+40*i));
	}
}
for(int i =0;i<4;i++) {
	metals.add(new Metal(420+40*i,300));
}
for(int i =0;i<2;i++) {
	metals.add(new Metal(80+40*i,420));
}
for(int i =0;i<2;i++) {
	metals.add(new Metal(840+40*i,420));
}
metals.add(new Metal(480,160));
metals.add(new Metal(480,480));
metals.add(new Metal(320,380));
metals.add(new Metal(640,380));
for(int i =0;i<2;i++) {
	woods.add(new Wood(80+40*i,380));
}
for(int i =0;i<2;i++) {
	woods.add(new Wood(840+40*i,380));
}
//初始化敌人坦克数量
enemyTanks.add(new EnemyTank(10,10));
enemyTanks.add(new EnemyTank(480,240));
enemyTanks.add(new EnemyTank(810,20));
this.setEnemyTanks(enemyTanks);
this.setMetals(metals);
this.setWoods(woods);
hero.setX(500);hero.setSpeed(3);hero.setY(600);
hero.setLife(3);
this.setHero(hero);
}
}

MyPanel中调用

在MyPanel中创建stage1的实例对象,调用其障碍物,敌人坦克数量位置,玩家坦克信息。

第一关最终效果

第一关
同理设计出第二关和第三关,增加了草地类,不影响坦克行动,最终效果如下

第二关

在这里插入图片描述

第三关

第三关

玩家生命值增加

只需在Hero类中添加生命值属性,再加入对应的set,get方法,被子弹击中一次生命值减1。在绘图界面MyPanel上,加判断过程,玩家坦克生命值>0才画出,等于0时消除坦克
这里注意初始life一定不能不设置值,不设置就会默认为0。面板上不会画出坦克

public int life =3;
	public void reduceLife() {
		life--;
	}
public int getLife() {
		return life;
	}

	public void setLife(int life) {
		life = life;
	}

在MyPanel中碰撞坦克方法修改一下,如果敌人坦克被击中则消失,玩家坦克被击中,则生命值减1

public  void hitTank(Shot s,Tank tank) {
		
		switch(tank.getDirect()) {
		case 0://̹坦克向上
		case 2://̹坦克向下
			if(s.x>tank.getX()&&s.x<tank.getX()+40
					&&s.y>tank.getY()&&s.y<tank.getY()+60) {
				s.isLive=false;
				if(tank instanceof EnemyTank) {
				tank.isLive=false;
				//坦克被击中后就拿掉
				enemyTanks.remove(tank);
				}
				if(tank instanceof Hero) {
					hero.reduceLife();
				}
				//当我方击毁一个敌人坦克时,就对数据allEnemyTankNum++
				//因为此处坦克可以是hero坦克,也可以是enemyTank,
				if(tank instanceof EnemyTank) {
					Recorder.addAllEnemyTankNum();
				}
				//创建Bomb对象,加入到bombs集合
				Bomb bomb = new Bomb(tank.getX(),tank.getY());
				bombs.add(bomb);
			}
		case 1://向右
		case 3://向左
			if(s.x>tank.getX()&&s.x<tank.getX()+60
					&&s.y>tank.getY()&&s.y<tank.getY()+40) {
				s.isLive=false;
				if(tank instanceof EnemyTank) {
				tank.isLive=false;
				enemyTanks.remove(tank);
				}
				if(tank instanceof Hero) {
					hero.reduceLife();
				}
				if(tank instanceof EnemyTank) {
					Recorder.addAllEnemyTankNum();
				}
				Bomb bomb = new Bomb(tank.getX(),tank.getY());
				bombs.add(bomb);
			}
		}
	}

最后画坦克(paint方法)时增加一个判断,坦克生命值大于0才画

if(hero.getLife()>0) {
		//画出坦克
		drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
		}

总结

目前已经实现了坦克游戏的基本功能,仍然有很多需要优化的地方。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值