地図/気まぐれ/プロシージャル生成

DFSで完全迷路を掘る

隙間なく壁で埋めた盤面を、細い通路だけで掘り抜くと迷路になる。各マスは上下左右の4枚の壁を持ち、最初は四方すべて閉じている。隣り合うマスの間の壁を一枚倒すと、その二マスがつながって通路になる。壁はマスごとに4ビットのフラグで持ち、一枚倒すたびに自分と相手の対応するビットを両方落とす。

深さ優先探索(DFS)で迷路を掘る手続き。再帰的バックトラッカ。いまいるマスから未訪問の隣をランダムに一つ選んで進み、間の壁を倒す。行き止まれば来た道をスタックで戻り、別の分岐を試す。全マスを一度ずつ訪れて止まると、どのマスからどのマスへも道がちょうど一本だけ、閉路がゼロの完全迷路になる。掘り跡が全域木を張るので、ループのない木構造になる。

二つのマスをつなぐのは壁ビットの操作だけ。下では左右に並んだ二マスの間の壁を、時間で倒したり立てたりしている。ビットが落ちている向きは壁を描かず、その辺が開いて通路になる。

壁が立っている間は二マスが箱で仕切られ、ビットが落ちると間の辺が消えて一本の通路でつながる。右マスの左壁(ビット 4)と左マスの右壁(ビット 8)を同時に倒すので、片側だけ開いて段差ができることがない。

この壁倒しを、スタックに積んだ道筋に沿って全マスへ広げる。いまいるマスから未訪問の隣をランダムに選んで間の壁を倒し、進んだ先をスタックに積む。四方すべて訪問済みなら一つ戻る。盤面いっぱいに格子を張り、cellW = w / colscellH = h / rows で全面を埋める。掘った跡を明るく、いま掘っている頭を白い点で示す。

掘り進む頭が未訪問のマスを食べていき、行き止まると白い点がスタックを戻って分岐の口まで下がる。OPP[dir] は反対向きの番号で、進む先の壁も同時に倒して両側を開ける。全マスを訪れてスタックが空になると、reset が別の出発点から掘り直す。どのマスからどのマスへも道が一本に決まり、閉じた輪のない通路網になる。colsrows を上げると通路が細かく、出発点をランダムに振るたびに別の迷路が出る。