[轉] [博客園] 迷宮生成算法x4

簡介

所謂迷宮生成算法,就是用以生成隨機的迷宮的算法git

迷宮生成算法是處於這樣一個場景:github

  • 一個row行,col列的網格地圖,一開始默認全部網格四周的牆是封閉的算法

  • 要求在網格地圖邊緣,也就是網格的邊上打通2面牆數據結構

  • 全部網格都至少保證網格周圍至少有一堵牆打通post

  • 全部網格都能經過打通的牆能造成一條通路spa

博主已實現RecursiveBacktracking(遞歸回溯),RecursiveSegmentation(遞歸分割),隨機Prim算法,Kruskal+並查集四種迷宮生成算法,這篇文章主要對這四種算法進行簡要的介紹.net

基於Unity的迷宮生成算法代碼實現

Github連接blog

遞歸回溯算法

複雜度

  空間: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(牆列表不爲空)

  隨機從牆列表選擇一堵牆,用並查集判斷牆兩邊區域是否導通

不導通就打通這堵牆

從牆列表中移除這堵牆

參考連接

三大迷宮生成算法

隨機迷宮生成算法(並查集+生成樹)

相關文章
相關標籤/搜索