Listen über ein Dictionary ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo zusammen,

ich versuche mich immer noch an einer OOP-Version eines Rubiks Cubes. Dazu habe ich eine Klasse geschrieben, die jedem Stein ein Objekt mit mehreren Eigenschaften zuweist. Zur Zeit bin ich mir auch noch etwas unsicher, ob das sinnvoll oder einfach nur kompliziert ist, aber als Übung ist es bestimmt nicht ganz verkehrt...

Jetzt muss ich mir den Würfel natürlich auch anzeigen lassen können und muss dafür die Position der Steine den einzelnen Feldern der sechs Seiten zuweisen. Eigentlich muss ich noch ein paar Sachen mehr beachten, aber die Sachen spielen bei dem Problem erstmal keine Rolle.
Zum Zuweisen könnte ich für jede Position eine IF-Bedingung erstellen, wie hier in Kurzform für den Kantenstein Frontseite oben mitte. Die [45, 0] sind Raumwinkel, die die Position des Steins beschreiben:

Code: Alles auswählen

up = [[0, 0, 0], [0, 'y', 0], [0, 0, 0]]
front = [[0, 0, 0], [0, 'r', 0], [0, 0, 0]]

edgeblock = [45, 0]

if edgeblock == [45, 0]:
    up[2][1] = 1
    front[0][1] = 2

print(up)
print(front)
Das funktioniert zwar, aber dann hätte ich 20 IF-Bedingungen (je einen für einen Eck- bzw. Kantestein) hintereinander, was ich nicht sehr schön finde...
Meine erste Idee war jetzt das ganze über ein Dictionary zu lösen, da ich das sehr übersichtlich finde:

Code: Alles auswählen

up = [[0, 0, 0], [0, 'y', 0], [0, 0, 0]]
front = [[0, 0, 0], [0, 'r', 0], [0, 0, 0]]

edgeblocks = {(45, 0):[up[2][1], front[0][1]]}

edgeblocks[45, 0][0] = 1
edgeblocks[45, 0][1] = 2

print(up)
print(front)
Aber natürlich funktioniert das so nicht, da ich die Werte '1' und '2' nicht den Seiten 'up' und 'front', sondern dem Dictionary zuweise. Leider fällt mir aber keine andere Lösung ein.
Kennt jemand eine Möglichkeit oder Datenstruktur mit der sich das schön lösen lässt?

Schon einmal vielen Dank für eure Zeit.
BlackJack

@Zizibee: Ich habe jetzt so überhaupt nicht über die Datenstruktur nachgedacht, sondern mich einfach nur an Deinem Code orientiert. Suchst Du so etwas?

Code: Alles auswählen

def main():
    up = [[0, 0, 0], [0, 'y', 0], [0, 0, 0]]
    front = [[0, 0, 0], [0, 'r', 0], [0, 0, 0]]
    sides = [up, front]
     
    edgeblocks = {(45, 0): ((2, 1), (0, 1))}
    
    indices = edgeblocks[45, 0]
    for i, (side, (index_a, index_b)) in enumerate(zip(sides, indices), 1):
        side[index_a][index_b] = i
     
    print(up)
    print(front)


if __name__ == '__main__':
    main()
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

@BlackJack: Danke für die Antwort! Was du so alles in den Kopf einer for-Schleife unter bekommst :)
Leider habe ich da bei meinem Beispiel wohl etwas zu viel gekürzt. Da der Index nicht benötigt wird, auch wenn es in meinem Beispiel anders aussah, habe ich ihn mal entfernt. Später mal wird den Felder über eine get_color() Methode die Farben der Steine zugewiesen.
Was ich aber gerade nicht erweitert bekommen ist, wenn ich mehr als die beiden Seiten habe. Also so:

Code: Alles auswählen

right = [[0, 0, 0], [0, 'b', 0], [0, 0, 0]]
left = [[0, 0, 0], [0, 'g', 0], [0, 0, 0]]
front = [[0, 0, 0], [0, 'r', 0], [0, 0, 0]]
back = [[0, 0, 0], [0, 'o', 0], [0, 0, 0]]
up = [[0, 0, 0], [0, 'y', 0], [0, 0, 0]]
down = [[0, 0, 0], [0, 'w', 0], [0, 0, 0]]
sides = [up, left, front, right, back, down]
Jetzt muss ich ja in das Dictionary die Information mit hineinschreiben, für welche Seiten die "Koordinaten" gedacht sind. Aber wie muss ich dann den Kopf der for-Schleife anpassen? Bisher habe ich nur Fehlermeldungen erhalten...
BlackJack

@Zizibee: Ich vermute mal in das `edgeblocks`-Wörterbuch müsste zu den Koordinaten innerhalb der Seite auch noch die Seite selbst als Datum dazu kommen, statt das die Seiten in der Schleife dazu gezippt zu werden, denn man will ja nicht alle Seiten sondern nur die ein bis drei Seiten, auf die der Stein jeweils Einfluss hat.

`sides` braucht's dann nicht mehr.

Code: Alles auswählen

def main():
    right = [[0, 0, 0], [0, 'b', 0], [0, 0, 0]]
    left = [[0, 0, 0], [0, 'g', 0], [0, 0, 0]]
    front = [[0, 0, 0], [0, 'r', 0], [0, 0, 0]]
    back = [[0, 0, 0], [0, 'o', 0], [0, 0, 0]]
    up = [[0, 0, 0], [0, 'y', 0], [0, 0, 0]]
    down = [[0, 0, 0], [0, 'w', 0], [0, 0, 0]]

    edgeblocks = {(45, 0): [(up, 2, 1), (front, 0, 1)]}
   
    for i, (side, index_a, index_b) in enumerate(edgeblocks[45, 0], 1):
        side[index_a][index_b] = i
    
    print(up)
    print(front)
 
 
if __name__ == '__main__':
    main()
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

@BlackJack: Verdammt... dein Code wirkt so einfach und doch wäre ich da wohl nie selber drauf gekommen...
Danke schön!
Antworten