LoginSignup
170
120

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-12-09

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

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]地形生成(チャンク&中点変位法)🌽

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

170
120
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
170
120