바이옴 생성 (셀 오토 마톤 법) 🌏

🌏 바이옴 생성 🌏





이번에는 「바이옴 생성(셀 오토마톤법)」에 대해 이야기하겠습니다.

👾 사용할 타일👾



이번에 사용하는 타일은 4 종류입니다.
지형 상태를 저장합니다.


ID
이름
칼라


0.
바다
■■딥 블루■■

1.
평지
■■황록■■

2.
사막
■■박황■■

3.

■■심록■■


🌊 바다 준비 🌊



지형 정보를 기록하는 2차원 배열
std::array<std::array<dungeon_t, 64>, 32> matrix{{}};

바다의 ID는 0이므로 2차원 배열을 0으로 초기화합니다.



바다를 만들 수 있었습니다!

⛰ 육지를 뿌리다 ⛰



육지를 생성하는 함수를 만듭니다.
여기에서는 "createBiome"함수라고 명명합니다.
template<typename Matrix_>
void createBiome(Matrix_& matrix_);

외주 이외에 랜덤값(0~3)을 대입합니다.

createBiome 함수에 추가
using dtl::random::mersenne_twister_32bit;
 for (std::size_t row{ 1 }; row < matrix_.size() - 1; ++row)
  for (std::size_t col{ 1 }; col < matrix_[row].size() - 1; ++col)
   if (mersenne_twister_32bit.probability()) matrix_[row][col] = mersenne_twister_32bit(4);



조금 RPG의 월드 맵 같아졌습니다!

🌀지형을 변위시킨다🌀



4방향의 값과 중앙의 값을 비교해, 지형을 변위시켜 갑니다.
이 조작을 함으로써 RPG 같은 지형을 만들 수 있습니다.

createBiome 함수에 추가
for (std::size_t i{}; i < 2; ++i)
 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 - 1] && matrix_[row][col + 1] && matrix_[row - 1][col] && matrix_[row + 1][col]) matrix_[row][col] = matrix_[row][col + 1];
   else switch (mersenne_twister_32bit(4))
   {
   case 0:matrix_[row][col] = matrix_[row][col - 1]; break;
   case 1:matrix_[row][col] = matrix_[row][col + 1]; break;
   case 2:matrix_[row][col] = matrix_[row - 1][col]; break;
   case 3:matrix_[row][col] = matrix_[row + 1][col]; break;
   }
}



아까 정도의 "후카케 월드맵"을 변위시켜 갑니다.
아까보다 RPG의 월드 맵 같아졌습니다.



반복 변위시키면 서서히 월드맵처럼 보입니다.



좋은 느낌으로 깨끗한 월드맵이 생성된 단계에서 멈춥니다.

🌏완성🌏





깨끗한 월드맵이 완성되었습니다!

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



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



소스 코드 라이센스



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

좋은 웹페이지 즐겨찾기