坦克大战项目开发流程、问题和介绍

来源:互联网 发布:八王之乱 知乎 编辑:程序博客网 时间:2024/05/18 00:58

 

1. 建立一个无返回值的lauchFrame()方法来完成画框架
    框架 800*600
    颜色 lightGray 浅灰色
    不可以改变大小
    初始化显示位置 调用Component里面的setLocation(x,y);

2. 通过paint(Graphics g)来画出圆。
   调用g.fillOvar(x,x,width,height);

3. 通过双缓冲技术来实现坦克画面动起来不流畅的感觉
     坦克动起来,采用线程技术(线程用内部类表示),每间隔50MS重画一次画面, 重画 采用repaint();
     调用update(Graphics g)
      1. 画一个800,600的iamge
      2. 在图片上面画一个跟主窗体一样大方形
      3. 调用paint(Graphics g)来画坦克(也就是圆)
      注意: 在IMAGE上面画方块的时候一定要和主体窗口一样大,要不回出现画一长条粗线的状况。
      技巧: 把所有数字都用变量代替,修改起来方便

4. 定义接收键盘的内部类
   KeyMonitor extends KeyAdapter

5. 定义坦克自己的类,并且定义自己接收键盘按下事件。
6. 如何让坦克朝八个方向走
   1. 把每一个按下事件用一个BOOLEAN值记录下来,当按下是就把值设置为TRUE,否则FALSE;
   2. 在定义一个枚举enum设置八个值记录下八个方向,再用switch来确定该往那里走。
   3. 利用switch来确定enum中的哪个方向,
        当按下的时候把值设置为true当键盘弹起是把值设为false;
7. 画出子弹,运用面向对象思维,定义一个子弹类,
      通过坦克的方向来确定子弹的方向,定义一个move方法来接收移动参数。
      定义一个容器保存子弹,按下CTRL时加入子弹,当子弹出界的时候就在容器里面移除删除。

8. 坦克被打中时消失。
      给子弹和坦克定义一个Rectangle返回值的方法, 在子弹类里面检测两个方法是否有接触。
      当接触了后就把坏坦克从坏坦克容器里面移除。
        在坦克里面定义一个boolean值代表坦克是否活着,当坦克活着的时候值为true;当坦克死了之后值为false;
   注意: 机器坦克在Rectangle返回值的方法里传入的是机器坦克容器,
          主战坦克在Rectangle返回值的方法里传入的是主战坦克引用

9. 坦克死掉后子弹也死亡。
   为子弹设置一个boolean值代表子弹的死活,当子弹活着时为true;子弹死了后值为false;

10. 坦克死掉后有爆炸产生,定义一个爆炸类在类。
   难点, 爆炸需要在子弹与坦克相撞的地方发生,
 在tankClient里面定义一个装爆炸的容器,采用ArrayList 和 LinkedList在这里的效果差不多。
       在子弹类里面的getRect()方法里面调用爆炸类容器没相交一次就往里加一个爆炸,接着在tankClient里面画出来。位置就是坦克和子弹相交的地方。

11. 坦克 和子弹 不能跑出屏幕
     当子弹跑出屏幕的时候让它消亡
     当坦克跑出屏幕的时候要它呆在屏幕边缘不给出去,
     坦克具体做法, 当坦克小于边缘坐标时让坦克等于边缘坐标,当坦克大于边缘坐标时,让它等于边缘坐标。


12. 机器坦克发射也发射子弹,并且子弹不会伤到自己方。
    在创建子弹时指定好坏蛋,在子弹构造方法里面加入,
    当坏子弹碰到坏坦克时在子弹里面的hitTanks(List<Tank> tank)里面加入一个判断,判断是否是友方发出的如果是,就不死亡,反之。

13。 出现问题 注意:
     1.当坦克死亡之后,坦克还可以发射子弹。
        在坦克里面的fire方法中加入 当坦克死亡时返回null,而不是继续往里加子弹
     2. 当坦克死亡后,机器坦克打坦克死亡的地方时,还是会出现爆炸,这是由于在Missile类里面没有判断主战坦克死了以后该怎么处理,在判断语句里面加上一句当坦克死亡的时候不能产生爆炸。

14. 给当前游戏添加一堵不可穿越的墙壁,
     墙也是一个对象,把墙单独设置成为一个类。 在墙里面也设置一个碰撞类, 在坦克类里面调用, 用两个变量记录前一个X,Y的值,当坦克碰到墙壁时,把坦克的X,Y值赋值为前一个X,Y的值。
    随机生成墙壁:在墙壁里面建立一个方法,方法里面定义一个随机for循环的随机数,再在for循环里面,加入随机生成的X,Y值和width,height值,横墙和竖墙通过两个for循环来确定。再加入个一个List当中。    

15. 坦克不能互相穿越,
   在坦克里面设置一个碰撞类穿入敌人所有坦克,也就是list数组,一个一个遍历,当坦克不是当前坦克时就检测是否发生碰撞,如果发生碰撞了,就stay()到前一个X,Y位置。

16. 给当前坦克设置一个超级炮弹 可以八方向发射子弹,
      首先考虑子弹是由什么控制发出来的,
      根据子弹的方向是由坦克的方向确定这个前提,可以在tank类里面设立另一个发射子弹的方法,把坦克8个方向一次都传进去,先把妹举enum转化为数组
      在做一个for循环把每一个方向都循环完。 这样就可以实现一次朝八个方向发射了,
        假如我想从四方向发射呢?
       你可以做一个判断语句,只有是前后左右才可以进行发射,就可以了
    
17. 给当前坦克做一个生命值,
       生命值,可以左一个变量,每当坦克中一枪的时候变量减少 ,当变量等于0是,坦克死亡。
       把生命值可视画;另外定义一个血条类,血条类的方块长短根据血的变量来确定。


18. 给坦克添加一个坦克吃了可以加血的浮动的方块
     给该对象添加一个类,有一个返回值为Rectangle的方法。 当坦克碰到的时候生命值赋值为最高。
      难点: 加血类的浮动和不定时出现在不定点的位置,
       浮动, 给该类添加一个Random产生的随机大小的数组,在该类draw(Graphics g)类当中随机给随机数组添加随机数值。
      不定时出现:给加血类添加是否活着属性,放坦克碰到时值为false 当值为false时直接把加血中的draw(Graphics g) 在画前返回,否则继续画 在坦克draw(Graphicsg)里面添加一个随机数,当这个随机数等于某数值时,把当前加血类设置为TRUE;


19. 当主战坦克死亡的时候按F2就重新复活,当敌方坦克死亡后,按Q就能增加数量。
   键盘接受并且判断当按下F2的时候,把主战坦克设置为true并且吧生命值设为最大,
   当按下Q时并且敌方坦克数量为0时在List容器中加入数量一定的坦克。

20. 优化,把敌方坦克移动速度和炮弹速度减慢,当敌方坦克增加到一定数量时游戏刷新加快,目的,加快移动速度。
       敌方坦克移动速度和炮弹速度减慢根据好坏来判断。
    刷新速度,在MAIN方法类里面,加快框架刷新速度。

21. 测试坦克大战.

22. 给坦克大战加注释。

23. 生成javadocs文档,生成jar文件。


总结,这个坦克大战程序,主要运用了,内部类,匿名内部类。线程,和持有对方引用和Properties读取等技术。整体复习了J2SE大部分内容。

其中出现的问题有:
  1. 在两个类来回判断的逻辑当中脑袋逻辑有点混乱,浪费了很多时间来整理。
  2. 在判断敌方坦克互相打中时会死亡, 原因是因为在子弹和坦克相撞的getRect()方法判断时调用参数是失误,本来是要调用坦克的好坏,结果错调用了子弹的好坏,而子弹的好坏也穿错了,子弹的好坏传的全部都是myTank主战坦克的子弹,所以敌方坦克一开炮,自己全死。
  3. 在坦克死亡后还可以继续发射子弹,这是由于,当坦克死亡后,并没有给子弹传递一个信息说坦克死了。解决办法,在发射子弹的方法里面加入一个判断坦克是否活着的IF语句,如果死了,直接返回。
  4. 在坦克死亡后,坦克死亡的位置,敌方坦克继续打那位置时还是会出现爆炸,原因,在Missile类里面的加入爆炸方法中,没有判断当坦克死亡后将不能进行爆炸,在Missile类里面加入坦克是否存活的一个判断。

  5. 综上所述: 所有问题都是出于自己的粗心大意,以后要注意。

 

 

 

 

 

 

 

 


 

原创粉丝点击