Seite 1 von 1

Listen über ein Dictionary ändern

Verfasst: Dienstag 30. Mai 2017, 13:00
von Zizibee
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.

Re: Listen über ein Dictionary ändern

Verfasst: Dienstag 30. Mai 2017, 13:44
von 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()

Re: Listen über ein Dictionary ändern

Verfasst: Dienstag 30. Mai 2017, 15:06
von Zizibee
@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...

Re: Listen über ein Dictionary ändern

Verfasst: Dienstag 30. Mai 2017, 15:28
von 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()

Re: Listen über ein Dictionary ändern

Verfasst: Mittwoch 31. Mai 2017, 06:41
von Zizibee
@BlackJack: Verdammt... dein Code wirkt so einfach und doch wäre ich da wohl nie selber drauf gekommen...
Danke schön!