오브젝트 설치🏠

🌏 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())));
}

추출한 지형에 거리나 던전을 설치합니다.

🌏완성🌏





무사히 도시나 던전을 생성할 수 있었습니다!

구현 라이브러리(소스 코드)



이번 해설한 월드맵의 자동 생성은 "던전 템플릿 라이브러리""SetItem" 로서 구현되고 있습니다.
꼭 활용해보세요!



소스 코드 라이센스



These codes are licensed under CC0.
이 기사의 소스 코드는 CC0 라이센스입니다. 꼭 자유롭게 변경하여 놀아보세요. 끝까지 읽어 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기