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

目次

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

はじめに

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

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

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

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


部屋と交差点の通路

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

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

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

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


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