In dieser Aufgabe können Sie es Felix und Marc zeigen!
Schauen Sie sich den Code von den beiden nochmal an (unten auf dieser Seite). Versuchen Sie nachzuvollziehen was passiert. Führen Sie ihn dazu gerne aus.
Bonus: Wenn Sie schon mit Debugging vertraut sind, dann nehme Sie auch gerne den Debugger zur Hand.
1.
Leider ist Marc und Felix ein Fehler beim Schreiben von spielzug() passiert. Etwas in den If-Abfragen stimmt nicht ganz.
Finden Sie den Fehler und korrigieren Sie ihn.
2.
Es ist bad practice Umlaute zu benutzen. Korrigieren Sie den Code.
3.
Schreiben Sie eine Klasse Turm, die die einzelnen Türme darstellen soll. Folgende Dinge müssen in der Klasse enthalten sein (Lassen Sie sich gerne von dem Code von Marc und Felix inspirieren):
__init__(self) erstellt eine leere Liste als Darstellung für den Turm
__len__(self) definiert die Anzahl der Steine die auf dem Turm sind
__int__(self) gibt die Größe vom obersten Stein des Turms zurück
ist_add_stein_korrekt(self, stein: Stein) -> bool überprüft ob der Stein zum Turm hinzugefügt werden darf
add(self, stein: Stein) -> bool fügt einen Stein zum Turm hinzu und gibt True zurück, wenn die Eingabe valide ist. Andernfalls geben Sie False zurück.
remove(self) -> Stein entfernt den obersten Stein vom Turm und gibt ihn zurück. Wenn der Turm leer ist, dann wird None zurück gegeben.
4.
Ersetzen Sie in dem Code die Darstellung der Türme mit [ Turm(), Turm(), Turm() ].
Passen Sie den Rest des Codes an Ihre Änderungen an.
classStein:
"""Ich bin 1-Stein"""def__init__(self, größe : int):
self.größe : int = größe
def__str__(self) -> str:
""" Damit die Scheiben schön aufeinander liegen können, also
**
****
******
soll man pro Größe 2 * drucken
"""return'**'* self.größe
def__int__(self) -> int:
return self.größe
classSpielbrett:
def__init__(self, anzahl_der_steine : int):
self.anzahl_der_steine : int = anzahl_der_steine
# Das ist eine von vielen Designentscheidungen, die wir in unserer sehr guten Dokumentation ganz genau erklären self.türme = [ [], [], [] ] # türme[0] = turm links, türme[1] = turm mitte, türme[2] = turm rechtsfor index in range(0, anzahl_der_steine):
# Linke Liste ist self.türme[0] self.türme[0].append(Stein(anzahl_der_steine - index))
defspielzug(self, von : int, nach : int) -> bool:
if0<= von <3and0<= nach <=3:
# Ist der von-Turm nicht-leerif len(self.türme[von]) >0:
# Nur kleinere auf größere Steineif len(self.türme[nach]) ==0or int(self.türme[von][-1]) < int(self.türme[nach][-1]):
# Nimm letztes Element (vergleiche https://docs.python.org/3/tutorial/datastructures.html#more-on-lists) letztes_element_vom_von_turm = self.türme[von].pop()
# Lege Element ab self.türme[nach].append(letztes_element_vom_von_turm)
returnTruereturnFalsedef__str__(self) -> str:
"""Todo: Schön machen""" ausgabe =""for zeilenindex in range(1, self.anzahl_der_steine+1):
# Ist an dieser Höhenposition ein Stein?for turm in self.türme:
position_in_der_liste = self.anzahl_der_steine - zeilenindex
if len(turm) > position_in_der_liste:
ausgabe = ausgabe +"."*(self.anzahl_der_steine - int(turm[position_in_der_liste])) +f"{turm[position_in_der_liste]}"+"."*(self.anzahl_der_steine - int(turm[position_in_der_liste]))
else:
ausgabe = ausgabe +"."*(2*self.anzahl_der_steine)
ausgabe = ausgabe +"|" ausgabe = ausgabe +'\n'return ausgabe
defhanoi():
print(f"Test")
mygame = Spielbrett(5)
print(f"{mygame}")
mygame.spielzug(0, 1)
mygame.spielzug(0, 1)
mygame.spielzug(0, 1)
mygame.spielzug(0, 1)
mygame.spielzug(0, 1)
mygame.spielzug(0, 1)
mygame.spielzug(0, 2)
mygame.spielzug(1, 2)
print(f"{mygame}")
defmain():
"""Hier startet die Funktion ihre Arbeit""" hanoi()
if __name__ =='__main__':
main()