canvas 隨機生成迷宮

2022-09-03 02:12:12 字數 1285 閱讀 8514

先上圖。

效果**

隨機生成迷宮要求任意兩點都能夠找到相同的路徑,也就是說,迷宮是乙個連通圖。隨機生成迷宮可以使用普里姆演算法、廣度優先演算法、深度優先演算法等實現。這裡將使用普里姆演算法通過生成最小數的方法,實現迷宮圖。

初始迷宮

迷宮有路和牆,白色表示路,黑色表示牆。每乙個格仔代表乙個頂點,這裡一共有100個頂點,需要找出99條邊,使頂點連線起來,也就是要打通99塊牆。

迷宮使用二位陣列儲存,為迷宮指定路的行數和列數,生成初始陣列。

普利姆演算法不了解的話,可以參考這篇部落格的解析。

/*

* this.r 路的行數

* this.c 路的列數

* this.arr 儲存迷宮的二維陣列

*/

initarray() else }}

}

生成迷宮這裡需要使用兩個陣列,分別儲存已訪問和未訪問的頂點。

this.accessed = ;

this.notaccessed = [...];

(1)初始狀態下,notaccessed包含所有頂點,狀態為0表示未訪問,accessed為空。

(2)隨機從notaccessed中抽取乙個頂點cur,放入accessed中,cur在notaccessed中的狀態改為1,表示已訪問。

(3)忽略牆,遍歷cur上下左右的頂點。若其中一頂點沒有超出邊界,且未訪問過的,則將頂點加入accessed中,修改notaccessed中的狀態,cur指向該頂點.

(4)迴圈步驟3,直到accessed.length等於頂點數。generate()

}// 四周頂點均被訪問,則從已訪問的頂點中隨機抽取乙個為cur

if(off < 0) else }}

渲染

最後,利用canvas,根據this.arr中的值,就可以生成迷宮啦。

好像少了入口和出口,直接將this.arr中這兩個位置的值改成0就好了。

迷宮生成之後,可以對指定兩個點生成路徑哦。

隨機生成迷宮

首先初始地圖所有位置均設為障礙牆,然後任意插入乙個牆體進牆佇列 再判斷此時牆體是否可以設定為路 判斷依據 上下左右四個位置是否只有乙個位置是路 若設定為路,則將該位置四周所有的牆插入佇列 若無法設定為路,直接從牆佇列中刪去當前結點所在的節點,若牆佇列不為空,則從佇列中隨機選取一處障礙重新執行,重複以...

演算法 隨機生成迷宮

演算法原理 從起點開始,隨機選擇乙個方向移動,一直移動到終點,則移動的路徑便是迷宮的路徑。移動過程中要保證路徑不要相交,不要超出邊界,生成效果 public partial class mainform form void btncreateclick object sender,eventargs...

Prim迷宮演算法 隨機迷宮生成

最近在學android開發,老師讓我們自己做個應用,我就想做個簡單的roguelike rpg小遊戲。由於要用到迷宮,所以在網上學習了一下prim迷宮演算法,先用c 手擼了乙個簡單的模板。隨機選擇乙個白色格仔 i,j 實際位置為i 2 1,j 2 1 作為當前正在訪問的格仔,同時把該格仔放入乙個已經...