연결된 경로가있는 프로 시저 2D 맵 알고리즘


26

해결 문제 : 모든 방이 연결된 타일 기반 게임에 대해 임의의 2D 던전 맵을 생성하십시오.

현재 가지고있는 것보다 더 나은 솔루션을 찾고 있습니다.

내 현재 솔루션은 두 가지 알고리즘을 실행하는 것입니다. 첫 번째는 방으로 던전을 생성합니다. 두 번째는 모든 방이 연결되어 있는지 확인하십시오. 다른 용제가 무엇인지 궁금합니다. 더 빠르거나 더 쉬운 것 등. 속도는 실제로 문제가되지 않지만, 실제 비용없이 속도를 얻을 수 있다면, 그것은 좋은 것입니다. 더 중요한 것은 저와 다른 사람들이 문제를 해결하고 해결하는 다른 방법을 배울 수 있다는 것입니다.

아래는 내 현재 구현입니다. 객실에는 현재 2, 3 또는 4 방향으로 출구가 없습니다.

던전 룸 생성

설정 : 현재 방을 왼쪽 상단 방으로 설정하십시오.

  1. 객실의 유효한 객실 유형을 가져 오십시오 (유효한 객실 유형은 던전에서 출구가없고 위의 방의 출구와 왼쪽의 방과 일치하는 출구가있는 유형입니다). 아래 2 단계로 인해 남았습니다.
  2. 방을 내려 놓고 x 좌표를 한 단계 앞으로 내립니다. x 좌표가 던전 너비를 초과하는 경우 x 좌표를 0으로 설정하고 y 좌표를 한 단계 진행하십시오. y 좌표가 던전 높이를 초과하면 완료됩니다.
  3. # 1부터 반복하십시오.

그런 다음 모든 방이 연결되어 있는지 확인합니다. 모든 방이 연결되어 있지 않으면 섹시하지는 않지만 던전 레이아웃 측면에서 충분히 좋은 방법으로 두 번째 알고리즘을 실행하고 방을 통과하여 모든 끝을 변경하도록합니다. 연결 중입니다.

모든 방이 연결되어 있는지 확인

설정 : 경로를 나타내는 정수의 2D 맵을 작성하고 항목을 "처리되지 않은"(아직 순회되지 않은) 값 -1로 초기화하십시오. 현재 경로를 추적하는 시작 경로 색인 정수를 1로 설정하십시오. 검사 할 방 스택에 추가하여 현재 방을 왼쪽 상단 방으로 설정하십시오.

  1. 스택에 확인할 룸이 포함되어 있으면 룸의 경로 색인을 현재 경로 색인으로 설정하십시오. 스택에 방이 포함되어 있지 않은 경우 경로 색인을 늘리고 아직 처리되지 않은 방을 얻을 때까지 열별로 한 줄씩 이동하여 방을 가져 오십시오. 방을 찾을 수 없으면 완료됩니다.
  2. 방에 출구가 왼쪽에 있는지 확인하십시오. 스택에 남아 있지 않은 경우 왼쪽 방을 스택에 추가 한 경우
  3. 아래쪽, 오른쪽 및 위쪽 방향에 대해 2 단계를 반복합니다 (스택을 사용하고 있으므로 위쪽 방향부터 시작하여 시계 방향으로 이동 함을 의미합니다).
  4. 1 단계부터 반복하십시오.
  5. 경로 인덱스 수가 1보다 크면 연결이 끊어진 방이있는 것입니다.

연결이 끊어진 방이있는 경우 경로 색인으로 방을 그룹화하고 가장 큰 경로의 색인을 가져 와서 다른 모든 방을 해당 방에 연결하십시오. 이것은 진행중인 작업이지만, 나의 (현재, "잔인한") 계획은 룸 그룹의 각 룸을 통과하는 것입니다 (첫 번째 제외) biggeset 룸 그룹에 수평 또는 수직 경로가 있는지 확인하십시오. 그렇다면 그 사이에 방을 주입 / 업데이트하여 수평 / 수직 경로를 만드십시오. 헹구고 반복하십시오. 추악하지만 예, 시각적 패턴 측면에서 눈에 띄지 않는 것이기 때문에 그 의미에서 작동합니다.


1
PCG 위키에서 "Dungeon Generation" 을 체크 아웃 했습니까 ? 질문에 대답합니까?
congusbongus

@congusbongus 유용한 자료입니다. 해당 페이지에 링크 된 donjon 생성기는 훌륭합니다. 감사.
user1323245

답변:


33

내가 본 최고의 알고리즘 중 하나는 Binary Space Partitioning을 사용하여 던전을 생성하는 것입니다.

내가 읽은 가장 일반적인 설명 은 Doryen Chronicles of Doryen (백업 목적으로 첨부 됨)에서 찾을 수있는 것입니다 . 코드에 들어 가지 않고 절차를 설명하므로 구현을 독자에게 맡기십시오 .

코드와 함께 동일한 주제에 대한 두 개의 다른 자습서는


BSP 트리 구축

우리는 벽 세포로 채워진 직사각형 던전으로 시작합니다. 각 지하 감옥이 대략 방 크기가 될 때까지이 던전을 재귀 적으로 나눕니다. 던전 분할은이 작업을 사용합니다.

  • 수평 또는 수직 분할 : 임의의 방향을 선택
  • 임의의 위치를 ​​선택하십시오 (세로 x, 가로 y)
  • 던전을 두 개의 하위 던전으로 나눕니다.

여기에 이미지 설명을 입력하십시오

이제 우리는 두 개의 하위 던전 A와 B를 가지고 있습니다.

여기에 이미지 설명을 입력하십시오

분할 위치를 선택할 때는 던전 경계선에 너무 가까이 있지 않도록주의해야합니다. 생성 된 각 하위 던전 안에 방을 배치 할 수 있어야합니다. 가장 낮은 하위 던전이 생성하려는 방의 크기가 될 때까지 반복합니다.

여기에 이미지 설명을 입력하십시오

던전 구축

이제 나무의 각 잎에 임의의 크기의 방을 만듭니다. 물론 방은 해당 하위 던전 안에 있어야합니다. BSP 트리 덕분에 두 개의 겹치는 방을 가질 수 없습니다.

여기에 이미지 설명을 입력하십시오

복도를 만들기 위해 나무의 모든 잎을 반복하여 각 잎을 자매와 연결합니다. 두 방에 대면 벽이 있으면 직선 복도를 사용할 수 있습니다. 그렇지 않으면 우리는 Z 자형 복도를 사용해야합니다.

여기에 이미지 설명을 입력하십시오

이제 트리에서 한 수준 위로 올라가서 아버지 하위 지역에 대한 프로세스를 반복합니다. 이제 두 방 또는 복도와 방 또는 두 복도 사이를 연결하여 두 개의 하위 지역을 연결할 수 있습니다.

여기에 이미지 설명을 입력하십시오

우리는 처음 두 개의 하위 던전 A와 B를 연결할 때까지 과정을 반복합니다.

여기에 이미지 설명을 입력하십시오


이 기술이 루프를 만들지 않는 것은 가치가 없지만 임의의 복도를 추가하지 않고 그 주위에 방법이 있는지 확실하지 않습니다. 여전히 좋은 대답, +1
Vality

이것은 유망한 시작입니다. 루프를 추가하는 방법을 알아 내야하지만 현재 진행중인 경로를 계속 진행하는 것보다는 해당 문제를 해결하는 것이 좋습니다. 감사.
user1323245

2
좋아요! 나는 id에 관심이있어서 작은 시도를했다. 무작위를 사용하는 경우 조심해야합니다. 그렇지 않으면 너무 이상한 결과가 나옵니다. 그리고 나무에서 복도를 만드는 쉬운 방법을 볼 수 없기 때문에 회귀 분할 중에 복도를 올바르게 처리하지 않아야하는지 궁금합니다. 어쨌든 관심있는 바이올린을위한 누군가가 여기에 있습니다 : jsfiddle.net/gamealchemist/xt57zwb8
GameAlchemist

큰 환경에서 반복 가능한 시드 절차 에서이 문제가 다소 있음을 알았습니다. 아마도 한 번에 전체 레벨을 생성 할 수 있도록 이런 종류의 세대에서 내가 본 최고의 방법 중 하나 일 것입니다. 나는 이것을 +1
그 노숙자 가이

4

BSP 방법은 분명히 던전을 생성하기위한 가장 인기있는 방법이지만 그것만은 아니다.

완전성을 위해 나는 나를 위해 일한 발전기를 설명 할 것이다 . 나는 이것에 대해 읽은 곳을 기억하지 못한다는 것을 인정해야하므로 내 발명품이 아니라고 말할 것입니다 ( Jamis Buck오래된 기사 는 매우 친숙하게 들립니다).

방이있는 미로

기본 아이디어는 던전이 방이있는 미로라는 것입니다. 이 알고리즘의 첫 번째 단계는 미로 를 생성하는 것입니다 .

Eller 알고리즘의 변형으로 생성 된 미로

다음 단계는 드문 드문하게 만드는 것입니다 (데드 엔드 제거)

스파 스 만들기 : 막 다른 골목 제거

3 단계는 몇 가지 루프를 추가하는 것입니다 ( 완벽하지 않음 ) 이미지는 거의 눈에 띄지 않기 때문에 이미지를 건너 뛸 것입니다. 이 시점에서 루프가 발생했습니다).

그런 다음 4 단계에서 분리 된 세포를 제거해야합니다.

분리 된 세포 제거

이제 복도가 완성되었으며 방을 추가 할 준비가되었습니다. 이를 위해 우리는 다음을 수행합니다.

  1. 방 세트 (너비와 높이) 생성
  2. 각 객실마다 가능한 모든 위치를 반복하고 최상의 위치를 ​​결정합니다.
    • 최적의 위치는 조건에 가중치를 추가하여 계산합니다 (예 : 복도에 인접성).
  3. 우리는 방을 배치합니다.

지금까지 던전은 다음과 같습니다. 객실 추가

마지막 단계는 장식을 추가하는 것입니다.

문과 방 번호 그리기

마지막 생각들

  • Eller Algorithm 의 제거 버전을 사용했습니다 .
  • 미로 알고리즘에 따라 질감이 다를 수 있습니다. 다른 알고리즘을 선호 할 수 있습니다. 예를 들어 다음 이미지는 "바이너리 트리"(대각선 바이어스)와 "재귀 분할"(긴 회랑) 알고리즘의 변형으로 인해 다른 텍스처를 보여줍니다 . 이진 트리 대 의사 재귀 부서

2
좋은 물건. 다른 레벨에 다른 알고리즘을 사용하면 게임을 더욱 다양하게 만들 수 있기 때문에 다양한 방법을 찾고 있습니다.
user1323245
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.