坦克大战【java项目】

坦克大战(JAVA项目)

1.项目简介

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

2.小组成员及分工

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

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

3.1项目功能架构图

3.2主要功能流程图

3.3面向对象类设计图

4.功能详解

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

4.1.1 创建窗口

·创建类继承JFrame

·创建启动方法launch()



4.1.2 为窗口上色

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

4.1.3 添加选项文字

4.1.4 为窗口添加键盘事件

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

窗口添加键盘监视器

添加指针图片

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

创建图片对象

在launch()方法中重绘图形

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面向对象设计

游戏父类:


坦克类:


玩家一和玩家二

玩家2和玩家1的方法都是一样的,只需要修改键盘事件。在图形界面更换打印玩家2的图片

子弹类

4.4敌方坦克的随机事件

4.4.1敌方坦克随机方向移动

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

4.4.2敌方坦克随机发射子弹

实现随机发射,需要一个random类,让他在区间内随机返回一个数,如果这个数小于某个值,就发射子弹。

4.5碰撞检测

碰见检测:就是检测两个物体是否碰撞。判断坦克是否与子弹发生碰撞,如果碰撞,坦克发生爆炸。
方法:把两个物体当作矩形,在他们移动过程中调用intersects方法判断两个矩形是否相交,如果是,证明被碰撞到了。
考虑碰撞后续的状态变化。如果消失,用到的方法是,把它从paint遍历的列表中去掉。

新建一个removeList,在遍历完子弹列表后,删除removeList里面要删除的子弹。
子弹与坦克,边界,墙之间的碰撞检测:



4.6爆炸特效

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

4.7游戏规则

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

原文地址:https://www.cnblogs.com/SONGminusone/p/15787869.html