🌏母なる大地を創造する🌏
今回は世界を創造する禁断の闇魔術について解説します。
#🌏セルオートマトン法で作成🌏
世界生成アルゴリズムはいくつもの種類が存在します。
その中でも今回は**簡易なコードで生成することに長けている"セルオートマトン法"**を使用します。
その他の代表的なアルゴリズム:"ボロノイ図法の世界自動生成"・"チャンク中点変位法の世界自動生成"
#🌏セルオートマトン島生成クラス🌏
セルオートマトン法で島生成を行う**SimpleCellularAutomatonIsland
**クラスを作成します。
namespace dtl {
template<typename Int>
class SimpleCellularAutomatonIsland;
}
dtl(Dungeon Template Library)名前空間に作成します。
ひとまず導入する準備が出来ました。
次は陸地生成の部分を作ります。
#🌏陸地の形状を作成🌏
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関数"
は陸地生成する関数です。
#🌏地殻変動🌏
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;
}
}
}
🌏地殻変動をループする🌏
ただひたすら地殻変動を起こします。
良さそうな地形になった時に止めます。
地殻変動の最後は全てが海の底へ沈みます。
🌏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;
}
🌏完成🌏
無事に実装できました。
🌏実装ライブラリ(ソースコード)🌏
今回解説した洞窟の自動生成は**"Dungeon Template Library"に"Simple Cellular Automaton Island"**として実装されています。
ぜひ、活用してみてください!
🌏ソースコードのライセンス🌏
These codes are licensed under CC0.
この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。
最後までお読みいただきありがとうございました!