로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀

💀로그라이크던전💀




이번에는 로그라이크 던전의 방 생성 알고리즘에 대해 이야기하겠습니다.
(이미지는 이전에 작성한 로그라이크 게임의 스쿠쇼)

이전에 만든 던전 알고리즘
>>로그라이크 자동 생성(구역 분할법)

💀 만드는 법💀



이번에는 로그라이크판 구멍 파기법을 사용한다.

1. 첫째로 1개의 방을 만든다.
2. 지금 있는 "방 또는 통로의 생성 가능한 면"(branch_point)을 랜덤하게 선택한다.
3. 방 또는 통로를 생성한다.
4. 2와 3을 반복한다.

이런 느낌입니다.


완성 이미지

💀 준비하는 것 💀



💀타일💀




ID
이름
칼라


0.
외벽
■■파란■■

1.
내벽
■■흰색■■

2.

■■녹색■■

3.
현관
■■검정■■

4.
통로
■■황■■


이번에는 5개의 타일을 사용합니다.
bool 형으로는 부족합니다.

"3bit"이상의 변수형의 사용이 조건입니다.

💀타일 enum💀



타일 ​​ID
enum TileType :std::size_t {
    outside_wall_id,
    inside_wall_id,
    room_id,
    entrance_id,
    way_id,
};

💀방각 enum💀



사각
enum DirectionType :size_t {
    direction_north,
    direction_south,
    direction_west,
    direction_east,
    direction_count,
};

💀사각형 클래스💀



사각형의 위치와 크기
template<typename Int_>
struct Rect {
    //位置
    Int_ x, y;
    //大きさ
    Int_ w, h;
};

"방 또는 통로의 생성 가능한 면의 위치 정보"를 저장할 때 사용합니다.

💀던전 생성 클래스💀



💀 클래스 만들기💀



로그라이크 생성 클래스
template<typename int_map_t>
class RogueLike;

💀 멤버 변수💀


std::vector<Rect<std::int_fast32_t>> room_rect;
std::vector<Rect<std::int_fast32_t>> branch_point;
room_rect部屋の位置情報branch_point部屋または通路の生成可能な面の位置情報 를 포함합니다.

💀지도 생성💀




작은 맵의 경우


큰지도의 경우

맵 생성
template<typename vArray>
constexpr void create(vArray& vec_, const size_t way_max_) {
    if (!makeRoom(vec_, (int_fast32_t)((vec_.empty()) ? 0 : vec_.front().size()) / 2, (int_fast32_t)(vec_.size()) / 2, (DirectionType)rnd(4))) return;
    for (size_t i = 1; i < way_max_; ++i)
        if (!createNext(vec_)) break;
}
create関数 로 던전을 생성합니다.


방만 생성하는 경우


통로만 생성하는 경우

💀CUI에서의 출력💀



지정된 문자 출력
template<typename vArray>
constexpr void print(const vArray& tilev) {
    for (const auto& i : tilev) {
        for (const auto& j : i)
            switch (j)
            {
            case dtl::outside_wall_id:std::cout << " "; break;
            case dtl::inside_wall_id:std::cout << "■"; break;
            case dtl::room_id:std::cout << "★"; break;
            case dtl::entrance_id:std::cout << "・"; break;
            case  dtl::way_id:std::cout << "*"; break;
            }
        std::cout << std::endl;
    }
}

전화
int main() {
    std::array<std::array<uint8_t, 63>, 31> col{ {} };
    dtl::RogueLike<uint8_t> d(col, 20);
    print(col);
}

콘솔에서 출력합니다.



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



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





💀 소스 코드 라이센스 💀



These codes are licensed under CC0.
이 기사의 소스 코드는 CC0 라이센스입니다. 꼭 자유롭게 변경하여 놀아보세요. 끝까지 읽어 주셔서 감사합니다! 관련 기사 [DTL]지형 생성(보로노이 도법)🌏

보로노이 도법의 세계 생성.

[DTL]지형 생성(청크&중점 변위법)🌽

청크 & 중점 변위법의 세계 생성.

좋은 웹페이지 즐겨찾기