アカデメイア実験室のラボノートには勉強したことのメモを書いていきます。
目標はUnity Learnで3Dを学んで面白そうな何か作ってみることです(雑)
最終的には記事にも価値が出るようなものにしたいですが、何しろ不慣れなので、当面は行動記録として「投稿すること」を優先しようと思います。
こうしたほうがいいぞ!とかあればTwitterで絡んでください。
今日の内容は3DGameを作る(C#編3)です
Roll-a-ballを基準にゲームを作ろうとしています。今日は
壊れた壁を修復するダンジョン(破壊された迷路を修復するプログラム)の記録です。
経緯
もともとは「壁伸ばし法」というアルゴリズムで迷路を作っていたんですが、ユーザーが崩す機能とか、爆弾とかで壊れたりしたら面白いなと考えました。ですが、ただ壊せるだけだと全部破壊していけばいいので違うゲームになってしまいます。
ほしいもの
←こういう未完成迷路を完成させるプログラム。
入力は、壁伸ばし法的に問題ない(通路必須部位に壁がない)迷路を想定してよい。
完成したら、すべての通路部分が、全ての通路エリアがループ無しでつながっている、壁伸ばし法的に問題ない構成(何度壊しても直せるように)。
解決方法
外壁を修復した後、壁の島と、通路の空きがなくなるまで、壊れた部分や未完成の部分を対象に、がんがん再生成します。この時点で、ループと部屋はなくなります。
次に、迷路の通路に番号を振っていきます。つながっている通路は同じ番号を割り当てて、もし通路が分離してしまった場合は別の番号になります。たとえば、迷路が2つに分断されていたら、番号も2種類になるわけです。そして、再生成した範囲内の壁をチェックして、壁の両側で番号が違う場所を見つけたら、そこに穴をあけてつなげます。この作業を繰り返すと、最終的にはすべての通路がつながった、ループも隔離された区域もない迷路が完成します。
入力→再生成→通路接続(右図〇)→出力
注意点
このプログラムは壁伸ばし法で作られた迷路専用で、たとえば、別のアルゴリズムで作った迷路や、ランダムに壁や通路を配置したような初期状態だと、壁伸ばし法ではありえないような形状になってしまって、そもそも再生成がうまく行きません。そのうえ、壁を挟んで対面するとも限らないです。
将来的には壁伸ばし法アルゴリズム依存から脱却出来たら使いやすいかもしれません。
以上、今日はここまで
またよろしくお願いします。