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

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

![rog.png](https://qiita-image-store.s3.amazonaws.com/0/213065/7420d03f-e22c-2ea3-c743-e34d5002a9ab.png)
**今回はローグライクダンジョンの部屋生成アルゴリズムについてお話します。**
(画像は以前作成したローグライクゲームのスクショ)

以前、作成したダンジョンアルゴリズム
**[>>ローグライク自動生成(区域分割法)](https://qiita.com/Gaccho/items/f760a1fb27aa4c3659cf)**

#💀作成方法💀

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

1.最初に1つ部屋を作る。
2.今ある"部屋または通路の生成可能な面"(branch_point)をランダムに選択する。
3.部屋または通路を生成する。
4. 2と3を繰り返す。

こんな感じです。

![rl.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/28d389da-7bf1-20f3-e99f-638c417f22e7.gif)
**完成イメージ**

#💀よういするもの💀

##💀タイル💀

|ID|名前|色|
|:---|:---|:---|
|0.|外壁|**<font color="#2363b2">■■</font>青<font color="#2363b2">■■</font>**|
|1.|内壁|**<font color="#65a338">■■</font>白<font color="#65a338">■■</font>**|
|2.|部屋|**<font color="#359e44">■■</font>緑<font color="#359e44">■■</font>**|
|3.|玄関|**<font color="#352c44">■■</font>黒<font color="#352c44">■■</font>**|
|4.|通路|**<font color="#a79f45">■■</font>黄<font color="#a79f45">■■</font>**|

今回は5つのタイルを使用します。
bool型では足りません。

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

###💀タイルenum💀

```cpp:タイルID
enum TileType :std::size_t {
	outside_wall_id,
	inside_wall_id,
	room_id,
	entrance_id,
	way_id,
};
```

##💀方角enum💀

```cpp:方角
enum DirectionType :size_t {
	direction_north,
	direction_south,
	direction_west,
	direction_east,
	direction_count,
};
```

##💀四角形クラス💀

```cpp:四角形の位置と大きさ
template<typename Int_>
struct Rect {
	//位置
	Int_ x, y;
	//大きさ
	Int_ w, h;
};
```

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

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

###💀クラスの作成💀

```cpp:ローグライク生成クラス
template<typename int_map_t>
class RogueLike;
```

###💀メンバ変数💀

```cpp
std::vector<Rect<std::int_fast32_t>> room_rect;
std::vector<Rect<std::int_fast32_t>> branch_point;
```

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

###💀マップ生成💀

![rl3.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/949e7984-4903-12b2-b97d-f7d647851b25.gif)
小さいマップの場合

![rl4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/ef26da46-6444-e757-3e02-f96d3de1e4b9.gif)
大きいマップの場合

```cpp:マップ生成
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](https://qiita-image-store.s3.amazonaws.com/0/213065/5d40046a-7829-be31-4fe6-551f40580a87.gif)
部屋のみを生成する場合

![rl6.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/8b4f9d74-a507-2dcc-20bf-b7fb14e53141.gif)
通路のみを生成する場合

#💀CUIでの出力💀

```cpp:指定文字を出力
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;
	}
}
```

```cpp:呼び出し
int main() {
	std::array<std::array<uint8_t, 63>, 31> col{ {} };
	dtl::RogueLike<uint8_t> d(col, 20);
	print(col);
}
```

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

![rlcui2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/e0959dd4-efb7-2930-76c2-0531d19fca6f.png)


# [💀実装ライブラリ(ソースコード)💀](https://github.com/Kasugaccho/DungeonTemplateLibrary)

今回解説したローグライクの自動生成は**["Dungeon Template Library"](https://github.com/Kasugaccho/DungeonTemplateLibrary)**に**["RogueLike"](https://github.com/Kasugaccho/DungeonTemplateLibrary/blob/master/README.md)**として実装されています。
ぜひ、活用してみてください！

[![logo640.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/b84a7834-2042-6704-fbbe-782a31f06091.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

[![rl7.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/97f29065-709b-f259-9077-05f833c87eef.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

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

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

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


###関連記事

[[DTL]地形生成(ボロノイ図法)🌏](https://qiita.com/Gaccho/items/08710de2c57da912b822)

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

[[DTL]地形生成(チャンク&中点変位法)🌽](https://qiita.com/Gaccho/items/2840450460fa6e00a56c)

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