가정 당신의 hexmap이 n
총 세포 및 p
플레이어, p <= n
이 문제를 해결하기 위해 할 수있는 가장 좋은 방법은 통해, 라운드 로빈 분배 를 통해 셀룰러 오토마타 (CA)을.
초기화
무작위로 (및 / 또는지도 중심으로부터의 거리와 같은 일부 또는 다른 휴리스틱을 사용하여) 각 플레이어의 시작 셀을 선택합니다. 이후 p <= n
문제가되지 않습니다.
세포 성 오토마타
16 진수 셀간에 완전한 연결이 필요합니다. 셀 당 6 이웃 배열을 제안합니다.
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
고정 크기 배열을 사용하면 셀 사이의 지형 방향 개념이 존재할 수 있으며 목록이나 벡터는 그렇지 않습니다. 특정 탐색 작업을 더 쉽게 할 수 있으므로 권장합니다.
hexmap을 행당 오프셋과 함께 2D 배열에 저장할 수도 있습니다. 그러나 이것은 셀마다 이웃 배열을 저장하는 것보다 약간 직관적이지 않을 수 있습니다. 다른 모든 행의 기하학적 오프셋 때문입니다.
모든 셀이 이웃에있는 모든 것에 연결되어 있는지 확인하십시오. 전체 헥스 맵을 생성 할 때 행 단위, 셀 단위로이 행을 수행 할 수 있습니다. PS 직사각형이 아닌 경계로 된 16 진수 맵을 원한다면 개별 셀과 해당 셀에 대한 참조를 제거하여 음수 공간을 형성하여 유기적 인 맵 개요를 만들 수 있습니다.
라운드 로빈 배포
의사 코드 :
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
이 알고리즘은 플레이어의 영토에 여전히 유효한 성장 공간 이있는 경우 각 플레이어에게 라운드 로빈 방식으로 영토를 하나씩 성장시킬 수있는 기회를 제공합니다 . 특정 선수가 더 성장하고 차단하는 경우, 알고리즘은이에도 불구하고 선수들의 영토 계속 증가 할 것입니다 않는 여전히 유효 성장 공간이있다. 한 플레이어가 한도에 도달하자마자 모든 플레이어를 같은 수의 셀로 쉽게 제한 할 수 있지만 원하는 경우 쉽게 알아낼 수 있어야합니다.
이것은 각 플레이어에 대해 최대 크기의 "가정 영토"를 제공합니다. "아일랜드"지역을 추가하고 싶은 경우 해당 플레이어의 셀 수 할당량을 충족하기 위해 플레이어가 성장할 로컬 공간이 부족하면 중립 셀 목록에서 새 시작 셀을 선택할 수 있습니다. 거기에서 같은 "성장"과정을 진행하십시오. 이 방법을 사용하면 임의의 노이즈가 아닌 각 플레이어마다 크기가 크고 일관된 섬 세트가 생깁니다.