LoginSignup
85
53

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-02-18

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

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

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

85
53
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
85
53