ローグライクのダンジョンの生成について

目次

製作中のゲームでローグライクゲームのダンジョン生成を実装したので、 自分の考え方を書いていきます。

はじめに

まずは、よくある序盤型のダンジョン形状を作っていきます。

マップを生成して分割する

分割サイズを決めます。 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つの通路を繋ぐように、縦の通路を生成して接続完了です。

■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□□□□■■□□□□■
■■□□□□■■□■■□□□□■
■■□□□□■■□□□□□□□■
■■■■■■■■■■■□□□□■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■


部屋と交差点の通路

部屋同士の場合と同じように出入口と境界線を選択します。 ただし、交差点側は隣のマスから通路を伸ばしていきます。

■■■■■■■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■■■■
■■□□□□■■■■■■■□■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■

ここも同じように縦の通路を生成して接続完了です。

■■■■■■■■■■■■■■■■
■■□□□□□□□□□□■■■■
■■□□□□■■■■■□■■■■
■■□□□□■■■■■□■■■■
■■□□□□■■■■■□□□■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■
交差点同士の通路の生成は割愛します。


これですべての通路を生成したら、冒頭の画像通りのダンジョンが完成します。