先上圖。
效果**
隨機生成迷宮要求任意兩點都能夠找到相同的路徑,也就是說,迷宮是乙個連通圖。隨機生成迷宮可以使用普里姆演算法、廣度優先演算法、深度優先演算法等實現。這裡將使用普里姆演算法通過生成最小數的方法,實現迷宮圖。
初始迷宮
迷宮有路和牆,白色表示路,黑色表示牆。每乙個格仔代表乙個頂點,這裡一共有100個頂點,需要找出99條邊,使頂點連線起來,也就是要打通99塊牆。
迷宮使用二位陣列儲存,為迷宮指定路的行數和列數,生成初始陣列。
普利姆演算法不了解的話,可以參考這篇部落格的解析。
/** this.r 路的行數
* this.c 路的列數
* this.arr 儲存迷宮的二維陣列
*/
initarray() else }}生成迷宮這裡需要使用兩個陣列,分別儲存已訪問和未訪問的頂點。}
this.accessed = ;(1)初始狀態下,notaccessed包含所有頂點,狀態為0表示未訪問,accessed為空。this.notaccessed = [...];
(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 作為當前正在訪問的格仔,同時把該格仔放入乙個已經...