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


🌏RPGの世界へようこそ🌏

今回はRPGのフィールドマップを作って、おうちを建てます。


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

今回生成するRPGフィールドマップの自動生成アルゴリズムは、"セルオートマトン法"を使用します。

(>> セルオートマトン法について解説した記事はこちら)

rpgi.gif


👾使用するタイル👾

今回使用するタイルは7種類です。

地形の状態または街・ダンジョンの情報を格納しています。

ID
名前

0.

■■深青■■

1.
平地
■■黄緑■■

2.
砂漠
■■薄黄■■

3.
森林
■■深緑■■

4.

■■赤色■■

5.
洞窟
■■水色■■

6.
魔王城
■■紫色■■


🏠ハウス関数を作る🏠

template<typename After_Int_, typename Matrix_Int_, typename Matrix_>

bool setHouse(Matrix_& matrix_, const std::size_t n_, const After_Int_ set_value_, const Matrix_Int_ clear_value_) {
if (n_ == 0) return true;
/* ここに処理 */
return true;
}

このRPGの世界に家(街やダンジョン)を建てる関数を創ります。


🌏地形タイルの抽出🌏

rpgi.gif

ID
名前

0.

■■深青■■

1.
平地
■■黄緑■■

2.
砂漠
■■薄黄■■

3.
森林
■■深緑■■

RPGフィールドマップ上にある地形(上記のID)のどれかを指定して街を作ります。

std::vector<std::pair<std::size_t, std::size_t>> value_pairs{};

for (std::size_t row{}; row < matrix_.size(); ++row)
for (std::size_t col{}; col < matrix_[row].size(); ++col)
if (matrix_[row][col] == clear_value_) value_pairs.emplace_back(std::make_pair(row, col));
if (value_pairs.size() == 0) return false;

地形を抽出します。


🏠ハウスの設置🏠

std::size_t index{ static_cast<std::size_t>(dtl::random::mersenne_twister_32bit(static_cast<std::int_fast32_t>(value_pairs.size()))) };

for (std::size_t modify_count{}; modify_count < n_; ++modify_count) {
const auto& [modify_y, modify_x] {value_pairs[index]};
if (matrix_[modify_y][modify_x] != clear_value_) return false;
castCopyValue(matrix_[modify_y][modify_x], set_value_);
value_pairs.erase(std::remove(value_pairs.begin(), value_pairs.end(), value_pairs[index]), value_pairs.end());
if (value_pairs.size() == 0) break;
index = static_cast<std::size_t>(mersenne_twister_32bit(static_cast<std::int_fast32_t>(value_pairs.size())));
}

抽出した地形に街やダンジョンを設置します。


🌏完成🌏

rpg_town5.PNG

無事に街やダンジョンを生成することが出来ました!


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

今回解説したワールドマップの自動生成は"Dungeon Template Library""SetItem"として実装されています。

ぜひ、活用してみてください!

logo640.gif


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

These codes are licensed under CC0.

CC0

この記事のソースコードはCC0ライセンスとします。

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

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