穴掘り法で2D迷路を作る

前回、前々回と見下ろし2Dマップ上でプレイヤーを動かすことが出来ました。
今まではマップデータを自分で作ってマップを作成していましたが、今回は穴掘り法と呼ばれる方法を使って自動でマップを作ってみたいと思います。
この記事はシリーズものとなっています。

穴掘り法

穴掘り法とは

迷路を生成するアルゴリズムは棒倒し法、棒伸ばし法など複数ありますが、穴掘り法はその名の通り、穴を掘って迷路を作っていくという方法です。
まず外側の外周を通路にして、それ以外を壁で埋め尽くします。
次にランダムでスタート地点を選び、そこから伸ばせる限り穴を掘って道を伸ばしていく感じです。
具体的には上下左右の二マス先を調べ、道がなければ掘ると言った感じです。
道が伸ばせなくなったらすでに掘った道のいずれかを起点にして同じ手法で穴を掘って道を伸ばしていきます。
これを繰り返し、全ての道が掘れなくなった時点で外周を壁で埋め、迷路は完成します。
箇条書きにするとこんな感じでしょうか。

  1. 外周以外を壁で埋め尽くす
  2. スタート地点から伸ばせる限り道を伸ばす
  3. 上下左右2マス先が全て道になれば別の起点から掘る
  4. 全ての道が掘れなくなった時点で外周を壁で埋める

穴掘り法プログラミング

それでは実際にプログラミングしてみましょう。
今回はこちらの記事を参考に作ってみたいと思います。
それではUnityのAssetsフォルダにMazeCreatorというC#スクリプトを作成します。

変数や定数の定義

必要な変数や定数などを定義しましょう。

内容に関してはコメントの通りです。
Cellクラスは後々起点を保持しておくために使います。
一点注意ですが、迷路生成に関してはUnityEngineを使いませんので、MonoBehaviourは継承していません。
このMazeCreatorクラスはゲーム開始時に別のクラスから呼ばれ生成されます。

コンストラクタ作成

ではMazeCreatorのコンストラクタを作成していきます。

このような感じです。
今回の迷路では幅が5以上、そして縦も横も奇数のマス目にします。
どこの通路にもつながらない閉じた領域が出来るのを防ぎ、ぐるぐるループする迷路が出来ることを防ぐためです。

迷路作成関数

次に迷路を作成するために必要な関数を定義します。
必要な関数は4つです。

  1. 迷路データを作成する関数
  2. 掘る道を決める関数
  3. 道を彫り次の起点候補を決める関数
  4. 起点位置をランダムで選択する関数

このように関数を定義します。

ではCreateMazeを作っていきます。

続いて穴を掘っていきましょう。
Dig関数はこのようになります。

少し長いですが処理の流れはコメントの通りです。箇条書きにすると、

  1. 乱数生成用の変数を作成
  2. ループ突入
  3. 方角保持用リスト作成
  4. 上下左右2マス先までが壁かどうか判別
  5. 壁ならば方角保持用リストに方角追加
  6. 方角が0ならループ終わり
  7. 終わらないなら_x座標、_y座標に道と起点をセット
  8. 掘る方角をランダムで取得
  9. 取得した方角に掘り進める
  10. 次の起点を取得
  11. 起点が有るなら新たな起点から掘る

でしょうか。
全体が完成したら理解出来るかと思いますので、後で見返してください。

続いて道をセットし次の起点候補を保持する処理、SetPathを作ります。

こちらは至ってシンプルです。
起点となる座標は奇数にしておかないときれいな迷路にはなりませんのでご注意ください。

最後に新たな起点を選ぶ関数を作成します。

これで穴掘り法で迷路を作成するプログラムが出来上がりました。
全体も載せておきます。

生成したマップをゲームで表示する

これで2Dマップをランダムで作る準備が出来ました。
いよいよゲーム画面に迷路を表示させてみます。

マップデータを表示

前回作ったMapGeneratorの_loadMapData関数に処理をくわえていきます。
このような感じになります。

実際に起動してみるとこのように迷路がランダムで生成されています。

プレイヤーを表示させる

この状態ですとMAP_TYPEのPlayerが登場しませんので、1,1の座標にプレイヤーを表示させてみましょう。
修正箇所はMapGeneratorの_createMap関数内、マップタイルをループで生成していく箇所です。

このようになります。
実行してみるとちゃんと1,1の座標にプレイヤーが表示され、迷路内を移動させることができました。

コードが長く、難しいところも有るかと思いますが、流れを確認して読んでみるとご理解頂けるかと思います。
また今回の記事は以前の記事の続きとなっています。
前回、前々回の記事を読まれていない方は是非、読んでみてください。

Unityの学習方法

Unityを始めプログラミング全般について皆さんは普段どのようにして勉強してますか?

ネットで検索したり、書籍を読んだり、オンラインスクールなど様々な方法があります。

逆にたくさん方法があり過ぎで、どれをやればいいかわからないという方にオススメの方法をいくつか紹介します。

kindle unlimited

これはAmazonが提供する電子書籍読み放題のサービスです。

月額980円で約200万冊以上が読み放題でとてもお得です。

また30日無料体験もできるのが魅力です。

当然Unityに関する書籍もたくさん揃っています。

またC#関連の書籍や、プログラミングのものも多数あります。

プログラミング関連の書籍は値段が結構しますので、それらが無料で読めるのはかなりお得なサービスです。

30日無料体験もありますので気に入らなければその期間に解約すれば料金は発生しません

オンラインで学習

質問が出来るおすすめのUnity学習方法ページです。

・Unityでゲーム作りたいけど何から初めたら良いかわからない。

・独学でゲームを完成させられるか不安。

・ゲーム開発でわからないことを一人で解消できない。

・入門書を一通りやってみたが次に何していいかわからない。

こんな人におすすめしたい内容になっています。

最後までご覧頂いてありがとうございました。

感想・コメントをどうぞ

購読
通知する
guest
0 コメント
Inline Feedbacks
View all comments