Beste Weg, um eine Dreieckige/Hexagonal Grid in Python
Mache ich ein Spiel mit sechseckigen Fliesen, und haben beschlossen, mit einem dreieckigen/hexagonal grid. Ich fand diese Frage, die mir geholfen generieren-Koordinaten und leicht modifiziert den code zum speichern der Koordinaten als Schlüssel in einem dictionary mit Werten von entweder "." (Boden) oder "X" (Wand) und enthalten eine Funktion druckt eine string-Darstellung der Karte, wo jede nicht-leere Zeichen repräsentiert eine sechseckige Fliese. Dies ist der neue code:
deltas = [[1,0,-1],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,-1,0]]
class HexGrid():
def __init__(self, radius):
self.radius = radius
self.tiles = {(0, 0, 0): "X"}
for r in range(radius):
a = 0
b = -r
c = +r
for j in range(6):
num_of_hexas_in_edge = r
for i in range(num_of_hexas_in_edge):
a = a+deltas[j][0]
b = b+deltas[j][1]
c = c+deltas[j][2]
self.tiles[a,b,c] = "X"
def show(self):
l = []
for y in range(20):
l.append([])
for x in range(60):
l[y].append(".")
for (a,b,c), tile in self.tiles.iteritems():
l[self.radius-1-b][a-c+(2*(self.radius-1))] = self.tiles[a,b,c]
mapString = ""
for y in range(len(l)):
for x in range(len(l[y])):
mapString += l[y][x]
mapString += "\n"
print(mapString)
Mit diesem code kann ich erzeugen, die Koordinaten innerhalb des radius wie folgt:
import hexgrid
hg = hexgrid.HexGrid(radius)
sowie Zugang zu einer Koordinate so:
hg.tiles[a,b,c]
Dies scheint zu funktionieren für jetzt, aber ich bin sicher, es muss einige Nachteile zu speichern, die Karte auf diese Weise. Wenn es keine Nachteile, könnte Sie bitte zeigen Sie Sie aus, und vielleicht präsentieren Sie einen besseren Weg, um zu speichern der Karte? Vielen Dank für Ihre Zeit.
- Was sind a, b und c? Ist das in 3D?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem array für die Speicherung können sparen Sie einige Zeit von der CPU, aber der Unterschied ist vermutlich vernachlässigbar.
Jedoch, Sie fehlten, eine sehr einfache Möglichkeit, solch eine Karte. Betrachten Sie die Zeilen und Spalten, nur die Zellen haben leicht unterschiedliche Formen.
Oder Sechsecke:
Dann können Sie speichern die Daten nur als reguläre 2D-array. Ungerade Zeilen-offset .5 auf der rechten Seite, und Sie müssen herausfinden, das neighborship Schritte für
X
: oben:A = (0,-2)
, oben rechts:B = (1,-1)
, unten rechts:C = (1,1)
unten:D = (0,2),
unten Links:E = (0,1)
oben Links:F = (0,-1)
Wenn Sie ok mit, verschwendet wenig Speicher, Sie können auch jede andere Spalte ist leer und das neighborship wird ein bisschen einfacher:
(0,-2), (1,-1), (1,-1), (0,-2), (-1,-1), (-1,1)
Ich einige der Forschung zu, und fand einen weit einfacheren Weg, es zu tun. Sie müssen nicht zu bekommen, wie kompliziert, wie Sie tun! Die Tabelle kann ein einfaches array von Arrays, ohne Besondere Regeln.
Möchten Sie verwenden eine sechseckige root-coordonate system. Siehe hier die these : https://en.wikipedia.org/wiki/Root_system . Auch https://www.redblobgames.com/grids/hexagons/
Die Zelle (0,0) befindet sich im Zentrum der Struktur, dann haben sechs Nachbarn : wie in der bekannten orthogonalen Tabelle (1,0), (0,1), (-1,0), (0,-1) aber auch (1,1) , (-1-1). Andere Zelle in ähnlicher Weise sechs Nachbarn, keine Notwendigkeit von modulo!
Hier einige Ascii-Kunst für beter Verständnis:
Können Sie berechnen die position der Mitte jeder Zelle in der Ebene (also in den Bildschirm), denn es folgt den Regeln der vektoriellen geometrie. Der Vektor die Koordinaten, die in 60° statt 90° : a=(0,1) aber b=(0,87,0.5), multiplizieren Sie einfach und fügen Sie Thesen Koordinaten!
Den Sie verwenden möchten, können Sie die pyhton ' librairy Hexy : https://github.com/RedFT/Hexy
Nicht verwenden, hg.Fliesen[a,b,c].
Machen Fliesen eine drei-dimensionale Liste von diesem Weg
hg.tiles = [[[z for z in range(10)] for y in range(10)] for x in range(10)]
jetzt können Sie auf eine Kachel mit
hg.tiles[a][b][c]
PS:
a = a+deltas[j][0]
solltea += deltas[j][0]
und so weiter für die anderen AufgabenVielleicht der beste Weg, um Ihre hexenzauber wird in einer python-Liste oder Tupel, die Herausforderung wird dann, wie das abrufen einer bestimmten hex aus Ihrer Liste. In python, ein guter Weg das zu tun ist, bauen ein Wörterbuch der hex-Koordinaten als Schlüssel mit einer Liste von Indizes (oder hex-Objekte) als Werte. Angenommen, Ihre Liste der Felder nicht ändern müssen, die Liste kann umgewandelt werden in ein Tupel, wenn Sie fertig sind. Und wenn Sie speichern hex-Objekte als Werte im Wörterbuch, können Sie verzichten auf das speichern der Liste ganz; das Wörterbuch maps hex-Koordinaten zu den Objekten direkt.
Ihren code bereits erzeugt eine Folge von hex-Koordinaten nur speichern Sie Sie in einer Liste und bauen Sie Ihre Referenz-Wörterbuch zur gleichen Zeit. Auch, wenn Sie Programmieren eine Klasse zum verwalten Ihres Spielplan, alle details der Speicherung und abrufen können versteckt werden, in der Klasse.
Code: