Ich mache ein einfaches Hex-Grid-basiertes Spiel und möchte, dass die Karte gleichmäßig unter den Spielern aufgeteilt wird. Die Karte wird zufällig erstellt, und ich möchte, dass die Spieler ungefähr die gleiche Anzahl von Zellen mit relativ kleinen Flächen haben. Wenn sich beispielsweise vier Spieler und 80 Zellen auf der Karte befinden, hat jeder der Spieler ungefähr 20 Zellen (es muss nicht genau auf den Punkt genau sein). Jeder Spieler sollte nicht mehr als vier benachbarte Zellen haben. Das heißt, wenn die Karte generiert wird, können die größten "Stücke" nicht mehr als vier Zellen pro Stück sein.
Ich weiß, dass dies nicht immer für zwei oder drei Spieler möglich ist (da dies dem Problem "Färben der Karte" ähnelt), und ich bin damit einverstanden, andere Lösungen für diese zu finden (z. B. Karten zu erstellen, die das Problem lösen). Aber wie könnte ich für vier bis acht Spieler dieses Problem angehen?
quelle
Antworten:
Das würde ich tun:
quelle
Angenommen, Sie haben eine Hexmap von
n
Zellen insgesamt und vonp
Spielern, bei denen diesp <= 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:
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:
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.
quelle
n
, und widersprechen sich dann selbst, indem Sie sagen, dass Sie "keinen Weg sehen", und ich "erwähne [wie man Inseln bekommt] im späteren Text". Habe ich oder habe ich die Frage nicht beantwortet? Dieser verallgemeinerte Algorithmus kann verwendet werden, um entweder Zellen zu streuen (durch Beschränkungn
auf 1) oder Inseln zu erzeugen (durch Setzen von n> 1). Sie haben also in einem einzigen Algorithmus nicht nur die Möglichkeit zu streuen, sondern auch zu gruppieren. Wie beantwortet dies nicht die Frage des OP? Wie ist es eines Downvotes wert?Ein anderer Ansatz wäre, mit einer Verteilung zu beginnen, die "fair", aber regelmäßig ist, und dann einen Ansatz zu verwenden, der dem simulierten Glühen ähnelt, um die Regelmäßigkeit zu unterbrechen, ohne die Fairness zu verlieren:
Das Wichtigste dabei ist, dass Sie durch das Vertauschen von zwei Punkten die Farben niemals aus dem Gleichgewicht bringen. Ebenso wird durch den Test, den Sie vor Abschluss des Austauschs durchführen, sichergestellt, dass Sie niemals zu große Bereiche erstellen. Wenn Sie die Möglichkeit haben, Ihr Raster anzuzeigen, können Sie diesen Vorgang sogar visualisieren, um zu beobachten, wie es seine Regionen durch die wiederholten Auslagerungen "aufbaut".
Wenn Sie übrigens nicht mit einer gleichverteilten regulären Färbung beginnen können, sollten Sie dennoch in der Lage sein, etwas Ähnliches zu tun, um die Färbung gleich zu verteilen: Während Ihre Färbung nicht gleichverteilt ist, wählen Sie ein Element nach dem Zufallsprinzip aus; Wenn es sich dann um eine der überrepräsentierten Farben handelt, stellen Sie die Farbe vorläufig auf eine der unterrepräsentierten Farben ein und stellen Sie dann sicher, dass kein zu großer Bereich der neuen Farbe erstellt wird.
quelle