1.项目简介

复刻童年经典小游戏——坦克大战:用户进入游戏界面后,通过键盘上的数字1,2键选择游戏模式,选择1并按回车键进入单人模式;选择2并按回车键进入双人模式。玩家1可通过按键WASD控制坦克方向及移动,并且按空格发射子弹。玩家2通过方向键控制坦克方向移动,并且按K键发射子弹。子弹碰到围墙后消失,子弹碰到坦克后产生爆炸特效。左上角记录敌方坦克的实时数量。玩家击败所有敌方坦克,游戏胜利;若所有我方坦克被击败,或者我方基地被摧毁,则游戏失败。

2.小组成员及分工

成员 负责任务
组长 黄抒鸿 博客撰写,游戏规则的制定,碰撞检测,爆炸特效的实现,随机事件的编写
组员 雷正伟 前期调研,面向对象设计,窗体绘制,闪动问题的解决,键盘事件的编写

3.项目功能架构图与主要功能流程图

3.1项目功能架构图

坦克大战【java项目】

3.2主要功能流程图

坦克大战【java项目】

3.3面向对象类设计图

坦克大战【java项目】

4.功能详解

4.1 窗体绘制及添加键盘事件

4.1.1 创建窗口

·创建类继承JFrame

·创建启动方法launch()

坦克大战【java项目】
坦克大战【java项目】
坦克大战【java项目】

4.1.2 为窗口上色

·重写paint()方法,设置图形颜色和大小

坦克大战【java项目】

4.1.3 添加选项文字

坦克大战【java项目】

4.1.4 为窗口添加键盘事件

添加内部类,实现KeyAdapter类,重写keyPressed方法,写入键盘事件,1选择单人模式,2选择双人模式

坦克大战【java项目】

窗口添加键盘监视器

坦克大战【java项目】

添加指针图片

在项目文件夹下创建文件夹images,关于项目的图片,插件都放在这个文件夹内

创建图片对象

坦克大战【java项目】

在launch()方法中重绘图形

坦克大战【java项目】

4.2双缓冲解决闪动问题

创建一个图片

Image offScreemImage = null;

重写paint()方法

创建一个和弹出窗口宽高相同的图片,
获取该图片的图形对象,把所有内容添加到该图片中

//创建和容器一样大小的Image图片
		if(offScreemImage == null) {
			offScreemImage = this.createImage(width,height);
		}
		
		//获的该图片的图形
		Graphics gImage = offScreemImage.getGraphics();
		
		gImage.setColor(Color.GRAY);
		gImage.fillRect(0, 0, width, height);
		
		//添加游戏选项
		gImage.setColor(Color.BLUE);
		gImage.setFont(new Font("仿宋", Font.BOLD, 50));
		
		if (state == 0 ) {
			gImage.drawString("选择游戏模式", 220, 100);
			gImage.drawString("单人模式", 220, 200);
			gImage.drawString("双人模式", 220, 300);
			
			//绘制指针
			gImage.drawImage(select, 160, y, null);
		} else if (state ==1 || state ==2) {
			gImage.drawString("游戏开始", 220, 100);
			if (state ==1) {
				gImage.drawString("单人模式", 220, 200);
			} else if(state ==2) {
				gImage.drawString("双人模式", 220, 200);
			}
		}

4.3面向对象设计

游戏父类:

坦克大战【java项目】
坦克大战【java项目】

坦克类:

坦克大战【java项目】
坦克大战【java项目】

玩家一和玩家二

玩家2和玩家1的方法都是一样的,只需要修改键盘事件。在图形界面更换打印玩家2的图片
坦克大战【java项目】

子弹类

坦克大战【java项目】

4.4敌方坦克的随机事件

4.4.1敌方坦克随机方向移动

用一个random类的变量,在0-3中任意生成一个数,通过switch方法,根据随机数的数值来返回相应的方向。
新写一个int变量moveTime表示敌方坦克移动的次数,当次数大于等于20时,我们随机生成并改变敌方坦克的方向,然后重新给移动次数赋值为0;如果移动次数小于20,就加1;
新写一个go的移动方法,首先生成一个随机的方向,最后通过switch来判断方向并调用相应的方法;最后将go方法添加到paintSelf中。
坦克大战【java项目】
坦克大战【java项目】

4.4.2敌方坦克随机发射子弹

实现随机发射,需要一个random类,让他在区间内随机返回一个数,如果这个数小于某个值,就发射子弹。
坦克大战【java项目】
坦克大战【java项目】

4.5碰撞检测

碰见检测:就是检测两个物体是否碰撞。判断坦克是否与子弹发生碰撞,如果碰撞,坦克发生爆炸。
方法:把两个物体当作矩形,在他们移动过程中调用intersects方法判断两个矩形是否相交,如果是,证明被碰撞到了。
考虑碰撞后续的状态变化。如果消失,用到的方法是,把它从paint遍历的列表中去掉。
坦克大战【java项目】
新建一个removeList,在遍历完子弹列表后,删除removeList里面要删除的子弹。
子弹与坦克,边界,墙之间的碰撞检测:
坦克大战【java项目】
坦克大战【java项目】
坦克大战【java项目】
坦克大战【java项目】

4.6爆炸特效

先准备一串完整的动画,再获得爆炸坐标,通过连续切换图片实现爆炸特效。
把爆炸连续的一串图片添加到images文件夹中,创建爆炸类:Blast
坦克大战【java项目】

4.7游戏规则

设计思路:设计int 变量state,当state=1,按回车进入单人模式;当state=2,按回车进入双人模式。当state等于5时,游戏胜利;当state=3时,游戏暂停;state等于4时,游戏失败。当游戏不处于暂停模式时,先用a记录state的值,再给state赋值。
坦克大战【java项目】
坦克大战【java项目】

相关文章: