Angenommen, Sie haben eine Hexmap von n
Zellen insgesamt und von p
Spielern, bei denen dies p <= n
am besten durch Round-Robin-Verteilung über zellulare Automaten (CA) gelöst werden kann .
Initialisierung
Wählen Sie nach dem Zufallsprinzip (und / oder unter Verwendung irgendeiner oder anderer Heuristik, z. B. Entfernung vom Kartenmittelpunkt) eine Startzelle für jeden Spieler. Da p <= n
sollte dies kein Problem sein.
Zelluläre Automaten
Sie benötigen vollständige Konnektivität zwischen Ihren Hex-Zellen. Ich würde ein Array mit 6 Nachbarn pro Zelle vorschlagen:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
Durch die Verwendung von Arrays mit fester Größe kann das Konzept der topografischen Richtungen zwischen Zellen erstellt werden, die in einer Liste oder einem Vektor nicht vorhanden sind. Ich empfehle dies, da es bestimmte Navigationsoperationen erleichtern kann.
Sie können Ihre Hexmap auch in einem 2D-Array mit Offsets pro Zeile speichern. Dies ist jedoch möglicherweise etwas weniger intuitiv als das Speichern eines Nachbar-Arrays pro Zelle, nur aufgrund des geometrischen Versatzes in jeder zweiten Zeile.
Stellen Sie sicher, dass jede Zelle mit allem verbunden ist, was ein Nachbar ist. Sie können dies Zeile für Zeile und Zelle für Zelle tun, während Sie die vollständige Hexmap generieren. PS Wenn Sie letztendlich eine nicht rechteckig begrenzte Hexmap möchten, können Sie einfach einzelne Zellen und Verweise auf diese Zellen entfernen, um negative Leerzeichen zu bilden, sodass Sie einen organischen Kartenumriss erstellen können.
Round-Robin-Verteilung
Pseudocode:
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
Dieser Algorithmus gibt jedem Spieler die Möglichkeit, sein Territorium in einem Round-Robin-Verfahren um eins zu vergrößern, vorausgesetzt, das Territorium des Spielers verfügt noch über einen gültigen Erweiterungsbereich. Wenn bestimmte Spieler daran gehindert werden, weiter zu wachsen, vergrößert der Algorithmus trotzdem weiterhin das Territorium der Spieler, die noch über gültigen Wachstumsraum verfügen. Sie könnten jeden Spieler leicht auf die gleiche Anzahl von Zellen beschränken, sobald eine von ihnen ein Limit erreicht, aber das sollte leicht genug für Sie sein, um es herauszufinden, falls dies gewünscht wird.
Dies wird für jeden Spieler "Heimatgebiete" von maximaler Größe bereitstellen. Wenn Sie zusätzlich "Inselgebiete" haben möchten, um die Zellenzahlquote für diesen Spieler zu erfüllen, können Sie, sobald ein Spieler nicht mehr über genügend lokalen Speicherplatz verfügt, eine neue Startzelle aus der Liste der neutralen Zellen auswählen und Fahren Sie von dort aus mit demselben "Wachstumsprozess" fort. Auf diese Weise erhalten Sie für jeden Spieler eine ansehnlich große, zusammenhängende Inselgruppe und kein zufälliges Rauschen.