坦克大战项目

来源:互联网 发布:hp1000扫描仪安装软件 编辑:程序博客网 时间:2024/04/29 22:53
0.2版本

窗口关闭都必须建立监听类,有三种方式:
1.建立和Tankclient并排的类
2.写一个内部类。
3.写一个匿名类(匿名类的使用场合:类短小,不涉及将来的拓展,不涉及重要的业务逻辑)

这里采用第三种方法

设置不能改变窗口大小:this.setResizable(false);


0.3版本
画代表坦克的圆

重写paint方法,使用画笔是先得到当前画笔的颜色,再设置画笔的颜色


0.4版本
让坦克运动起来

步骤:将位置改为变量。
          启动线程不断重画(思考:为什么启动线程进行重画,而不是每按下一个键进行重画。因为线程重画更均匀,更能控制重画的速度。第二,按键重画不能解决自动自动飞行的问题)



0.41
使用双缓冲消除闪烁现象
原因:刷星重画频率太快,paint方法还没有完成;逐条显示。
解决方法:将所有东西一次性画在虚拟的图片上,一次性显示出来

paint(graphics);//将画笔传递给paint方法


0.5
需求:使窗口大小容易改动
解决:将原来的窗口大小800*600改成常量便于以后更改

代码的重构可以方便程序的扩展
常量名一般大写,而且一般用public static final


0.6
控制坦克的运动轨迹

实现接口必须实现接口类的所有方法,而继承就不用
要知道用户使用哪个按键,必须通过getKeyCode()方法得到按键的虚拟码
swich语句中要注意有break

0.7
添加一百辆坦克

功能:将坦克单独包装成类.
步骤:建立Tank类,,为Tank类单独添加成员变量x,y;添加draw方法,让坦克自己控制自己的画法;添加Tank类处理按键的方法;根据Tank类修改TankClient类

面向对象的思考方法:1.细节隐藏,构建单独的类,首先考虑系统中有哪些类;
                              2.合适的方法应该出现在合适的类中



0.8
坦克向8个方向行走

步骤:添加记录按键状态的布尔值;添加代表方向的量(使用枚举);根据按键状态确定Tank方向;根据方向进行下一步的移动(move);



0.9
解决坦克只会往某一方向走的问题
原因:因为按下某个方向键之后,相应的boolean值都变成了true并且没有改成false,所以就会一直往某个方向走

步骤:在keyAdapter里面添加一个keyReleased方法就可以了.



1.0
添加子弹类

1.1
根据主战坦克的方向和位置,打出子弹
步骤:增加对ctrl键的处理
     根据"坦克打出一发子弹"这句话,来确定不过坦克中的方法fire,其返回值为missile
     根据坦克的方向和位置确定子弹的方向和位置并draw出来,然后返回

eclipse使用tips:按住ctrl键,鼠标对着方法,然后按下去就能跳到对应方法的方法体
这个版本有一定的难度,需要好好理解持有对方的引用这个用法的使用 

1.2
功能:
为了解决坦克停下也能打出炮弹的问题—画出炮筒
步骤:
Tank类增加新的属性ptDir
每次move后根据Tank新的方向确定炮筒的方向
将炮筒用直线的形式表现出来

1.3

方法:1使用容器添加多发子弹:     List<Missile > missile =new ArrayList<Missile >();
2.每按下ctril键往容器里添加一发炮弹
在tank.java中:
tc.missiles .add(m);
3.在屏幕上显示打了多少发子弹           g.drawString( "missiles count:" + missiles //最后两个参数是画的位置


1.4
  • 功能
  • 解决炮弹不消亡的问题
  • 解决坦克出界的问题
  • 步骤:
  • 加入控制炮弹生死的量 bLive Missle 
  • 当炮弹已经死去就不需要对其重画
  • 当炮弹飞出边界就死亡
  • 当炮弹死亡就从容器中去除
  • 注意:
  • 将思维转化为代码 

debug
  • 一步一步跟踪代码
  • 为代码设置断点
  • Step into  step over 的概念
  • 学会在运行过程中观测变量的值

1.5功能
画一辆敌人的坦克
步骤:
加入区别敌我的量good
根据敌我的不同设置不同的颜色
更新Tank的构造函数,加入good
TankClient中new 出敌人的坦克并画出

1.6
功能:
将敌人坦克击毙
分析:一颗子弹击中敌人坦克
步骤:

碰撞检测的辅助类Rectangle : 

为Tank和Missle都加入getRect方法
public Rectangle getRect(){
     return new Rectangle(x,y,WIDTH,HEIGHT);
}


Missle中加入hitTank(Tank)方法,返回布尔类型
public boolean hitTank(Tank t){
     if(this.getRect().intersects(t.getRect())){
          return ture;
     }
     
          return false;
     
}



当击中敌人坦克时,坦克被打死,子弹也死去
增加控制Tank生死的量live
private boolean live=true;
在Tank类中的draw方法中添加:if(!live) return;
如果死去就不画了
1.7
  • 功能
  • 加入爆炸
  • 步骤:
  • 添加爆炸类
  • 用不同直径的圆模拟爆炸
  • 加 入 live
  • 加入位置属性
  • 加入 draw 方法
  • 爆炸应该存在于集合类中
  • TankClient 加入集合
  • 将集合中的爆炸逐一画出(如果死去就去除)
  • 击毙一辆坦克后应产生爆炸
  • hitTank 时应产生爆炸 

添加一个Explode类,在里面定义爆炸的属性和方法,代码如图:
0 0
原创粉丝点击