オブジェクトの設置🏠

# 🌏RPGの世界へようこそ🌏

<img src="https://qiita-image-store.s3.amazonaws.com/0/213065/4718688a-1a28-48dc-0e07-eab01e4d5746.gif" width="512px">

今回はRPGのフィールドマップを作って、**おうち**を建てます。

# 🌏自動生成アルゴリズム🌏

今回生成するRPGフィールドマップの**自動生成アルゴリズム**は、[**"セルオートマトン法"**](https://qiita.com/Gaccho/items/e29f98a32ba9f920346d)を使用します。
[**(>> セルオートマトン法について解説した記事はこちら)**](https://qiita.com/Gaccho/items/e29f98a32ba9f920346d)

![rpgi.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/4a71f54c-362f-5f67-f466-88d115450142.gif)

##👾使用するタイル👾

今回使用するタイルは7種類です。
地形の状態または街・ダンジョンの情報を格納しています。

|ID|名前|色|
|:---|:---|:---|
|0.|海|**<font color="#29289f">■■</font>深青<font color="#29289f">■■</font>**|
|1.|平地|**<font color="#65a338">■■</font>黄緑<font color="#65a338">■■</font>**|
|2.|砂漠|**<font color="#dfcb8c">■■</font>薄黄<font color="#dfcb8c">■■</font>**|
|3.|森林|**<font color="#096405">■■</font>深緑<font color="#096405">■■</font>**|
|4.|街|**<font color="#ff0000">■■</font>赤色<font color="#ff0000">■■</font>**|
|5.|洞窟|**<font color="#00ffff">■■</font>水色<font color="#00ffff">■■</font>**|
|6.|魔王城|**<font color="#c800ff">■■</font>紫色<font color="#c800ff">■■</font>**|

## 🏠ハウス関数を作る🏠

```cpp
template<typename After_Int_, typename Matrix_Int_, typename Matrix_>
bool setHouse(Matrix_& matrix_, const std::size_t n_, const After_Int_ set_value_, const Matrix_Int_ clear_value_) {
 if (n_ == 0) return true;
 /* ここに処理 */
 return true;
}
```

このRPGの世界に家(街やダンジョン)を建てる関数を創ります。

## 🌏地形タイルの抽出🌏

![rpgi.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/4a71f54c-362f-5f67-f466-88d115450142.gif)


|ID|名前|色|
|:---|:---|:---|
|0.|海|**<font color="#29289f">■■</font>深青<font color="#29289f">■■</font>**|
|1.|平地|**<font color="#65a338">■■</font>黄緑<font color="#65a338">■■</font>**|
|2.|砂漠|**<font color="#dfcb8c">■■</font>薄黄<font color="#dfcb8c">■■</font>**|
|3.|森林|**<font color="#096405">■■</font>深緑<font color="#096405">■■</font>**|

RPGフィールドマップ上にある地形(上記のID)のどれかを指定して街を作ります。

```cpp
std::vector<std::pair<std::size_t, std::size_t>> value_pairs{};
for (std::size_t row{}; row < matrix_.size(); ++row)
 for (std::size_t col{}; col < matrix_[row].size(); ++col)
  if (matrix_[row][col] == clear_value_) value_pairs.emplace_back(std::make_pair(row, col));
if (value_pairs.size() == 0) return false;
```

地形を抽出します。

## 🏠ハウスの設置🏠

```cpp
std::size_t index{ static_cast<std::size_t>(dtl::random::mersenne_twister_32bit(static_cast<std::int_fast32_t>(value_pairs.size()))) };
for (std::size_t modify_count{}; modify_count < n_; ++modify_count) {
 const auto& [modify_y, modify_x] {value_pairs[index]};
 if (matrix_[modify_y][modify_x] != clear_value_) return false;
 castCopyValue(matrix_[modify_y][modify_x], set_value_);
 value_pairs.erase(std::remove(value_pairs.begin(), value_pairs.end(), value_pairs[index]), value_pairs.end());
 if (value_pairs.size() == 0) break;
 index = static_cast<std::size_t>(mersenne_twister_32bit(static_cast<std::int_fast32_t>(value_pairs.size())));
}
```
抽出した地形に街やダンジョンを設置します。

# 🌏完成🌏

![rpg_town5.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/d64cee33-6bf8-a692-1b11-a58aee21324e.png)

無事に街やダンジョンを生成することが出来ました！

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

今回解説したワールドマップの自動生成は**["Dungeon Template Library"](https://github.com/Kasugaccho/DungeonTemplateLibrary)**に**["SetItem"](https://github.com/Kasugaccho/DungeonTemplateLibrary)**として実装されています。
ぜひ、活用してみてください！

[![logo640.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/b84a7834-2042-6704-fbbe-782a31f06091.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ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

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