#💀ローグライクダンジョン💀
今回はローグライクダンジョンの部屋生成アルゴリズムについてお話します。
(画像は以前作成したローグライクゲームのスクショ)
以前、作成したダンジョンアルゴリズム
>>ローグライク自動生成(区域分割法)
#💀作成方法💀
今回はローグライク版穴掘り法を使用する。
1.最初に1つ部屋を作る。
2.今ある"部屋または通路の生成可能な面"(branch_point)をランダムに選択する。
3.部屋または通路を生成する。
4. 2と3を繰り返す。
こんな感じです。
#💀よういするもの💀
##💀タイル💀
ID | 名前 | 色 |
---|---|---|
0. | 外壁 | ■■青■■ |
1. | 内壁 | ■■白■■ |
2. | 部屋 | ■■緑■■ |
3. | 玄関 | ■■黒■■ |
4. | 通路 | ■■黄■■ |
今回は5つのタイルを使用します。
bool型では足りません。
"3bit"以上の変数型の使用が条件です。
###💀タイルenum💀
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
は部屋または通路の生成可能な面の位置情報
**を格納します。
###💀マップ生成💀
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関数
**でダンジョンを生成します。
#💀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);
}
コンソールから出力します。
💀実装ライブラリ(ソースコード)💀
今回解説したローグライクの自動生成は**"Dungeon Template Library"に"RogueLike"**として実装されています。
ぜひ、活用してみてください!
#💀ソースコードのライセンス💀
These codes are licensed under CC0.
この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。
最後までお読みいただきありがとうございました!
###関連記事
ボロノイ図法の世界生成。
チャンク&中点変位法の世界生成。