C++
game
アルゴリズム
ゲーム制作
DungeonGeneration

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


🌏バイオーム生成🌏

rpgi.gif

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


👾使用するタイル👾

今回使用するタイルは4種類です。

地形の状態を格納しています。

ID
名前

0.

■■深青■■

1.
平地
■■黄緑■■

2.
砂漠
■■薄黄■■

3.
森林
■■深緑■■


🌊海を用意する🌊


地形情報を記録する2次元配列

std::array<std::array<dungeon_t, 64>, 32> matrix{{}};


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

ao.png

海が創れました!


⛰陸地をふりかける⛰

陸地を生成する関数を作成します。

ここでは"createBiome"関数と命名します。

template<typename Matrix_>

void createBiome(Matrix_& matrix_);

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


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

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


🌀地形を変位させる🌀

四方向の値と中央の値を比較して、地形を変位させていきます。

この操作をすることにより、RPGっぽい地形が創れます。


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

さきほどの"ふりかけワールドマップ"を変位させていきます。

さっきよりRPGのワールドマップっぽくなりました。

rpgi3.gif

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

rpgi2.gif

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


🌏完成🌏

rpgi.gif

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


実装ライブラリ(ソースコード)

今回解説したワールドマップの自動生成は"Dungeon Template Library""Simple Biome Island"として実装されています。

GitHubに全ソースコードを載せています。ご参考になれば幸いです。

ぜひ、活用してみてください!

logo640.gif


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

These codes are licensed under CC0.

CC0

この記事のソースコードはCC0ライセンスとします。

ぜひ、自由に改変して遊んでみてください。

"いいね"をつけてくださると大変励みになります。

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