Edited at

[DTL]ローグライク自動生成(ローグライク穴掘り法)💀


💀ローグライクダンジョン💀

rog.png

今回はローグライクダンジョンの部屋生成アルゴリズムについてお話します。

(画像は以前作成したローグライクゲームのスクショ)

以前、作成したダンジョンアルゴリズム

>>ローグライク自動生成(区域分割法)


💀作成方法💀

今回はローグライク版穴掘り法を使用する。

1.最初に1つ部屋を作る。

2.今ある"部屋または通路の生成可能な面"(branch_point)をランダムに選択する。

3.部屋または通路を生成する。

4. 2と3を繰り返す。

こんな感じです。

rl.gif

完成イメージ


💀よういするもの💀


💀タイル💀

ID
名前

0.
外壁
■■青■■

1.
内壁
■■白■■

2.
部屋
■■緑■■

3.
玄関
■■黒■■

4.
通路
■■黄■■

今回は5つのタイルを使用します。

bool型では足りません。

"3bit"以上の変数型の使用が条件です。


💀タイルenum💀


タイルID

enum TileType :std::size_t {

outside_wall_id,
inside_wall_id,
room_id,
entrance_id,
way_id,
};


💀方角enum💀


方角

enum DirectionType :size_t {

direction_north,
direction_south,
direction_west,
direction_east,
direction_count,
};


💀四角形クラス💀


四角形の位置と大きさ

template<typename Int_>

struct Rect {
//位置
Int_ x, y;
//大きさ
Int_ w, h;
};

"部屋または通路の生成可能な面の位置情報"を格納する際に使用します。


💀ダンジョン生成クラス💀


💀クラスの作成💀


ローグライク生成クラス

template<typename int_map_t>

class RogueLike;


💀メンバ変数💀

std::vector<Rect<std::int_fast32_t>> room_rect;

std::vector<Rect<std::int_fast32_t>> branch_point;

room_rect部屋の位置情報

branch_point部屋または通路の生成可能な面の位置情報を格納します。


💀マップ生成💀

rl3.gif

小さいマップの場合

rl4.gif

大きいマップの場合


マップ生成

template<typename vArray>

constexpr void create(vArray& vec_, const size_t way_max_) {
if (!makeRoom(vec_, (int_fast32_t)((vec_.empty()) ? 0 : vec_.front().size()) / 2, (int_fast32_t)(vec_.size()) / 2, (DirectionType)rnd(4))) return;
for (size_t i = 1; i < way_max_; ++i)
if (!createNext(vec_)) break;
}

create関数でダンジョンを生成します。

rl5.gif

部屋のみを生成する場合

rl6.gif

通路のみを生成する場合


💀CUIでの出力💀


指定文字を出力

template<typename vArray>

constexpr void print(const vArray& tilev) {
for (const auto& i : tilev) {
for (const auto& j : i)
switch (j)
{
case dtl::outside_wall_id:std::cout << " "; break;
case dtl::inside_wall_id:std::cout << "■"; break;
case dtl::room_id:std::cout << "★"; break;
case dtl::entrance_id:std::cout << "・"; break;
case dtl::way_id:std::cout << "*"; break;
}
std::cout << std::endl;
}
}


呼び出し

int main() {

std::array<std::array<uint8_t, 63>, 31> col{ {} };
dtl::RogueLike<uint8_t> d(col, 20);
print(col);
}

コンソールから出力します。

rlcui2.png


💀実装ライブラリ(ソースコード)💀

今回解説したローグライクの自動生成は"Dungeon Template Library""RogueLike"として実装されています。

ぜひ、活用してみてください!

logo640.gif

rl7.gif


💀ソースコードのライセンス💀

These codes are licensed under CC0.

CC0

この記事のソースコードはCC0ライセンスとします。

ぜひ、自由に改変して遊んでみてください。

最後までお読みいただきありがとうございました!


関連記事

[DTL]地形生成(ボロノイ図法)🌏

ボロノイ図法の世界生成。

[DTL]地形生成(チャンク&中点変位法)🌽

チャンク&中点変位法の世界生成。