Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした