该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Java坦克大战游戏

本程序采用螺旋递增(增量式开发)。

单机版 (org.gpf.game.tank.offline)##

一、需求分析

  1. 坦克能够向8个方向移动;
  2. 坦克能够发射子弹打击敌人;
  3. 敌方坦克有多个,并且可以移动;
  4. 能够模拟爆炸;
  5. 坦克不能穿越障碍(墙);
  6. 坦克能够增加生命值(碰到特定的东西增加生命)。

如何让坦克移动

启动一个绘图线程,每隔一段时间更新一次坦克的的位置。

如何让坦克向8个方向移动

定义一个枚举值,保存坦克的9个运动状态(8个方向状态和一个停止的状态)。监听键盘按下和抬起的事件,设置坦克的移动方向状态。键盘按下的时候设置为true,抬起的时候设置为false。两个事件都需要重新确定坦克的具体方向(locateDirection()方法)。

按下Ctrl键打出一发子弹

添加一个炮弹类Missile,根据主战坦克的方向和位置打出子弹。

  • 增加对Ctrl键的按键处理
  • 根据“坦克打出一发子弹”这句话来确定Tank中的方法fire,其返回值为Missile。
  • 根据Tank的方向和位置设定子弹的方向和位置并画出来,然后返回(fire方法的实现)。

解决坦克停下来不能发出子弹的问题

画出炮筒

  1. 为坦克类新增加一个属性ptDir(类型是Direction枚举类型);
  2. 每次坦克移动后根据坦克的移动方向确定ptDir;
  3. 炮筒用直线来模拟。

打出多发子弹

  1. 使用容器装炮弹(fire方法中);
  2. Ctrl键抬起的时候(简单解决了按下Ctrl键不放子弹太多的问题); 3.逐一画出每一发炮弹。

注意:

  1. 泛型的使用;
  2. 将TankClient的实例传递到Tank;

解决炮弹不消亡和坦克超出边界的问题

  1. 加入控制子弹生死的量live(Missile);
  2. 当炮弹已经死去就不需要对其进行重画;
  3. 炮弹飞出边界就死亡;
  4. 子弹消亡救将其从容器中移除。

画一辆敌人坦克

  1. 加入敌我区别的变量good;
  2. 根据敌我的不同设置不同的颜色;
  3. 更新Tank的构造方法,加入good;
  4. 在TankClient中new出敌方坦克并画出。

加入爆炸

  • 添加爆炸类
    1. 用不同直径的圆模拟爆炸;
    2. 加入live;
    3. 加入位置属性;
    4. 加入draw方法。
  • 爆炸应该存在于集合中
    1. TankClient加入集合;
    2. 将集合中的爆炸逐一画出(如果死去就去除);
  • 击毙一辆坦克后应该产生一个爆炸
    1. hitTank时应产生爆炸;
    2. 不能直接访问爆炸集合;
    3. 加入TankClient引用(Missile类);
    4. 当new Missile时应该指定在哪里画出(哪个TankClient);
    5. 修改Tank类的fire方法,当new Missile时将保存好的TankClient变量传递给Missile。

###将敌人的坦克击毙 ###

  • Missile中加入boolean hitTank(Tank)方法;
  • 碰撞检测的辅助类Rectangle;
  • 为Tank和Missile都加入getRect方法;
  • 当击中敌人坦克时,坦克被打死,子弹也死去;
  • 增加控制坦克生死的量live;
  • 如果坦克死去就不需要在线程中将坦克画出来。

添加多辆坦克

  1. 用容器来装敌人的坦克;
  2. 向容器中装入多辆敌人的坦克;
  3. 画出来;
  4. 运行,不能打掉。
    • 添加hitTanks方法,打一系列的坦克。
    • TankClient里面每发子弹都打tanks。

让敌方的坦克更加智能(能够随机移动)

  • 让敌军坦克动起来
    • 构造方法中指定方向;
    • new敌军坦克的时候指定敌军坦克的方向;
  • 让敌军坦克随机方向移动
    • (Tank)静态的,添加随机数产生器(java.util.Random
    • move完成后,如果是敌军坦克,随机产生一个数来设定坦克的下一个方向
    • Direction.values()
  • 让敌军坦克向随机方向移动随机的步骤:
    • 添加变量,记录随机步骤;
    • 当==0时,改变方向,否则只是随机步骤递减;
  • 当敌军坦克发射炮弹
    • 本军炮弹不打本军
    • 炮弹添加好坏bGood,根据好坏画不同的颜色
    • 修改炮弹的构造方法
    • 修改Tank的fire方法
    • 修改hitTank方法,好不能打好,坏不能打坏
  • 敌军炮火不能太猛烈

添加2面墙

  • 建立Wall类、建立Wall对象、画出来
  • 让每一颗子弹打击每一堵墙
    • hitWall()方法
    • 注意:子弹速度不能过快,否则很容易穿过墙
  • 让坦克不能穿过墙
    • 记录上一次的位置oldX,oldY
    • 修改构造方法
    • 每次move之前记录上一次的位置
    • 添加stay()方法
    • 记录移动前的位置
    • 当撞到时回到移动前的位置
    • 当碰到墙的时候stay。

坦克不能相互穿越

两辆坦克碰撞的时候不能从另一个坦克的脑袋上穿过去。(撞到的时候调用stay()方法)

给坦克加入生命值

图形化显示主战坦克的生命值

根据不同的life值进行不同的显示

添加血块,吃了之后增加生命值

  • 添加blood类
  • 添加必要的方法
  • 让blood对象固定轨迹运动,并在一定时间后消失

修正

  • 敌人死光了重新加入;
  • 我军死掉了F8重新开始

javadoc时候乱码-编码 GBK 的不可映射字符

如果源文件编码使用了utf-8编码,那么生成的文档可会有乱码,解决办法如下: Project-->Generate javadoc时, 在第三个对话框的"Extra Javadoc options" 文本框里面加上-encoding UTF-8 -charset UTF-8,如下图所示:

空文件

简介

Java语言实现的坦克大战游戏。 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化