zoukankan      html  css  js  c++  java
  • 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实现多人同台竞技等;
    我们在游戏本身的界面和功能花了比较多的时间,以后有机会继续完善。

  • 相关阅读:
    报表中的图形是怎么做出来的?如何在其中实现地图?
    多维分析的本质计算是什么?能做什么又不能做什么?
    报表工具对比选型系列用例——多源分片报表
    报表工具怎样适应移动端?
    报表工具怎样适应移动端?
    互联网技术部门该如何管理
    更好用 更简单的Java缓存框架 jscache
    古人是怎么排行
    Spark ML 机器学习之Word2Vec
    Spark ML之高级数据源
  • 原文地址:https://www.cnblogs.com/choco1ate/p/12172223.html
Copyright © 2011-2022 走看看