ローグライクのダンジョンの生成について
製作中のゲームでローグライクゲームのダンジョン生成を実装したので、 自分の考え方を書いていきます。
はじめに
まずは、よくある序盤型のダンジョン形状を作っていきます。
マップを生成して分割する
分割サイズを決めます。 C#で書くなら下記のようにリストにしておきます。
// 縦方向の分割
List<int> Vertical = new List<int>(){8,8,8};
// 横方向の分割
List<int> Horizontal = new List<int>(){8,8,8,8,8};
この場合は縦に3・横に5の合計15区画を生成します。 それぞれの区画は8x8の40マスです。
┏━┓┏━┓┏━┓┏━┓┏━┓
8┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃
┗━┛┗━┛┗━┛┗━┛┗━┛
┏━┓┏━┓┏━┓┏━┓┏━┓
8┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃
┗━┛┗━┛┗━┛┗━┛┗━┛
┏━┓┏━┓┏━┓┏━┓┏━┓
8┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃
┗━┛┗━┛┗━┛┗━┛┗━┛
8 8 8 8 8
また、完成するマップ全体のサイズは24x40になります。
区画の用途を決める
それぞれの区画の用途 ( 部屋/交差点/未使用 ) を決めていきます。今回は中央の区画を未使用にします。 残りから部屋にする区画をランダムに8個選択します。 選ばれなかった区画は交差点にします。
・ ■ ■ ■ ・
・ ■ □ ・ ■
・ ・ ■ ■ ■
■:部屋 ・:交差点 □:未使用
区画の接続を決める
区画同士の接続を決めて、ダンジョンの形状を作っていきます。 接続を開始する区画をランダムに決めます。
■ ■ ■ ・
■ □ ・ ■
・ ・ ■ ■ ■
隣接する区画から、まだ接続されていない区画を選び接続します。 この作業を繰り返して、区画を接続していきます。
╻ ■━■ ■ ・
┃ ┃
┗━■ □ ・ ■
・ ・ ■ ■ ■
上記のように隣接する区画が全て接続済みの場合、1つ戻って同じ手順を繰り返します。 これを全ての区画が接続されるまで繰り返します。
╻ ■━■ ■━┓
┃ ┃ ┃ ┃
┣━■ □ ┃ ■
┃ ┃ ┃
┗━━━■━■ ■
さらに追加で、接続されていない区画同士をランダムに繋げます。 追加する数もランダムに決定します。今回は追加で3ヶ所接続します。
┏━■━■━■━┓
┃ ┃ ┃ ┃
┣━■ □ ┃ ■
┃ ┃ ┃
┗━━━■━■━■
これでダンジョンの形状が完成しました。
部屋・交差点を生成する
後で通路の生成に必要なため、区画の上下左右は余白にします。
8x8区画の場合、下記の◇が部屋または交差点として使えるマスになります。
■■■■■■■■
■■◇◇◇◇◇■
■■◇◇◇◇◇■
■■◇◇◇◇◇■
■■◇◇◇◇◇■
■■◇◇◇◇◇■
■■■■■■■■
■■■■■■■■
■:余白
部屋
生成する部屋のサイズをランダムに決定します。 4x4の部屋を生成するなら、配置方法は下記の4パターンです。
■■■■■■■■ ■■■■■■■■
■■□□□□■■ ■■■■■■■■
■■□□□□■■ ■■□□□□■■
■■□□□□■■ ■■□□□□■■
■■□□□□■■ ■■□□□□■■
■■■■■■■■ ■■□□□□■■
■■■■■■■■ ■■■■■■■■
■■■■■■■■ ■■■■■■■■
■■■■■■■■ ■■■■■■■■
■■■□□□□■ ■■■■■■■■
■■■□□□□■ ■■■□□□□■
■■■□□□□■ ■■■□□□□■
■■■□□□□■ ■■■□□□□■
■■■■■■■■ ■■■□□□□■
■■■■■■■■ ■■■■■■■■
■■■■■■■■ ■■■■■■■■
■:壁 □:床
交差点
交差点も同様に余白以外からランダムに1マスを決定します。
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■□■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■:壁 □:床
通路を生成する
接続された区画同士に、実際に通路を生成していきます。
部屋同士の通路
隣接した区画に下記のように部屋が生成された場合、 それぞれの部屋の出入口を■からランダムに選択します。 また、区画の境界線を■から1列ランダムに選択します。
■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■□□□□■
■■□□□□■■■■■□□□□■
■■□□□□■■■■■□□□□■
■■■■■■■■■■■□□□□■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
出入口から境界線に向かって通路を伸ばしていきます。
■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□□□■■■□□□□■
■■□□□□■■■■■□□□□■
■■□□□□■■■■■□□□□■
■■■■■■■■■□□□□□□■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
境界線に2つの通路を繋ぐように、縦の通路を生成して接続完了です。
■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□□□□■■□□□□■
■■□□□□■■□■■□□□□■
■■□□□□■■□□□□□□□■
■■■■■■■■■■■□□□□■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
部屋と交差点の通路
部屋同士の場合と同じように出入口と境界線を選択します。 ただし、交差点側は隣のマスから通路を伸ばしていきます。
■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■□■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
ここも同じように縦の通路を生成して接続完了です。
■■■■■■■■■■■■■■■■
■■□□□□□□□□□□■■■■
■■□□□□■■■■■□■■■■
■■□□□□■■■■■□■■■■
■■□□□□■■■■■□□□■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
交差点同士の通路の生成は割愛します。
これですべての通路を生成したら、冒頭の画像通りのダンジョンが完成します。