🌏RPGの世界へようこそ🌏
今回はRPGのフィールドマップを作って、おうちを建てます。
🌏自動生成アルゴリズム🌏
今回生成するRPGフィールドマップの自動生成アルゴリズムは、"セルオートマトン法"を使用します。
(>> セルオートマトン法について解説した記事はこちら)
##👾使用するタイル👾
今回使用するタイルは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の世界に家(街やダンジョン)を建てる関数を創ります。
🌏地形タイルの抽出🌏
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())));
}
抽出した地形に街やダンジョンを設置します。
🌏完成🌏
無事に街やダンジョンを生成することが出来ました!
実装ライブラリ(ソースコード)
今回解説したワールドマップの自動生成は**"Dungeon Template Library"に"SetItem"**として実装されています。
ぜひ、活用してみてください!
ソースコードのライセンス
These codes are licensed under CC0.
この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。
最後までお読みいただきありがとうございました!