1. 程式人生 > >掃雷遊戲開發基本思路

掃雷遊戲開發基本思路

推薦閱讀:

今天給大家介紹傳統掃雷遊戲的製作思路吧,為什麼選擇這個遊戲呢?
1.它太金典了,金典到我們都知道,都玩過,都會玩;
2.它也是一個輕量級的小遊戲,比較簡單。

我們先來捋一下掃雷遊戲中的要素

從上到下的UI:遮罩層——>雷層——>數字層——>底層背景層。

下面來介紹一下製作流程:

1.我們製作的時候需要從底層開始做起,首先是底層背景層,只需要一張圖片就ok了,作為遊戲的背景;
2.按道理來水,我們應該接下來做數字顯示層。可能有些朋友和我一樣,一開始認為是先把數字標好再去佈雷,其實應該是先佈雷,再根據佈雷情況給每個格子標數字,所以我們接下來是做雷層。
在這裡提供給大家最簡單的佈雷思路:遍歷nm個格子,每個格子隨機指定是否是雷。為了不讓生成雷的概率過大,我們可以根據概率來決定是否生成雷。
3.生成每個格子的遮罩層:遍歷n

m個格子,分別建立一個Button。
4.根據玩家點選的格子位置,判斷周圍8個格子雷的數量顯示數字。

現在我就來剖析一下掃雷的製作思路:

1.建立地圖,並隨機生成雷
   在這裡我們建立一個m*n的地圖,用二維陣列儲存地圖資訊,0代表無雷,1代表又雷。由於ts不能直接使用二維陣列,需要藉助一維陣列幫助,使用方法如下:

let arr = new Array();
for (let i = 0; i < m; i++) 
{
    arr[i] = new Array();
    for (let j = 0; j < n; j++)   
    {
        let num;//num=0或num=-1
        arr[i][j] = num;
    }
}  

2.判斷當前點選的是否是雷。
   在玩家點選了一個[i][j]格子時,我們需要判斷接下來遊戲的狀態:
1.如果不是雷,則計算該格子周圍雷的個數。我們需要計算格子周圍8個數中雷的個數,顯示在當前格子上。 如下圖:
在這裡插入圖片描述

		//不是炸彈,建立數字
            else {
                if (evt.currentTarget.x - this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y - this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x - this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x - this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y + this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x == this.bowContainer.getChildAt(i).x && evt.currentTarget.y - this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x == this.bowContainer.getChildAt(i).x && evt.currentTarget.y + this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x + this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y - this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x + this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
                if (evt.currentTarget.x + this.currentCellW == this.bowContainer.getChildAt(i).x && evt.currentTarget.y + this.currentCellH == this.bowContainer.getChildAt(i).y) { this.bowNum++; }
            }
       textNum.text = this.bowNum.toString();

2.如果是雷,則顯示所有雷,遊戲失敗。在第一步生成地圖的時候我們順便也應該生成雷,這時候我們比較友好的做法是把所有的雷裝進一個雷的陣列,方便這裡失敗時的顯示。

///點選某個方格後顯示對應資訊
        //遍歷雷,看當前物件是否是雷
        for (var i = 0; i < this.bowContainer.numChildren; i++) {
            //如果是雷,顯示所有雷
            if (evt.currentTarget.x == this.bowContainer.getChildAt(i).x && evt.currentTarget.y == this.bowContainer.getChildAt(i).y) {
                this.gamePanel.addChildAt(this.bowContainer, 4);
                this.failM.play(0, 1);
                //地圖上所有按鈕不可點選
                this.lockAllBtn();
                this.showBannerAd("adunit-4a5e80c193902450");
                // this.showVideoAd("adunit-4ad7c6693898c4b0", this.VideoAdSuccess, this.VideoAdfail);
                break;
            }

3.自動展開無雷區域
   先給大家講講標題的含義。即當前點選的格子不是雷,尋找周圍的8個格子,如果8個格子中其中至少有一個不存在雷,找到該種格子,繼續尋找周圍8個格子判斷是否存在不為雷的。如此反覆迭代
上述方法採用的是迭代遞迴的思想,其實該方法效率並不高,但作為初學者我們能實現此功能就ok了。
4.勝利判斷
   就差最後一步了,當然是判斷勝利了,其實方法很簡單,只需要判斷剩下未點選的格子數是否等於雷的個數。
掃雷的演算法就介紹給大家了,這個演算法是我第一次做掃雷時候使用的,可能不是特別完美,有什麼建議或意見的,大家可以在下方留言哦!