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

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/choco1ate/p/12172223.html
Copyright © 2011-2022 走看看