迷路を作るときには、以下に注意します。
部屋と部屋が重なっていないこと。
すべての部屋が通路でつながっていること。
アルゴリズムの方針は、こうなります。
区画わけをします。
各区画に1つずつ部屋を作ります。こうすることで、部屋が重なりません。
部屋を通路でつなぎます。
区画のことをrectと書きます。同様に、区画の分割線をcouple、部屋のことをroomと書きます。
更に分割は進みますが、このへんでやめておきます。この分割の終了条件は、乱数による場合に加えて、区画の縦横のサイズが細かくなりすぎる場合です。
完成です。
分割するときには、以下の場合に備えた注意をします。
横に分割しています。ここまでは同じです。
さらに横に分割しています。
このようにrect[0]を2回横に分割すると、あとでcouple(rect[0],rect[1])を使って通路を作るときに、rect[2]をまたぐことになり、困ります。2回縦に分割しても同様の問題が起こります。
そこで、各区画の分割は、横に1回と縦に1回しかできないようにしています。
あるいは、このように賢く分割するようにしてもいいです。最初の横分割ではrect[0]を左にしていますが、次の横分割では、couple(rect[0],rect[1])を意識して、rect[0]を右にしています。