Java学习总结之坦克大战项目(完结版)

来源:互联网 发布:源码加密php 编辑:程序博客网 时间:2024/04/30 22:13

接上篇

V1.0:在这个版本中呢,我们要让敌方坦克动起来,不仅要移动,还要打出炮弹,怎么实现呢?其实很简单,在RobotTank类中添加一个随机数产生器就ok了。用nextInt ( n ) 方法可以随机产生一个n以内的整数。

添加一个方法,autoMove。产生4以内的数 i 代表方向,通过Direction.values() 可以返回一个方向数组Direction [ ] ,用下标为随机数的元素Direction [ i ] 来作为敌方坦克的行进方向;产生10以内的数代表要走的步数,添加一个步数变量step,每走一步减一,当步数step为0时就调用随机数产生器生成一个10以内的整数重新赋值给步数step,并重新生成一个随机方向;产生100以内的数,在一定范围内才发射炮弹。

还有敌方坦克的产生问题,我们可以每隔X秒添加一批坦克,或者打掉一个就添加一个,或者全部打掉才加入另一批。这个根据不同的思路有不同的解决办法,打掉一个加一个,就是在碰撞检测 collide 方法中,子弹击中敌方坦克的时候,移出当前坦克,新加入一个坦克。打掉全部才加另一批,就是判断当敌方坦克集合ArrayList<RobotTank> 数量 size 为零的时候,通过一个for循环加入指定数量的敌方坦克。

我们还需要考虑生成敌方坦克时出现的位置,是固定还是随机,若是随机出现,需要在出现前对将要出现的位置进行碰撞检测 collide ,若是碰撞,说明该位置已经有其他对象,则不能出现新坦克。

V1.1:在这个版本中,我们主要解决敌我双方的识别问题,也就是说,敌方坦克的炮弹对敌方坦克无效,只对我方有效,同样我方炮弹只对敌方坦克有效。

这就需要在炮弹类中添加一个布尔型变量 my ,用来区分敌我,在创建炮弹对象时,根据创建者的不同(是Tank类 还是 RobotTank类)赋予不同的变量值。这是身份标识。

然后是处理过程,在碰撞检测 collide 中,首先进行身份识别 isMy,如果是我方炮弹,则对所有敌方坦克进行碰撞检测;若是敌方炮弹,则只对我方坦克进行碰撞检测,若碰撞则进入阵亡处理。

 

 

到此为止,整个坦克大战的主体就算是完工了,剩下的只是一些修补工作了。各位看官可以在此版本的基础上自行完善,升级。可以加入道具,可以让敌方坦克分等级,加入Boss。可以添加不同的炮弹,添加绝招,添加必杀技。给己方坦克增加血条,可以让自己的坦克打敌方坦克获得经验,然后升级。可以加入各种障碍物,不可摧毁的,可以摧毁的,摧毁了有道具的,必须守护的。还可以加入不同的关卡,不同的地图,不同的场景有不同的敌方坦克数量、刷新速度等。

 

 

V1.2:在这个版本中,我们要补充坦克相撞的问题,之前我们只考虑了炮弹击中坦克,但忽略了坦克和坦克相撞。然后是我方阵亡的处理。最后是线程结束问题。

我们先说线程结束问题,主线程结束后并不真正死亡,它会等到所有子线程结束后才消亡,而我们的子线程PaintThread 是一个无限循环,不可能结束,所以主线程也就不会消亡,需要使用setDaemon将子线程PaintThread 设置为后台线程,这样主线程结束后子线程PaintThread 就会自动结束。

坦克相撞的问题,对于我方坦克和敌方坦克的相撞,只需要在我方坦克移动的时候,像炮弹一样,与所有敌方坦克进行一次碰撞检测即可,若是碰撞则我方阵亡。对于敌方坦克之间的相撞,则要复杂的多,首先需要在遍历的时候排除掉自身,因为自身和自身进行collide 检测一定是相撞的。其次呢,若相撞则需要回到上一位置,有人或许会说,让它停住就行了,可是那样坐标就不会发生变化,也就是说以后每次进行collide 检测,都会检测到碰撞,都会停住,结果就是一旦碰上就定住了。所以需要回到上一个位置,然后等到步数为0,坦克改变前进方向。

对于阵亡处理,我的方法是添加一个布尔型变量live ,阵亡则将其赋值为false。若是活着则让paint 方法正常进行,若阵亡,paint 方法将只输出两行字符:“GAME OVER!”“Press F2 to Restart!”。

然后在Tank类中的keyPressed方法中添加对F2按键的处理,调用reset方法。添加reset方法,在方法中对主要的成员都重新进行初始化,比如myTank,炮弹集合,敌方坦克集合等,然后将live重新赋值为true。这样按下F2之后就重新回到游戏开始的界面了。

 

坦克大战项目到此就完结了,其中还有很多不足之处,省略了很多马士兵老师视频中的功能,比如爆炸类(实现击中坦克时的爆炸效果),比如消除屏幕闪烁的双缓冲机制,比如让坦克向八个方向行走,没有加入墙、超级炮弹、生命值等。而且界面也不漂亮,没有用专门的API,没有特意使用设计模式(比如我方坦克和敌方坦克应该有个抽象类)等等等等。

毕竟这只是一个才不到千行的小程序,有需要改进的地方也是正常的。但是主体框架已经出来了,已经有了不断完善的可能。有兴趣的同学可以自己动手,将其变为一个魔兽级的大作!

如果有什么建议或意见也可以在此提出,拜谢!

Thanks for your reading 。

原创粉丝点击