LoginSignup
160
68

More than 3 years have passed since last update.

国家の生成法🌐

Last updated at Posted at 2019-03-24

🌏国家を創る🌏

country4.gif

今回は自動生成した大陸に国家を建立していきます。

🌏自動生成アルゴリズム🌏

今回生成する地形の自動生成アルゴリズムは、"ボロノイ図法"を使用します。
(>> ボロノイ図法について解説した記事はこちら)

m1.gif

🏯初期国家の生成🏯

最初に設置する初期国家の生成は"イベント生成"を使用します。
(>> イベント生成について解説した記事はこちら)

dtl::utility::stl::setItem(matrix, n, set_value, clear_value);

setItem関数で国家のスタート地点を設定します。

赤い点部分が国家のスタート地点です。

⚔領土の拡大⚔

領土拡大関数を宣言
template<typename Matrix_, typename Matrix_Int_>
void territoryExpansion(Matrix_& matrix_, const Matrix_Int_ find_value_, const Matrix_Int_ set_value_);
領土の周りを1/2の確率で領地にする
 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] == find_value_) {
    if (matrix_[row][col - 1] <= 1 && mersenne_twister_32bit.probability()) matrix_[row][col - 1] = set_value_;
    if (matrix_[row][col + 1] <= 1 && mersenne_twister_32bit.probability()) matrix_[row][col + 1] = set_value_;
    if (matrix_[row - 1][col] <= 1 && mersenne_twister_32bit.probability()) matrix_[row - 1][col] = set_value_;
    if (matrix_[row + 1][col] <= 1 && mersenne_twister_32bit.probability()) matrix_[row + 1][col] = set_value_;
   }
 dtl::utility::stl::replace(matrix_, find_value_, set_value_);

country6.gif

各国家のスタート地点からじわじわと領土を拡大していきます。

陸地の領土がある程度埋まるまで拡大し続ける

100回の領地拡大を行う
for (int i{}; i < 100; ++i)
 territoryExpansion(matrix, find_value, set_value);

country5.gif

これで海部分の領土を取り除けば完成です。

🌏完成🌏

country4.gif

無事に国家を建立することが出来ました!

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

今回解説した自動生成は"Dungeon Template Library"を使用して実装されています。
ぜひ、活用してみてください!

logo640.gif

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

These codes are licensed under CC0.
CC0

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

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

160
68
4

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
160
68