Missilem=missiles.get(i);
m.hitTanks(tanks);
m.draw(g);
}
(4)让坦克更加智能
1)让敌军坦克向随机方向移动。
添加随机数产生器java.util.Random,move完成之后如果是敌军坦克的,在走完一定的步数之后随机产生一个数,来设定坦克的下一个方向。
if(!
good){
Direction[]dirs=Direction.values();
if(step==0){
step=r.nextInt(12)+3;
intrn=r.nextInt(dirs.length);
dir=dirs[rn];
}
step--;
if(r.nextInt(40)>38)this.fire();
}
2)让敌方坦克发射炮弹。
本军坦克不打本军坦克,向炮弹添加表示好坏的Boolean量good。
3)修改炮弹的构造方法;修改Tank的fire方法;修改hitTank方法,坦克只能打击对方。
3.5创建Explode类
(1)加入位置属性x,,y,加入Boolean变量live
(2)加入draw方法,用一系列的爆炸图片来模拟爆炸
(3)在TankClient当中创建容器,将爆炸存放与容器当中,击毙一辆坦克就产生爆炸,将爆炸逐一画出(如果死去就去除),delete方法在前面已写。
Missile类当中的hitTank()方法
publicbooleanhitTank(Tankt){
if(this.getRect().intersects(t.getRect())&&t.isLive()){
t.setLive(false);
this.live=false;
Explodee=newExplode(x,y,tc);
tc.explodes.add(e);
returntrue;
}
returnfalse;
}
爆炸死后去除
if(!
live){
tc.explodes.remove(this);//死后去除
return;
}
3.6添加障碍物
(1)添加金属墙
1)建立Wall类,建立Wall对象,用绘图工具画出来
2)让每一颗子弹打击每一堵墙,添加hitMetalWall()方法。
当子弹接触到墙时子弹消失。
publicbooleanhitMetalWall(MetalWallw){
if(this.live&&this.getRect().intersects(w.getRect())){
this.live=false;
returntrue;
}
returnfalse;
}
3)让坦克不能穿过墙。
添加记录上一次位置的oldX,oldY;修改构造函数每次move之前记录上一次的位置。
添加stay方法记录移动之前的位置,当坦克撞到樯时回到移动前的位置,即当碰到墙时stay。
publicbooleancollidesWithMetalWall(MetalWallw){
if(this.live&&this.getRect().intersects(w.getRect())){
this.stay();
returntrue;
}
returnfalse;
}
(2)添加普通墙
建立brickWall类,往里添加相应属性以及相应方法。
具体步骤参考2.7.1中添加金属墙。
不同之处在于Missile类当中的hitbrickWall()方法,挡子弹接触到墙壁时,墙壁消失。
(3)加入图片替换主窗口中的各对象
再将图片加入时,运用了系统提供的工具包ToolKit,用工具包拿到所需图片后再将它放入容器中。
然后再做相应的替换。
下面是Missle类当中的图片加入
privatestaticToolkittk=Toolkit.getDefaultToolkit();
privatestaticImage[]missileImages=null;
privatestaticMapimgs=newHashMap();
static{
missileImages=newImage[]{
tk.getImage(Missile.class.getClassLoader().getResource("images/missileL.gif")),tk.getImage(Missile.class.getClassLoader().getResource("images/missileU.gif")),
tk.getImage(Missile.class.getClassLoader().getResource("images/missileR.gif")),tk.getImage(Missile.class.getClassLoader().getResource("images/missileD.gif")),
};
imgs.put("L",missileImages[0]);
imgs.put("U",missileImages[1]);
imgs.put("R",missileImages[2]);
imgs.put("D",missileImages[3]);
}
其他类的图片载入类似Missile类。
3.7添加血块类
创建Blood类,添加血块,假如必要的属性和方法,使血块沿着固定的轨迹运动,
privateint[][]pos={
{350,300},{360,300},{375,310},{385,290},{400,260},{380,300},{350,300}
};
privatevoidmove(){
step++;
if(step>=pos.length)step=0;
x=pos[step][0];
y=pos[step][1];
}
当主战坦克与血块接触的时候,主战坦克的血量自动加满
publicbooleaneat(Bloodb){
if(this.Live&&b.isLive()&&this.getRect().intersects(b.getRect())){
this.life=100;
b.setLive(false);
returntrue;
}
returnfalse;
}
4设计结果与分析
主战坦克的方向键:
上移:
键盘方向键向上下移:
方向键向下
左移:
键盘方向键向下右移:
方向键向右
左上:
键盘方向键上和左右上:
键盘方向键上和右
左下:
键盘方向键下和左右上:
键盘方向键下和右
普通开火键:
ctrl
超级开火键:
A
主战坦克重生键:
F2
运行结果:
5设计体会
通过这次课程设计,初步了解了高级编程语言面向对象的特点,掌握了数据结构及Java编程的许多基本知识,提升了自己的动手能力。
使我对数据结构这门课又做了一次系统的复习,对各个知识点也都有了更深刻的理解,让我掌握的更扎实,掌握了JAVA的应用、编写、上机调试的基本方法,同时也增强了实际操作能力,了解了程序开发过程中涉及到的相关知识,使我对数据结构的使用也更加的熟练,另一方面对编程语言有了新的认识,为以后的学习打下了基础。
本项目要学会图形化用户界面的构建,并且本项目用到了多线程Thread的知识。
通过启用多线程机制,不断调用java.awt.*中的paint(Graphicsg)方法,将画面构造出来。
其中要使用双缓冲消除闪烁现象。
程序中还使用了键盘监听器接口KeyActionListener实现坦克的控制操作。
碰撞检测的辅助类Rectangle可以完成坦克之间,以及坦克与障碍物之间的碰撞检测。
初步了解反射,知道对于classloader每一个.class实际就是一个Class对象。
学会使用Toolkit类,并使用该类加载得到图片。
学会使用Random类,并使用其中的nextInt()方法得到随机数,以实现敌人坦克的AI智能。
利用了容器类往里添加对象,实现可摧毁墙体类、子弹类及敌人坦克的重生与死亡。