坦克大战运用到的 Java 知识: 集合, Swing, 线程.
编程思想:
在主类开启一个线程, 没 50 毫秒循环一次画方法 (绘制整个界面内的所有东西). 画的东西有敌我坦克 (颜色区分), 子弹, 墙, 血块, 爆炸. 所以总共写出了几个类: Tank 坦克类, Missile 子弹类, Wall 墙类, Blood 血块类, TankClient 主类. 在每一个类中均写有画方法实现本类属性的绘制功能. 在主类中有键盘监听事件调用这 Tank 类的键盘监听事件. 通过键盘监听判断出对 Tank 做出相应的移动, 而敌方 Tank 则是随机运动. 并且每次刷新都有调用各类的碰撞方法, 判断一些不该碰撞的对象的情况时做出处理. 而每个对象的创建例如子弹这些是在触发产生之后将新建子弹类加入一个子弹类集合之中, 在绘制的时候判断集合中的数量进行绘制, 出界或者打死坦克则在集合中删除. 其他类也均相似, 不在细说.
展示一下游戏界面:
游戏原理:
1, 敌我坦克: 在坦克类里面有一个布尔类型变量 good. 用于判断坦克的阵营, 在创建坦克对象时在 Tank 类的构造方法中传入 good 的值. 在画坦克的时候判断 good 的值, 区分敌我坦克的颜色;
2, 坦克运动: 在坦克类里写入了监听键盘摁键的响应事件, 对监听到的上下左右键进行记录, 并合成坦克移动的八个方向的变量. 之后对应每个方向的不同对坦克坐标 x,y 的值做响应的更改实现我方坦克的移动. 而敌方坦克则自动移动, 通过随机数对敌方坦克移动方向的随机, 并且随机出每次移动的次数. 两个随机值相结合即实现了敌方坦克的移动.
3, 坦克发射子弹: 通过键盘监听, 检测到发射子弹命令后将主类的子弹类集合中添加一个子弹类. 将炮筒的方向以及坦克的位置以及坦克的阵营传入给子弹类, 在主类 paint 画方法中一直循环子弹类集合, 如果集合内有子弹, 就画出来. 这样就实现了发射子弹.
4, 坦克, 子弹, 墙的碰撞: 在坦克类子弹类墙类中分别 getRect 方法获取自身的范围, 然后在每次画坦克, 子弹时都会进行相应的碰撞检测 (在坦克类里有与墙和出自己外的坦克相撞的处理方法, 在子弹类里有与墙和坦克相碰撞的处理方法.), 如果自身与不该碰撞的物体的范围相重合, 则代表两物体相撞.
5, 坦克加血: 在血块类中有血块与我方坦克相碰撞的处理方法, 如果血块范围与坦克范围重合则血块类死亡, 并且坦克类的血量回复置满.
6, 坦克复活: 通过键盘监听, 检测到我方坦克复活命令后, 如果我方坦克处于死亡状态, 则将我方坦克存货状态改为活着并且将我方坦克血量回置满血.
实现代码如下:
TankClient.java
Tank.java
Missile.java
Wall.java
Explode.java
Blood.java
最后, 给大家推荐一个 **Java 进阶内推交流群 730379855**, 不管你在地球哪个方位, 不管你参加工作几年都欢迎你的入驻!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
声明: 本文内容来源于网络, 如有侵权请联系删除
来源: http://www.jianshu.com/p/39519ae2fcf7