坦克大战预期目标
完成功能二和功能三,即
(二)增加关卡,不同关卡的地图难度、敌方坦克数量及玩家生命值都有改变
(三)增加玩家坦克的生命值,如被击中三次才会失败,退出游戏
改进思路:
不同关卡即地图(障碍物分布),种类、数量、敌人坦克数量都有不同,目前想到的方法是不同关卡调用不同的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);
}
总结
目前已经实现了坦克游戏的基本功能,仍然有很多需要优化的地方。