博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
坦克项目总结
阅读量:2380 次
发布时间:2019-05-10

本文共 2848 字,大约阅读时间需要 9 分钟。

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

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

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

转载地址:http://ymrxb.baihongyu.com/

你可能感兴趣的文章
mysql hint忧化一例
查看>>
linux cp 关闭交互
查看>>
expma分析
查看>>
mysql的自增id的一个问题
查看>>
奇怪的建表,oracle就hang了的问题
查看>>
-bash: ulimit: max user processes: cannot modify limit: Operation not permitted问题的处理
查看>>
编译c程序时找不到libmysqlclient.so.10的解决办法
查看>>
oracle和mysql的行列转换
查看>>
ora-3136问题的解决
查看>>
sysdba和dba的区别
查看>>
Scale-up(纵向扩展)和Scale-out(横向扩展)
查看>>
过敏性鼻炎偏方
查看>>
MySQL数据库优化实践--硬件方面
查看>>
linux下查看当前网络流量
查看>>
innodb_flush_method和innodb_flush_log_at_trx_commit
查看>>
redis主从复制例子
查看>>
闪回区满的处理 - flashback
查看>>
Redis 运维实际经验纪录之一
查看>>
Redis复制与可扩展集群搭建
查看>>
mysql : repair with keycache 的一个处理
查看>>