簡介
所謂迷宮生成算法,就是用以生成隨機的迷宮的算法
迷宮生成算法是處於這樣一個場景:
-
一個row行,col列的網格地圖,一開始默認所有網格四周的牆是封閉的
-
要求在網格地圖邊緣,也就是網格的邊上打通2面牆
-
所有網格都至少保證網格周圍至少有一堵牆打通
-
所有網格都能通過打通的牆能形成一條通路
博主已實現RecursiveBacktracking(遞歸回溯),RecursiveSegmentation(遞歸分割),隨機Prim算法,Kruskal+並查集四種迷宮生成算法,這篇文章主要對這四種算法進行簡要的介紹
基於Unity的迷宮生成算法代碼實現

遞歸回溯算法
復雜度
空間:O(n),時間:O(n),n為迷宮節點數row*col
原理
以一個棧作為輔助的數據結構,用以記錄打通區域的順序,用以回溯
一開始隨機在地圖中選擇一個區域,加入棧。
之后在之前選擇的區域周圍隨機選擇一個未打通的區域,將新選擇的區域和之前選擇區域的牆打通,並把新的區域的加入棧
如果四周的區域都打通,就讓棧出棧,將當期所選擇的區域設置棧新的棧頂,表示回退到上一個區域
之后遞歸的按之前的步驟選擇下一個區域直到所有區域都被打通
缺點

這種算法實現思路極為簡單,但通路過於明顯,甚至有可能會出現上圖中的迷宮,很尷!!!
遞歸分割算法
復雜度
遞歸空間復雜度:O(row * col),最好時間復雜度:O(lgrow + lgcol),最壞時間復雜度O(row * col)
原理
將矩形地圖用十字分成四個小矩陣
在四個小矩形相鄰的四個面上各隨機打通一面牆,使通路導通。
然后對所有小矩形重復之前分割操作
如果矩陣已經無法分割了,也就是行數或列數為一時,就將矩陣內部的牆全部打通
優缺點
生成的迷宮有明顯的矩形成分,不自然,適合簡單如FPS,ACT等游戲

隨機Prim算法
復雜度
空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1))
原理
隨機選擇一個區域作為當前區域
將區域四周未打通的牆加入列表中
while(列表不為空)
隨機從列表選擇一面牆
如果牆兩邊區域存在一區域未被打通,就打通這面牆,並將這面牆兩邊區域附近未打通的牆加入列表
從列表中移除這面牆
優缺點
自然的迷宮,很難走,適合真正的迷宮游戲

Kruskal+並查集

復雜度
空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1))
原理
這個算法巧妙的使用了並查集,運用並查集判斷整個迷宮的導通問題
把所有牆加入牆列表中
while(牆列表不為空)
隨機從牆列表選擇一堵牆,用並查集判斷牆兩邊區域是否導通
不導通就打通這堵牆
從牆列表中移除這堵牆
參考鏈接
