🌏バイオーム生成🌏
今回は**「バイオーム生成(セルオートマトン法)」**についてお話します。
##👾使用するタイル👾
今回使用するタイルは4種類です。
地形の状態を格納しています。
ID | 名前 | 色 |
---|---|---|
0. | 海 | ■■深青■■ |
1. | 平地 | ■■黄緑■■ |
2. | 砂漠 | ■■薄黄■■ |
3. | 森林 | ■■深緑■■ |
#🌊海を用意する🌊
std::array<std::array<dungeon_t, 64>, 32> matrix{{}};
海のIDは0なので、2次元配列を0で初期化します。
海が創れました!
#⛰陸地をふりかける⛰
陸地を生成する関数を作成します。
ここでは**"createBiome"関数**と命名します。
template<typename Matrix_>
void createBiome(Matrix_& matrix_);
外周以外にランダム値(0~3)を代入します。
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);
少しRPGのワールドマップっぽくなりました!
#🌀地形を変位させる🌀
四方向の値と中央の値を比較して、地形を変位させていきます。
この操作をすることにより、RPGっぽい地形が創れます。
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;
}
}
さきほどの**"ふりかけワールドマップ"**を変位させていきます。
さっきよりRPGのワールドマップっぽくなりました。
繰り返し変位させると徐々にワールドマップっぽくなります。
いい感じにきれいなワールドマップが生成できた段階で止めます。
#🌏完成🌏
きれいなワールドマップが仕上がりました!
実装ライブラリ(ソースコード)
今回解説したワールドマップの自動生成は**"Dungeon Template Library"に"Simple Biome Island"**として実装されています。
ぜひ、活用してみてください!
ソースコードのライセンス
These codes are licensed under CC0.
この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。
最後までお読みいただきありがとうございました!