C++
game
アルゴリズム
ゲーム制作
DungeonGeneration


🌏国家を創る🌏

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ライセンスとします。

ぜひ、自由に改変して遊んでみてください。

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