랜덤 맵 생성-랜덤 노드 분산 / 클러스터링 전략


10

각 노드가 관심 지점 (행성, 소행성 등) 인 공간에서 간단한 4X 전략 게임을하고 있습니다.

무작위로지도를 생성하려면 아래 단계를 따르십시오.

  1. 지도가 가질 각 노드의 유형을 결정하십시오 (아마도 지구와 같은 행성 5 개, 불모의 행성 10 개 등).

  2. 각 유형의 노드를 맵에 배치하십시오.

2 단계에서는 각 노드 유형이 고르게 분산되고 싶습니다. 예를 들어, 나는 지구와 같은 행성을 모두 배치하는 것으로 시작합니다. 위치를 결정하기 위해 단순히 rand (map.width, map.height)를 수행하면 모든 지구와 같은 행성들이 모여서 그 지역에서 시작하는 플레이어에게 유리할 것입니다.

서로 다른 그래프 함수 또는 노이즈 함수를 사용하는 등의 방법으로 (x, y) 좌표 시퀀스가 ​​생성 될 수 있습니다. 마찬가지로 서로 가까운 좌표를 생성하는 방법이 있습니까?


1
나의 답변이든 다른 사람이든 답변을 허용 된 것으로 표시하십시오. 감사.
엔지니어

답변:


8

당신이 겪고있는 문제는 무작위 선택이 차별적이지 않다는 것입니다. 그것은 그것이 당신이해야 할 일에 적합하지 않다는 것을 의미 할 수 있습니다. 그러나이 문제를 해결하는 쉬운 방법이 적어도 하나 있습니다.

  1. 공간을 섹터로 분할하십시오 (예를 들어, 면적이 100 x 100이고이 태양계를 100 개 생성 한 다음 10 x 10 그리드 그리드로 분할해야하는 경우)

  2. 각 섹터를 반복하고 3 단계를 반복합니다 (4 단계를 여러 번 반복 함)

  3. 현재 태양계에 대한 행성의 수를 무작위로 결정하십시오 (예를 들어, 3 ~ 7 개의 행성 범위의 경우, 0에서 4 사이의 임의의 숫자를 획득하고 3을 추가하십시오). 섹터의 시스템, 여기에 다른 루프를 설정하십시오)

  4. 루프로 식별 된 현재 태양계 내에서 행성을 무작위로 할당하십시오 (행성 사이의 최소 거리를 늘리기 위해 임의의 숫자를 사용할 수도 있습니다). 여기에서 행성의 종류를 결정할 수 있으며, 다양한 무게 또는 선호하는 방법으로 임의로 결정할 수 있습니다.

또한 인접 섹터의 행성들이 서로 무작위로 효과적으로 위치하는 경우를 막기 위해 각 섹터의 가장자리 주위에 "범위를 벗어난"영역을 정의 할 수도 있습니다. ..

다른 해결책은 각 태양계 및 / 또는 각 행성의 위치를 ​​결정하는 지점에있을 수 있으며, 인접 섹터에 대해 빠른 근접 검사를 실행하고 그에 따라 조정합니다 (예 : 최소 거리 + 임의 거리만큼 가장자리에서 멀어 지도록 이동). ).


천만에요! 문제를 해결 한 것에 대한 후속 조치를 게시 한 +1입니다. =)
Randolf Richardson

8

고른 분포를 보장하는 가장 좋은 방법은 각 노드를 일종의 물리적 입자로 취급하는 것입니다. 먼저 연속 (부동 소수점) xy 평면에 대한 임의 분포를 수행합니다. 평면에서 각각의 개별 입자 쌍 사이에 반발력을 가하면 천천히 퍼지는 것을 알 수 있습니다. 어떤 의미에서 그것은 충돌 해결과 같으며 실제로 말할 접촉은 없습니다. 그런 다음 해당 평면을 정수 인덱스 그리드로 다시 변환 ( "래스터 화")하는 것이 간단합니다. 정수 인덱스 그리드에서 간단히 시작할 수 있지만, "좋은"것을 얻는 것은 조금 더 어려울 수 있습니다. 이것은 그리드의 해상도가 얼마나 높은지에 따라 다릅니다 ... 높을수록 좋습니다. 이 경우

분명히 정사각형 평면의 가장자리에서 일종의 힘을 적용하고 싶거나 "해안에서 씻겨지는"입자가 많이있을 수 있습니다. 또는 필요한 것보다 훨씬 큰 필드를 만든 다음 작은 영역의 스냅 샷을 찍으면 위에서 언급 한 문제를 피할 수 있습니다.

클러스터링 발생 하는 것과 반대되는 것을 원할 경우 "표준"또는 "가우시안"분포를 살펴보십시오. 이것이 무작위로 생성 된 스타 필드가 종종 가짜로 보이는 이유입니다. 그들은보다 자연적인 분포 모델보다는 순수한 무작위 분포를 사용합니다.


1
"물리"모델에서 클러스터링 동작을 얻을 수도 있습니다. 어트랙션과 반발을 혼합하여 다른 규칙 집합을 사용해야합니다. 옵션은 끝이 없습니다. 올바른 모델을 찾기 만하면됩니다.
aaaaaaaaaaaa

6

간단한 포아송 디스크 분배 알고리즘 을 사용하여 "블루 노이즈"분배를 얻을 수 있습니다. 이로 인해 평면에서 점들이 서로 똑같이 떨어져 있습니다. 이것은 2D 예제뿐만 아니라 3D에서도 작동하며 비 유클리드 공간에서도 작동하지만 계산이 빨리 다루기 어려워 질 수 있습니다.

이 알고리즘의 기본 아이디어는 첫 번째 "시드"지점으로 시작한 다음 지점에서 원하는 최대 거리와 최소 거리 사이의 고리에 임의의 또는 임의의 의사 난수 점을 추가하여 바깥쪽으로 작업하고 제거하는 것입니다. 서로 너무 가까이있는 것들. 그런 다음 알고리즘은 필요한 점이 추가되거나 (대략 원형 점 구름이 생길 때) 사용 가능한 공간이 채워질 때까지 이러한 방식으로 바깥쪽으로 작동합니다.

2D 노이즈 생성을위한 빠르고 우아한 대안 알고리즘과 그 속성에 대한 간단한 설명은 Daniel Dunbar와 University의 Greg Humphreys의 " 빠른 포아송 디스크 샘플 생성을위한 공간 데이터 구조 "에서 찾을 수 있습니다. 버지니아.


2
포아송 디스크 배포판에 대해 들어 본 적이 없습니다.
tenpn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.