Angenommen, ich baue ein Brettspiel mit einem Hextilgitter wie Settlers of Catan :
Beachten Sie, dass jeder Scheitelpunkt und jede Kante ein Attribut haben kann (eine Straße und eine Siedlung oben).
Wie würde ich eine Datenstruktur erstellen, die diese Karte darstellt? Welche Muster gibt es für den Zugriff auf die Nachbarn, Kanten und Eckpunkte der einzelnen Kacheln?
data-structures
ein bezahlter Nerd
quelle
quelle
Antworten:
Amit Patel hat eine erstaunliche Seite zu diesem Thema gepostet . Es ist so umfassend und wunderbar, dass es die endgültige Antwort auf diese Frage sein muss: Sechseckige Gitter
quelle
Ein solches Gitter kann in einem zweidimensionalen Array dargestellt werden:
Wenn
ist die Nummer eins mit ihren Nachbarn im Hex-Raster, dann können Sie dies wie folgt in ein 2D-Array einfügen:
Offensichtlich wird die Nachbarschaft in diesem Gitter nicht nur dadurch bestimmt, dass sie horizontal oder vertikal benachbart ist, sondern auch unter Verwendung einer Diagonale.
Sie können jedoch auch ein Diagramm verwenden, wenn Sie möchten.
quelle
In diesem Artikel wird beschrieben, wie Sie ein isomeres / hexagonales Rasterspiel einrichten. Ich empfehle Ihnen, sich den
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
Abschnitt und den Bewegungsabschnitt anzusehen . Obwohl es sich von dem unterscheidet, wonach Sie suchen, kann es Ihnen helfen, zu formulieren, wie Sie das tun, was Sie wollen.quelle
Ich habe mich viel mit Hexen beschäftigt. In solchen Fällen verfolgen Sie jeden der 6 Punkte für die Ränder des Hexfelds. Auf diese Weise können Sie es ganz einfach zeichnen.
Sie hätten ein einzelnes Array von Objekten, die Hexes darstellen. Jedes dieser Hex-Objekte hat auch 6 "Zeiger" (oder einen Index auf ein anderes Array), die auf ein anderes Array von "Seiten" zeigen. Gleiches gilt für "Eckpunkte". Natürlich hätten die Eckpunkte 3 Zeiger auf die angrenzenden Felder, und die Seiten hätten 2.
Ein Hex kann also so etwas wie X, Y, Punkt (6), Eckpunkte (6), Seiten (6) sein.
Dann haben Sie ein Hex-Array, ein Vertice-Array und ein Side-Array.
Dann ist es ziemlich einfach, die Eckpunkte / Seiten für ein Hex oder was auch immer zu finden.
Wenn ich Zeiger sage, kann es genauso gut eine Ganzzahl sein, die auf das Element im Scheitelpunkt oder im Seitenarray oder was auch immer zeigt. Und natürlich können Arrays Listen sein oder was auch immer.
quelle
Sie können auch versuchen, Zeilen Ihrer Karte "flach" zu machen. Für dieses Beispiel wäre es:
Es ist manchmal nützlicher, Zeilen in einer Zeile zu haben: P.
quelle
Ich würde Folgendes vorschlagen (ich verwende Deklarationen im Delphi-Stil):
Jedes Hex hat sechs Kanten und sechs Eckpunkte. Jede Kante verfolgt die beiden benachbarten Felder, und jeder Scheitelpunkt verfolgt die drei benachbarten Felder (Hexfelder an den Kanten der Karte sind ein Sonderfall).
Es gibt viele Dinge, die Sie natürlich anders machen könnten. Sie könnten Zeiger anstelle von Arrays verwenden, Sie könnten Objekte anstelle von Datensätzen verwenden und Sie könnten Ihre Hexes in einem zweidimensionalen Array speichern, wie andere Antwortende vorgeschlagen haben.
Hoffentlich gibt Ihnen das einige Ideen, wie Sie es angehen können.
quelle
Wir haben einen Siedler von Catan AI für ein Klassenprojekt implementiert und den Code aus dieser Antwort (die fehlerhaft war) geändert , um ein Board mit konstantem zeitlich zufälligem Zugriff auf Eckpunkte und Kanten zu erstellen. Es war ein lustiges Problem, aber das Board hat viel Zeit in Anspruch genommen. Für den Fall, dass noch jemand nach einer einfachen Implementierung sucht, ist hier unser Python-Code:
quelle
Ich sitze hier "in meiner Freizeit zum Spaß" mit Hexen. Und es geht so ... Ich werde Ihnen sagen, wie es in Worten aussieht.
Dies ist nur eine Idee, wie ich daran arbeiten würde.
quelle
Sie können ein 2D-Array erstellen und dann die gültigen Positionen wie folgt betrachten:
Für jede Zelle wären ihre Nachbarn:
Abbildung: Hex Grid
Die x-Markierungen sind Hexen. x, die diagonal zueinander sind, sind Nachbarn. | verbindet vertikale Nachbarn.
quelle