로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀
13803 단어 C++게임 제작알고리즘게임DungeonGeneration
💀로그라이크던전💀
이번에는 로그라이크 던전의 방 생성 알고리즘에 대해 이야기하겠습니다.
(이미지는 이전에 작성한 로그라이크 게임의 스쿠쇼)
이전에 만든 던전 알고리즘
>>로그라이크 자동 생성(구역 분할법)
💀 만드는 법💀
이번에는 로그라이크판 구멍 파기법을 사용한다.
1. 첫째로 1개의 방을 만든다.
2. 지금 있는 "방 또는 통로의 생성 가능한 면"(branch_point)을 랜덤하게 선택한다.
3. 방 또는 통로를 생성한다.
4. 2와 3을 반복한다.
이런 느낌입니다.
완성 이미지
💀 준비하는 것 💀
💀타일💀
ID
이름
칼라
0.
외벽
■■파란■■
1.
내벽
■■흰색■■
2.
방
■■녹색■■
3.
현관
■■검정■■
4.
통로
■■황■■
이번에는 5개의 타일을 사용합니다.
bool 형으로는 부족합니다.
"3bit"이상의 변수형의 사용이 조건입니다.
💀타일 enum💀
타일 IDenum 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]지형 생성(청크&중점 변위법)🌽
청크 & 중점 변위법의 세계 생성.
Reference
이 문제에 관하여(로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gis/items/253cb6af577ec11e79cf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번에는 로그라이크판 구멍 파기법을 사용한다.
1. 첫째로 1개의 방을 만든다.
2. 지금 있는 "방 또는 통로의 생성 가능한 면"(branch_point)을 랜덤하게 선택한다.
3. 방 또는 통로를 생성한다.
4. 2와 3을 반복한다.
이런 느낌입니다.
완성 이미지
💀 준비하는 것 💀
💀타일💀
ID
이름
칼라
0.
외벽
■■파란■■
1.
내벽
■■흰색■■
2.
방
■■녹색■■
3.
현관
■■검정■■
4.
통로
■■황■■
이번에는 5개의 타일을 사용합니다.
bool 형으로는 부족합니다.
"3bit"이상의 변수형의 사용이 조건입니다.
💀타일 enum💀
타일 IDenum 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]지형 생성(청크&중점 변위법)🌽
청크 & 중점 변위법의 세계 생성.
Reference
이 문제에 관하여(로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gis/items/253cb6af577ec11e79cf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
enum TileType :std::size_t {
outside_wall_id,
inside_wall_id,
room_id,
entrance_id,
way_id,
};
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;
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;
}
지정된 문자 출력
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]지형 생성(청크&중점 변위법)🌽
청크 & 중점 변위법의 세계 생성.
Reference
이 문제에 관하여(로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gis/items/253cb6af577ec11e79cf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
These codes are licensed under CC0.
이 기사의 소스 코드는 CC0 라이센스입니다. 꼭 자유롭게 변경하여 놀아보세요. 끝까지 읽어 주셔서 감사합니다! 관련 기사 [DTL]지형 생성(보로노이 도법)🌏
보로노이 도법의 세계 생성.
[DTL]지형 생성(청크&중점 변위법)🌽
청크 & 중점 변위법의 세계 생성.
Reference
이 문제에 관하여(로그 라이크 자동 생성 (로그 라이크 홀 파기법) 💀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gis/items/253cb6af577ec11e79cf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)