답변:
Lloyd 's Algorithm 을 사용해 보셨습니까 ? 절차는 매우 간단하며 실행 횟수에 따라 상당히 규칙적으로 보이는 영역을 생성합니다.
멋진 맵을 만들기 위해 아주 오래 실행할 필요는 없습니다. 이 예 에서는 세 번만 반복하면됩니다.
시도 할 수있는 간단한 방법입니다.
n
. 각각은 그룹을 시작합니다.나는 테스트하지 않았지만 이것은 제도를 생성하고 다소 긴 괄호를 피해야합니다. 또한 이웃 경계가있을 가능성이 높지만 반드시 각 경계선이 서로 접촉 할 필요는 없으며 밀도는의 값에 따라 다릅니다 n
.
일부 그룹은 다른 그룹에 의해 코너링되어 20 개 미만의 크기에 도달 할 수 있습니다. 스타터 헥스를 최소 간격으로 생성하여 공간을 확보 할 수 있습니다.
필요에 따라 테스트하고 조정하십시오.
: 또한이 문제와 관련이없는 있지만, 칸 작업에 매우 유용합니다,이 페이지를 방문 http://www.redblobgames.com/grids/hexagons/#basics를
그것으로 하나의 장소에서 진수 정보의 전체 무리를 집계 좋은 시각.
나는 확실히 어떤 유형의 그래프 구조가 이것을 가능하게 할 것이라고 생각합니다. 기본적으로 전체 맵을 시뮬레이트하기 위해 두 개의 Hex 노드가 서로 옆에 있으면 가장자리를 만듭니다. 그러나 해당지도 내에서 "국가"를 생성하는 정확한 알고리즘을 잘 모르겠습니다. 문제는 국가가 어떻게 "보고"원하는지에 따라 다른 알고리즘이 필요하다는 것입니다.
내 머리 꼭대기에서, 나는 포인트를 고르고 거기에서 바깥쪽으로 이동하여 나라의 일부가 아닌 인접한 타일이있는 "성장하는 국가"에서 무작위 타일을 선택하는 것이 좋습니다.
전략 유형을 사용하여 원하는 국가 유형에 따라 알고리즘을 전환 할 수 있습니다. http://en.wikipedia.org/wiki/Strategy_pattern 즉, 칠레처럼 얇은 해안선 국가를 원하십니까? 아니면 더 둥글고 포함 된 것을 원하십니까?
그래프 속성을 사용하면 최종 "국가"모양을 조정할 수 있습니다. http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)
큰 나라를 원하십니까? 그래프 속성을 조정하고 생성 된 국가 (단지 그래프)가 원하는 "모양"을 제공하는 속성을 갖도록합니다.
마지막으로 그래프는 국가 간 경계를 정의하는 데 매우 유용합니다. 국가가 서로 경계가있는 경우 두 노드 사이에 연결된 그래프를 작성할 수 있습니다. 게임에서 어떤 유형의 파티셔닝에 유용 할 수 있으며 개발 과정에서 특정 사항을 더 최적화 할 수 있습니다.
작은 메모 : '모양이 다르지만 크기가 같은 국가를 가진 실제지도처럼 보인다'고 말하지만 '실제'국가는 특정 지역 내에서도 크기가 크게 다릅니다. 유럽의 '대규모'국가조차도 예를 들어 프랑스는 이탈리아보다 두 배 이상 큽니다. 그렇게 말하면, 크기를 대략 동일하게 유지하려고 시도하는 게임 플레이 영역이 있습니다. 여기서 약간의 변형이 아마도 좋은 것입니다!
이 문제에 대한 나의 초기 접근 방식은 귀하의 지역을 '성장'하는 대신 '진화'하는 것입니다.
이제 원하는만큼 다음 의사 코드를 실행하십시오.
Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
change hex B to belong to A's country;
} else {
flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
undo and reject this move;
} else {
update the boundary list around the changed hex and its neighbors;
}
이렇게하면 두 이웃 국가의 규모가 대략적으로 균형을 유지하게되며 '단순한 홍수 채우기 알고리즘으로 수행 할 수있는'연결이 끊어진 '검사를 통해 국가가 부서지지 않도록 할 수 있습니다. 바운더리리스트를 업데이트하는 것은 일정한 시간 작업입니다. 변경된 16 진수는 항상 바운더리에있을 것입니다. 6 개의 이웃을 검사하여 그중 하나가 바운더리 셀이되었는지 확인할 수 있습니다. 필요에 따라 경계 세트를 수정하여 (이웃 국이 같은 국가에 있기 때문에) 다른 국가) 또는 경계 셀이 중지되었습니다.
이 접근 방식을 개선하기 위해 두 국가를 항상 '균형 조정'하지 않고 16 진수로 무작위로 변경하는 조건을 만들 수도 있습니다. 항상 특정 확률로 스왑을 만들고 점차 그 확률을 감소시킬 수 있습니다 시간 (냉각 과정과 유사 시뮬레이션 어닐링 알고리즘 )이 거의 동일한 크기가되도록 시작합니다.
이것은 모든 영역이 정확히 동일한 크기를 보장하지는 않으며 (N이 그리드 크기를 완벽하게 나누지 않는 한 불가능합니다) 모든 국가가 영역에서 서로 16 진수 내에 있다고 보장하지는 않습니다. 그러나 각 국가가 바로 인접한 각 국가보다 크거나 작지 않다는 것을 보장 해야합니다 (충분한 반복으로 실행).