Zakładając, że masz w sumie mapę heksadecynalną n
komórek i p
graczy, p <= n
najlepszym sposobem na rozwiązanie tego problemu jest dystrybucja typu round-robin za pomocą automatów komórkowych (CA).
Inicjalizacja
Losowo (i / lub przy użyciu niektórych lub innych metod heurystycznych, takich jak odległość od centrum mapy) wybierz komórkę początkową dla każdego gracza. Ponieważ p <= n
nie powinno to stanowić problemu.
Automaty komórkowe
Potrzebujesz pełnej łączności między komórkami heksadecymalnymi. Sugerowałbym tablicę 6 sąsiadów na komórkę:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
Zastosowanie tablic o stałym rozmiarze pozwala istnieć pojęcie kierunków topograficznych między komórkami, czego nie byłoby w przypadku listy lub wektora. Polecam to, ponieważ może to ułatwić pewne operacje nawigacyjne.
Możesz także przechowywać mapę heksadecymalną w układzie 2D z przesunięciami na wiersz. Może to być jednak nieco mniej intuicyjne niż przechowywanie sąsiedniej tablicy na komórkę, tylko ze względu na geometryczne przesunięcie w każdym innym rzędzie.
Upewnij się, że każda komórka jest podłączona do wszystkiego, co jest sąsiadem. Możesz zrobić ten wiersz po rzędzie, komórka po komórce podczas generowania pełnej mapy heksadecymalnej. PS Jeśli ostatecznie chcesz uzyskać mapę heksadecymalną, która nie jest prostokątna, możesz po prostu usunąć pojedyncze komórki i odniesienia do tych komórek, aby utworzyć ujemne przestrzenie, umożliwiając utworzenie konturu mapy organicznej.
Round-robin Distribution
Pseudo kod:
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
Algorytm ten da każdemu graczowi szansę na powiększenie swojego terytorium o jeden, w sposób okrągły, pod warunkiem, że na terytorium gracza nadal znajduje się ważna przestrzeń do uprawy. Jeśli pewne gracze są zablokowane rośnie dalej, algorytm będzie mimo to nadal rosnąć terytoria graczy, którzy nie mają jeszcze ważne miejsca rośnie. Możesz z łatwością ograniczyć każdego gracza do tej samej liczby komórek, jak tylko jedna z nich osiągnie limit, ale powinno to być na tyle łatwe, abyś mógł się zorientować, jeśli chcesz.
Zapewni to maksymalne rozmiary „terytoriów macierzystych” dla każdego gracza. Jeśli chcesz mieć dodatkowo terytoria wyspiarskie, w celu wypełnienia limitu liczby komórek dla tego gracza, gdy graczowi zabraknie miejsca na rozwój, możesz wybrać nową komórkę początkową z neutralnej listy komórek i stamtąd kontynuuj ten sam proces „wzrostu”. W ten sposób uzyskasz spójne zestawy wysp dla każdego gracza, a nie losowy hałas.