バイオーム生成(セルオートマトン法)🌏

# 🌏バイオーム生成🌏

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

今回は**「バイオーム生成(セルオートマトン法)」**についてお話します。

##👾使用するタイル👾

今回使用するタイルは4種類です。
地形の状態を格納しています。

|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>**|

#🌊海を用意する🌊

```cpp:地形情報を記録する2次元配列
std::array<std::array<dungeon_t, 64>, 32> matrix{{}};
```

海のIDは0なので、2次元配列を0で初期化します。

![ao.png](https://qiita-image-store.s3.amazonaws.com/0/213065/608994b7-91b7-3897-0e87-93c823529cd0.png)

海が創れました！

#⛰陸地をふりかける⛰

陸地を生成する関数を作成します。
ここでは**"createBiome"関数**と命名します。

```cpp
template<typename Matrix_>
void createBiome(Matrix_& matrix_);
```

外周以外にランダム値(0~3)を代入します。

```cpp:createBiome関数に追加
using dtl::random::mersenne_twister_32bit;
 for (std::size_t row{ 1 }; row < matrix_.size() - 1; ++row)
  for (std::size_t col{ 1 }; col < matrix_[row].size() - 1; ++col)
   if (mersenne_twister_32bit.probability()) matrix_[row][col] = mersenne_twister_32bit(4);
```

![rpgi5.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/481de160-9fd7-6b97-eda4-24cda334e2f3.gif)

少しRPGのワールドマップっぽくなりました！

#🌀地形を変位させる🌀

四方向の値と中央の値を比較して、地形を変位させていきます。
この操作をすることにより、RPGっぽい地形が創れます。

```cpp:createBiome関数に追加
for (std::size_t i{}; i < 2; ++i)
 for (std::size_t row{ 1 }; row < matrix_.size() - 1; ++row)
  for (std::size_t col{ 1 }; col < matrix_[row].size() - 1; ++col) {
   if (matrix_[row][col - 1] && matrix_[row][col + 1] && matrix_[row - 1][col] && matrix_[row + 1][col]) matrix_[row][col] = matrix_[row][col + 1];
   else switch (mersenne_twister_32bit(4))
   {
   case 0:matrix_[row][col] = matrix_[row][col - 1]; break;
   case 1:matrix_[row][col] = matrix_[row][col + 1]; break;
   case 2:matrix_[row][col] = matrix_[row - 1][col]; break;
   case 3:matrix_[row][col] = matrix_[row + 1][col]; break;
   }
}
```

![rpgi4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/fa8d30d9-42a7-ada2-56a2-6d998ccf30ad.gif)

さきほどの**"ふりかけワールドマップ"**を変位させていきます。
さっきよりRPGのワールドマップっぽくなりました。

![rpgi3.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/e938e5b6-044c-1dfc-d117-10f62a27d8bc.gif)

繰り返し変位させると徐々にワールドマップっぽくなります。

![rpgi2.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/8d297917-e78d-a6ed-fd6b-8b5825424782.gif)

いい感じにきれいなワールドマップが生成できた段階で止めます。


#🌏完成🌏

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

きれいなワールドマップが仕上がりました！

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

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

[![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ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

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