接上篇

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 。

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

  1. CocosCreator项目学习系列lt;三gt;BattleCity_90tank坦克大战项目的学习

    CocosCreator项目学习系列<三>坦克大战项目的学习<25/12/2017> 知识点总结: 1.TileMap的使用精髓; 2.Joystick虚拟摇杆的整合单脚本; ...

  2. 【java毕业设计】基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码)——坦克大战游戏

    基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+Eclipse的坦克大战游戏设计与实现,文章末尾附有本毕业设 ...

  3. 韩顺平老师坦克大战项目总结

    韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...

  4. C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...

  5. Java实现的经典坦克大战小游戏

    Java实现的经典坦克大战小游戏 先看一下游戏结构: 有点多,没有耐心的可以不用看,这里先给出链接吧! 云链接:经典坦克大战 提取码:s9ai 这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自 ...

  6. 火箭工作室c++小游戏——坦克大战(初始版)

    今天第四次写博客,给大家发一个坦克大战的初始版,可以开外挂,要自己去探索 #include<windows.h> #include<conio.h> #include<i ...

  7. java完成经典坦克大战项目源码

    图片是类与类之间的包位置关系,与代码的导包操作相关 ​[点击并拖拽以移动] 图片是类之间的关系,以及工具类的包位置package com.tank.app;import com.tank.game.G ...

  8. java之详解坦克大战_Java之详解坦克大战游戏(一)

    相信大家小时候一定玩过坦克大战游戏,躲避敌方坦克,炸毁敌方坦克,不断向前进攻直逼敌方基地-这次,我们来实现一个简单版的坦克大战,我想学Java的人都有想到以前的按键手机里那菜单点开"Java ...

  9. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式

    先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...

最新文章

  1. 混合密度网络(MDN)进行多元回归详解和代码示例
  2. 网络编程学习笔记(基本套接口选项)
  3. 深度学习之利用TensorFlow实现简单的卷积神经网络(MNIST数据集)
  4. Leetcode 876. 链表的中间结点 (每日一题 20210918)
  5. MOSS 2010 修改列表的字段名及列的宽度方法
  6. weblogic10异常:org.hibernate.hql.ast.HqlToken
  7. 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
  8. 介绍一个不错的jquery插件-cluetip
  9. 在二元树中查找和为某一值的所有路径
  10. web前端前景近几年怎么样,是否饱和?
  11. redis安装配置 mysql_学习环境安装 mysql 与 redis
  12. 依旧是输入输出(存字符矩阵,空格,换行)
  13. java set 添加_Java Set add()用法及代码示例
  14. arch Linux更换字体,Arch Linux 安装后的设置
  15. 电脑开关电源维修图解
  16. 小飞升值记——(4)
  17. matlab2016a配置vs2013编译器
  18. CNS服务器搭建(配合百度直连)
  19. 编译程序和解释程序有什么区别?
  20. 各种抗锯齿效果的记录

热门文章

  1. SWUST OJ#942 逆置顺序表
  2. Robomaster C610+M2007+stm32组成伺服系统
  3. 车载3G无线共享方案
  4. 【图像识别】基于 Haar分类器实现五官定位matlab源码含 GUI
  5. php获取 url 井号,php获取url井号后的参数(描点#后参数)
  6. 猜数游戏(从文件中读取数据)
  7. Win系统 - 技巧篇
  8. 刚才我叫申通快递员来收我的S5PV210 V2核心板物料,我震惊了——原来网上说快递员月薪过万都不是谣言!
  9. 微信小程序-如何禁止表单二次提交?如何实现幂等?【亲测有效,超级详细,附源码】
  10. 1290 - 【入门】二进制转换十进制