跑了一个月的招聘会,老是让技术面试官觉得我的项目经验太少,也只有顺丰的面试官抓着我的项目问了很多很多,仔细想想大公司都是注重基础的,只有那些小公司才会挑你的项目。其实,现在最重要的是可以把自己的这个项目说好,等有空了再去做一个项目。所以,我借十一这次机会把这个项目重新总结一下。
1.项目介绍:(功能和技术)
简历:这是一款平面射击游戏,通过主战坦克、敌方坦克、子弹、炮筒、墙、爆炸、血块等类的设定,深入了解了java面向对象的基本编程思想。坦克和子弹的状态是项目的重点,运动与存在,设置这些变量控制坦克的移动,存活与消亡。还有加入超级炮弹的处理,图形化显示主战坦克的生命值,吃血块可以加血。最后处理主战坦克的复活与敌方坦克的重新加入。在这个项目中还应用了监听、集合、构造方法、内部类、匿名内部类、debug的使用、枚举和线程等重点知识,还有的是基本数学公式逻辑的应用。还用到了简单的随机处理、碰撞检测、消除震动。在项目方面积累了很多经验。
2.敌方坦克是怎么运动的:
简单的人工智能,采用随机算法,坦克是由方向决定移动,创建方向数组,随机产生方向,然后,每次变方向,向前移动一大步,效果很明显,如果要更加智能,需要计算角度。
/*
* 简单的人工智能、
*
* 1.将方向转换成数组,产生随机数,让方向随机变化
* Direction[] dirs = Direction.values();
* int rn = r.nextInt(dirs.length);
*
* 2.让坦克每次运动朝那个方向运动一大步,更加随机
* step = r.nextInt(12)+3;
*
* 3.随机发炮,尽量不要太猛,合理
* if(r.nextInt(40)>38) this.fire();
*/
if(!good){
Direction[] dirs = Direction.values();
if(step==0){
step = r.nextInt(12)+3;
int rn = r.nextInt(dirs.length);
dir = dirs[rn];
}
step--;
if(r.nextInt(40)>38) this.fire();
}
}
3.怎么样添加多个坦克?
使用了泛型和集合的知识,采用ArrayList遍历效率高一些,它是一个长度可变的数组,这个和它的结构有关系。(集合重点掌握hashmap)
List<Tank> tanks = new ArrayList<Tank>();
然后就是new出位置:tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this));
位置 (50+40*(i+1),50)
个数 i
集合元素太多:判断是否存活,然后remove x
4.项目哪线程?有没有用到多线程?什么是线程及其同步
new Thread(new paintThread()).start();
//线程 内部类 只为此类服务 重画类
private class paintThread implements Runnable {
public void run() {
while(true){
//重画坦克 外部包装类的paint方法(父类的)
repaint();
//为什么要有异常抛出? sleep()要么抛出要么捕捉interruption异常
try {
//、、每隔一段时间 重画一次
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
没有用到多线程,因为主要控制一个坦克的状态,所以不需要多线程,不过多线程是重点学习的知识,
线程是程序在执行过程中,能够执行程序代码的一个执行单元,运行、就绪、挂起、结束。
进程是一段正在执行的程序,可以减少程序的响应时间,效率更加高。一般实现两种方法,1.继承thread 重写run() 2.实现runnable接口 实现run()
同步(synchroized)多线程需要访问同一个资源的时候(变量,内存空间),必须要进行同步来保证资源的安全性。
5.遇到的困难,是怎么解决的?
a.消除闪烁
//双缓冲消除闪烁
public void update(Graphics g) {
if(offScreenImage == null){
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
//画笔 画在一个纸上,然后显示图,就消除了闪烁
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GRAY);
gOffScreen.fillRect(0, 0, 800, 600);
gOffScreen.setColor(c);
print(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
b.子弹运动问题,当坦克静止的时候,打出子弹就跟放炸弹一样停在原地。
画出炮筒,炮筒方向等于坦克运动方向,然后子弹就朝炮筒方向打出move。。。。
public Missile fire(){
if(!live) return null;
int x=this.x+Tank.WIDTH/2-Missile.HEIGHT/2;
int y=this.y-Missile.WIDTH/2+Tank.HEIGHT/2;
Missile m = new Missile(x, y,good,ptDir,this.tc); //传参数ptDir
tc.missiles.add(m);
return m;
}
c.开始是按下ctrl键,打出子弹,这样子打出子弹十分密集,不松基本就是一条线
使用抬起打出子弹(调用fire方法)
d.坦克、子弹的速度和大小,界面长宽。这些总是要改变的量,修改麻烦
使用静态变量
e.项目中有没有用到单例模式,对其他模式有没有了解。
。。。。。。。。。。。
f. 小问题:方向写错,挺容易修改的。
待续。。。。。。。。。。。。。