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

[DTL]国家の生成法🌐

More than 1 year has passed since last update.

🌏国家を創る🌏

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

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

Gaccho
People pass away, but their deeds abide.
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
ユーザーは見つかりませんでした