[DTL]地形生成(セルオートマトン法)🌏


🌏母なる大地を創造する🌏

ri.gif

今回は世界を創造する禁断の闇魔術について解説します。


🌏セルオートマトン法で作成🌏

ri3

セルオートマトン法で作成する地形生成の動作

世界生成アルゴリズムはいくつもの種類が存在します。

その中でも今回は簡易なコードで生成することに長けている"セルオートマトン法"を使用します。

その他の代表的なアルゴリズム:"ボロノイ図法の世界自動生成""チャンク中点変位法の世界自動生成"


🌏セルオートマトン島生成クラス🌏

セルオートマトン法で島生成を行うSimpleCellularAutomatonIslandクラスを作成します。


クラス名

namespace dtl {

template<typename Int>
class SimpleCellularAutomatonIsland;
}

dtl(Dungeon Template Library)名前空間に作成します。

jimen.png

ひとまず導入する準備が出来ました。

次は陸地生成の部分を作ります。


🌏陸地の形状を作成🌏


セルオートマトン島の生成(public)

template<typename Matrix_>

constexpr void create(Matrix_& matrix_, const std::size_t max_value_ = 2) const noexcept {
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] = 1;
}

"create関数"陸地生成する関数です。

ri2

画面のふち以外の場所にランダムで陸地を設置します。


🌏地殻変動🌏


地殻変動

template<typename Matrix_>

constexpr void create(Matrix_& matrix_, const std::size_t max_value_ = 2) const noexcept {
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] = 1;
for (std::size_t i{}; i < max_value_; ++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;
}
}
}

ri3

地殻変動を起こし、陸地を移動させます。


🌏地殻変動をループする🌏

a

ただひたすら地殻変動を起こします。

良さそうな地形になった時に止めます。

地殻変動の最後は全てが海の底へ沈みます。


🌏CUIとして出力🌏


cui

#include <array>

#include "DTL.hpp"

int main() {
using dungeon_t = bool;
std::array<std::array<dungeon_t, 128>, 128> matrix{ {} };
dtl::generator::terrain::stl::SimpleCellularAutomatonIsland<dungeon_t> a(matrix,200);
dtl::console::output::stl::stringBool(matrix, "##", "//");
return 0;
}



コンソールから出力できました!


🌏完成🌏

無事に実装できました。

ri.gif


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

今回解説した洞窟の自動生成は"Dungeon Template Library""Simple Cellular Automaton Island"として実装されています。

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

logo640.gif


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

These codes are licensed under CC0.

CC0

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

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

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