Ich arbeite derzeit an einem Karteneditor für ein Spiel in Pygame, der Kachelkarten verwendet. Das Level besteht aus Blöcken in der folgenden Struktur (obwohl viel größer):
level1 = (
(1,1,1,1,1,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,1,1,1,1,1))
Dabei ist "1" ein Block, der eine Wand ist, und "0" ist ein Block, der leere Luft ist.
Der folgende Code behandelt im Wesentlichen die Änderung des Blocktyps:
clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
Da die Ebene jedoch in einem Tupel gespeichert ist, kann ich die Werte der verschiedenen Blöcke nicht ändern. Wie ändere ich auf einfache Weise die verschiedenen Werte in der Ebene?
//
anstatt nur,/
weil in Python 3/
eine Gleitkommadivision durchgeführt und Ihr Code durcheinander gebracht wird.Antworten:
Tupel in Liste konvertieren:
Liste in Tupel konvertieren:
quelle
p list(...)
stattdessen ausführen .Sie haben ein Tupel von Tupeln.
So konvertieren Sie jedes Tupel in eine Liste:
--- ODER ---
Und nachdem Sie mit der Bearbeitung fertig sind, konvertieren Sie sie einfach zurück:
--- ODER --- (Danke @jamylak)
Sie können auch ein Numpy-Array verwenden:
Zum Manipulieren:
quelle
Sie können eine Liste von Listen haben. Konvertieren Sie Ihr Tupel von Tupeln in eine Liste von Listen mit:
oder
und ändern Sie sie entsprechend.
Aber ein numpy Array ist cooler.
quelle
Tupel in Liste konvertieren
(In der angegebenen Frage fehlten Kommas zwischen den Tupeln. Sie wurden hinzugefügt, um eine Fehlermeldung zu vermeiden.)
Methode 1:
Methode 2:
Methode 1 dauerte --- 0,0019991397857666016 Sekunden ---
Methode 2 dauerte --- 0,0010001659393310547 Sekunden ---
quelle
Warum versuchen Sie nicht, seinen Typ von einem Tupel in eine Liste zu konvertieren und umgekehrt?
quelle
Beide Antworten sind gut, aber ein kleiner Rat:
Tupel sind unveränderlich, was bedeutet, dass sie nicht geändert werden können. Wenn Sie also Daten bearbeiten müssen, ist es besser, Daten in einer Liste zu speichern, um unnötigen Overhead zu reduzieren.
In Ihrem Fall extrahieren Sie die Daten in eine Liste, wie von eumiro gezeigt, und erstellen Sie nach dem Ändern ein ähnliches Tupel mit ähnlicher Struktur wie die Antwort von Schoolboy.
Auch wie vorgeschlagen ist die Verwendung von Numpy Array eine bessere Option
quelle
numpy
die die schnellste Lösung für die Arbeit mit dieser Art von Daten bietet.Die Liste zu Tupel und zurück kann wie folgt erfolgen
quelle
Sie könnten Ihre Inhalte erheblich beschleunigen, wenn Sie nur eine Liste anstelle einer Liste von Listen verwenden. Dies ist natürlich nur möglich, wenn alle Ihre inneren Listen dieselbe Größe haben (was in Ihrem Beispiel zutrifft, also nehme ich dies einfach an).
Und Sie könnten noch schneller sein, wenn Sie ein Bitfeld anstelle einer Liste verwenden:
mit
Aber das funktioniert nur, wenn Ihre Felder natürlich nur 0 oder 1 enthalten. Wenn Sie mehr Werte benötigen, müssen Sie mehrere Bits kombinieren, was das Problem erheblich komplizierter machen würde.
quelle