JAVA面向对象编程课程设计——泡泡堂

一、成员介绍

姓名 任务分配 个人博客链接
张一弛(组长) GUI设计、游戏界面相关类实现、阿里巴巴扫描纠错、团队博客编写 在做了,在做了,下次一定
王江鸿 Box类、Bomb类、Login类实现;道具实现 Java课程设计-泡泡堂(个人)
陈志伟 Player类、PlayerAttribute类、Music类实现 Java课程设计-泡泡堂(个人)

二、项目Git地址

泡泡堂简易版

三、Git提交截图

四、项目功能架构图、主要功能流程图

五、项目运行截图

1、主界面

2.玩家登记

3.游戏主界面

六、主要MUL类图

Player类

Bomb类

七、关键代码

1.玩家移动线程

	private class moveThread1 extends Thread {
		@Override
		public void run() {
			
				while (player1.isalive) {
					if(stopSign)
						break;
					if(pause){
						player1.move();
						colisionDetection(player1);
						if(player1.thisbomb!=null)
						{
							//判断玩家是否在当前炸弹上(一旦离开玩家当前放置的炸弹,便不可再次站上去)
							if(player1.thisbomb.isExistPlayer)
							{
								player1.onTheboom();
							}
						}
					}
				}
			
		}
	}

使用while循环实现持续监听,加入判断线程结束标志,当重新开始、返回主界面时,线程能够及时停止。

2.碰撞检查(判断获得道具、前方有障碍、是否出界)

public static void colisionDetection(Player pl)
	{
		int x = 1120;
		int y = 880;
		//出地图边境
		if(pl.getX()<0||pl.getX()>x||pl.getY()<0||pl.getY()>y)
		{
			pl.back();
			return;
		}
		int w = 15;
		int h = 12;
		for(int i=0;i<w;i++) {
			for(int j=0;j<h;j++)
			{
				try {
					Box temp=thismap.getBoxbyLocation(i,j);
					//碰撞检查
					if(temp.getRect().intersects(pl.getRect())&&temp.isExist)

					{
						//遇到箱子
						if(!temp.isdestroyshowT)

						{
							pl.back();
							return;
						}
						//遇到宝物
						else{
							switch(temp.treasureIndex){
							case 1:
								pl.pla.plusspeed();
								break;
							case 2:
								pl.pla.plusbombnum();
								break;
							case 3:
								pl.pla.pluspower();
								break;
							case 4:
								//无敌状态
								pl.invincible();
								break;
							case 5:
								pl.pla.pluslive();
								break;
								default:
									break;
							}
							//设置当前方格为[不存在]
							temp.isExist=false;
							//将当前方格设置为隐藏
							setIcon("images/default.png",temp);
						}
					}

					//遇到炸弹
					if(temp.isExistBomb&&!temp.isExistPlayer&&temp.getRect().intersects(pl.getRect()))
					{
						pl.back();
						return;
					}
				} catch (NullPointerException e) {

				}

			}
		}

	}

借助Rectangle类中的intersects方法来检测2个矩形是否相交,实现碰撞检查,再通过判断玩家前往的box的类型来判断下一步操作。

3.炸弹引爆

public synchronized void explode() throws InterruptedException
	// 爆炸
	{
		// 将box处定义炸弹的参数赋值false
		box.isExistBomb = false;
		box.needDetonate = false;
		player.setBombexist(player.getBombexist() - 1);
		// 玩家当前炸弹数-1
		setIcon("images/UDLR.png", box);
		// 设置炸弹中心的图片
		explodePlayer(box);
		// 判断是否炸到了玩家

		for (int n = 1; n <= power; n++)
		// 向上爆炸
		{
			boolean flag = true;
			int x = this.x;
			int y = this.y - n;
			if (y >= 0) {
				Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
				flag = explode1(temp);
				if(flag == false) {
                    break;
                }
			}
		}
		// 向下爆炸
		for (int s = 1; s <= power; s++) {
			boolean flag = true;
			int x = this.x;
			int y = this.y + s;
			if (y < 12) {
				Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
				flag = explode1(temp);
				if(flag == false) {
                    break;
                }
			}
		}
		// 向左爆炸
		for (int w = 1; w <= power; w++) {
			boolean flag = true;
			int x = this.x - w;
			int y = this.y;
			if (x >= 0) {
				Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
				flag = explode1(temp);
				if(flag == false) {
                    break;
                }
			}
		}
		// 向右爆炸
		for (int e = 1; e <= power; e++) {
			boolean flag = true;
			int x = this.x + e;
			int y = this.y;
			if (x < 15) {
				Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
				flag = explode1(temp);
				if(flag == false) {
                    break;
                }
			}
		}

	}
	public boolean explode1(Box temp) {
		if (temp.isExist)
			// 如果爆炸的路线上遇到方块了
			{
				if (temp.isdestroyshowT)
				// 如果是宝物
				{
					temp.isExist = false;
					return true;
					// 宝物消失
				} else
				// 如果是障碍,则终止爆炸
				{
					showTreasure(temp);
					// 显示该box处隐藏的宝物
					return false;
				}
			} else if (temp.isExistBomb)
			// 如果该爆炸处有炸弹
			{

				MyThread3 ph3 = new MyThread3(temp);
				ph3.start();
				continuousBomb.add(temp);
				// 将该炸弹添加到被引爆的列表里
			}
			explodePlayer(temp);
			// 判断是否炸到了玩家
			bombCache.add(temp);
			// 将该处添加到爆炸缓存中
			setIcon("images/UD.png", temp);
			// 设置该处的爆炸图片
			return true;
	}

根据当前玩家的威力,从当前Box分别向上下左右威力内的Box遍历,若遇到不可炸毁的障碍,则结束当前方向的遍历,否则,将遍历的Box设置爆炸。 判断是否炸到玩家——通过判断玩家是否和爆炸块重叠,不处于无敌状态,并且存活,若符合,玩家受到1点伤害。

八、阿里巴巴代码规范扫描

扫描结果:

修改:

修改了魔法值、注释、代码规范、添加作者后:

  • 通过新建一个继承自Thread的class创建线程解决不允许显式创建线程问题

  • 通过代码复用,创建新方法来解决单一方法过长问题

完全解决:

九、总结

本次课设功能还有许多可以拓展的地方,例如数据库存储玩家信息、通过Socket实现多人同台竞技等;
我们在游戏本身的界面和功能花了比较多的时间,以后有机会继续完善。

posted @ 2020-01-09 16:36  2276543  阅读(1050)  评论(0编辑  收藏  举报