지형 생성 (셀 오토 마톤 법) 🌏

🌏 어머니가 되는 대지를 창조한다🌏





이번에는 세계를 창조하는 금단의 어둠 마술에 대해 해설합니다.

🌏셀 오토마톤법으로 작성🌏




셀 오토마톤법으로 작성하는 지형 생성의 동작

세계 생성 알고리즘에는 여러 종류가 있습니다.
그 중에서도 이번에는 간단한 코드로 생성하는 데 뛰어난 "셀 오토마톤법"을 사용합니다.

기타 대표 알고리즘: "보로노이 도법의 세계 자동 생성" · "청크 중점 변위법의 세계 자동 생성"

🌏셀 오토마톤 아일랜드 생성 클래스🌏



셀 오토마톤법으로 섬 생성을 한다 SimpleCellularAutomatonIsland 클래스를 작성합니다.

클래스 이름
namespace dtl {
    template<typename Int>
    class SimpleCellularAutomatonIsland;
}

dtl (Dungeon Template Library) 이름 공간에 작성합니다.



일단 도입할 준비가 되었습니다.
다음은 육지 생성 부분을 만듭니다.

🌏 육지 모양 만들기 🌏



셀 오토마톤 섬 생성 (public)
template<typename Matrix_>
constexpr void create(Matrix_& matrix_, const std::size_t max_value_ = 2) const noexcept {
    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] = 1;
}
"create関数" 는 육지 생성하는 함수입니다.


화면의 후지 이외의 장소에 무작위로 육지를 설치합니다.

🌏 지각 변동🌏



지각 변동
template<typename Matrix_>
constexpr void create(Matrix_& matrix_, const std::size_t max_value_ = 2) const noexcept {
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] = 1;
for (std::size_t i{}; i < max_value_; ++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;
  }
 }
}


지각 변동을 일으켜 육지를 이동시킵니다.

🌏 지각 변동을 반복합니다 🌏





단지 오로지 지각 변동을 일으킵니다.
좋은 것 같은 지형이 되었을 때 멈춥니다.

지각 변동의 마지막은 모두가 바다의 바닥에 가라앉습니다.

🌏CUI로 출력🌏



cui
#include <array>
#include "DTL.hpp"

int main() {
    using dungeon_t = bool;
    std::array<std::array<dungeon_t, 128>, 128> matrix{ {} };
    dtl::generator::terrain::stl::SimpleCellularAutomatonIsland<dungeon_t> a(matrix,200);
    dtl::console::output::stl::stringBool(matrix, "##", "//");
    return 0;
}


콘솔에서 출력할 수 있었습니다!

🌏완성🌏



무사히 구현할 수 있었습니다.



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



이번 해설한 동굴의 자동 생성은 "던전 템플릿 라이브러리""Simple Cellular Automaton Island" 로 구현되어 있습니다.
꼭 활용해보세요!



🌏 소스 코드 라이센스 🌏



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

좋은 웹페이지 즐겨찾기