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實現多人同台競技等;
我們在游戲本身的界面和功能花了比較多的時間,以后有機會繼續完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM