절차 적 던전 생성 :이 모든 방이 최소 복도를 사용하여 연결되도록하는 간단한 알고리즘이 있습니까?


9

복도가 너무 많지 않고 모든 방을 연결하여 벌집 모양의 구조물을 만들 수 있습니까? (단일 방에서 오는 3-4 개 이상의 복도)

아래는 내 방 모양이 기본적으로 무작위로 배치 된 결과입니다.

무작위로 배치 된 그리드 룸의 출력

복도를 현명하게하기를 바라고있는 것.

http://i.imgur.com/9GUi6Yy.png


나는 3이나 4가 "너무 많은 복도"라고 생각하지 않습니다. 특히 던전에 9 개의 방이 있다면. 또한, "하이브와 같은 구조"가 무엇을 의미하는지 잘 모르겠습니다. 원하는 모양에 대해 자세히 설명해 주시겠습니까?
fnord

"완료된"맵을 포함시켜 관심있는 것을 표시하십시오.
MichaelHouse

아 그렇습니다, 나는 각 방에서 나오는 최대 3 명 또는 4 명의 코 라이더를 의미했습니다.
Blenderer

복도까지 진행중인 이미지를 추가했습니다.
Blenderer

2
어떤 방에서든 복도가 3 개가 없으면 방을 간단히 선형으로 연결하기 만하면됩니다. 따라서 하나만 골라서 인접하지 않은 두 곳의 이웃과 연결하면됩니다.
Nick

답변:


6

글쎄, 내가 생각할 수있는 가장 간단한 방법은 모든 방이 적어도 하나의 복도로 연결되어 있는지 확인하는 것부터 시작합니다.

  1. 마지막 또는 첫 번째 방으로 시작하십시오.
  2. 어떤 방에 아직 연결되어 있지 않은 1 거리 이내의 임의의 방을 잡으십시오 (모든 방의 연결이 끊어지기 때문에 계속 진행할 수 있습니다).
  3. 그러한 방이 없다면 거리 +1로 가십시오. 복도를 연결하고 싶지 않다고 가정하면 다른 방으로 터널을 옮길 수 있습니다.
  4. 모든 방이 연결될 때까지 의사 무작위로 길을 가십시오.

이제 우리는 당신이 모든 방에 갈 수 있다는 것을 알고 있습니다.이 엄격한 선형 미로보다 더 많은 것을 원한다면 방을 밟고 방을 연결하기 위해 무작위로 새로운 경로를 만들 수 있습니다. 방의 일정 비율이 최대 연결에 도달 할 때까지-등

마지막 단계로 다양한 상황에 맞게 결과를 변경하는 규칙을 추가 할 수 있습니다. 예를 들어, 복도가 하나 뿐인 방은 정의상 막 다른 곳이라는 것을 알 수 있습니다. 더 많은 데드 엔드를 만들거나 모든 연결이 2 개 이상 있는지 확인하여 모두 제거 할 수 있습니다. 막 다른 골목에 비밀 통로를 만들 수 있습니다. 보스 룸이 막 다른 곳인지 확인할 수 있습니다. 시작 실이 막 다른지 확인하고 두 번째 방에 최소 X 연결이 있는지 확인하십시오. 광고 인피니 엄.

각 가정과 규칙은 레벨의 모양을 근본적으로 바꿀 수 있지만 이는 재미의 일부입니다! 이것은 적어도 당신이 하이브 / 동굴 같은 방을 시작하게해야합니다.


이것은 Kruskal의 최소 스패닝 트리 알고리즘에 상당히 가깝습니다. 이것은 " 일부 방에 아직 연결되지 않았습니다"에서 " 같은 클러스터에 아직 연결되지 않았습니다"로 2의 조건 을 수정하여 위에서 설명한 규칙의 버그를 수정할 수 있습니다. 각 방이 어떤 방에 연결되어 있지만 던전 전체가 여전히 여러 개의 분리 된 섬을 형성하는 상황. Kruskal 's는 최소 총 복도 길이를 가진 연결 그래프를 찾을 수 있습니다.
DMGregory

3

이미 연결된 방을 만드십시오. 한 방으로 시작한 다음 다른 방으로 1-3 개의 복도를 지으십시오. 그런 다음 충분한 공간을 추가 할 때까지 반복하십시오.


2

이 방은 2 차원 평원에 포함 된 그래프 정점이므로 이론적으로 여행중인 판매원 문제를 해결하여 수행 할 수 있습니다. 분명히, 간단한 휴리스틱 은 훌륭하고 합리적인 확장 성을 허용합니다.

모든 방 사이의 모서리 (복도 길이)를 계산합니다. 길이별로 정렬합니다. 사이클을 만들거나 원하는 최대 값 (3-4) (반복) 이상으로 정점 (방)의 정도를 높이 지 않는 한 가장 짧은 복도를 추가합니다. 주기를 확인하기 위해 UnionFind를 적용하거나 작은 데이터에 대해 빠른 BFS를 수행 할 수 있습니다.


이 답변은 허용되는 답변보다 낫습니다. 가장 짧은 연결 복도를 먼저 선택하는 탐욕스러운 전략이 효과적입니다. 사이클을 피하려면 복도가 이미 연결된 방에 연결하지 마십시오.
Jelle van Campen

@JellevanCampen 감사합니다. ;) 두 개의 분리 된 연결된 컴포넌트가있을 수 있습니다. 따라서 두 노드가 연결되어 있으면 Union find를 사용하거나 BFS와 함께 확인하십시오.
AturSams

아 그래, 너의 권리, 내 나쁜.
Jelle van Campen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.