坦克项目总结

        跑了一个月的招聘会,老是让技术面试官觉得我的项目经验太少,也只有顺丰的面试官抓着我的项目问了很多很多,仔细想想大公司都是注重基础的,只有那些小公司才会挑你的项目。其实,现在最重要的是可以把自己的这个项目说好,等有空了再去做一个项目。所以,我借十一这次机会把这个项目重新总结一下。

        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.  小问题:方向写错,挺容易修改的。

待续。。。。。。。。。。。。。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值