LoginSignup
172
84

More than 3 years have passed since last update.

オブジェクトの設置🏠

Last updated at Posted at 2019-03-17

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

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

172
84
1

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
172
84