Sie haben Amelie dabei zugeschaut, wie Sie Türme von Hanoi mit 9 Scheiben perfekt gelöst hat! Dies faszinierte Sie und nun wollen Sie dies Zuhause auch mal probieren. Aber oh nein! Sie haben kein Türme von Hanoi zu Hause und zum Basteln fehlt Ihnen die Kreativität. Was ein Glück, dass Sie Python können!
Zum Lösen der Aufgabe implementieren Sie eine einfache Variante von den Türmen von Hanoi wie folgt:
Erstellen Sie eine Klasse TuermeVonHanoi
mit folgenden Attributen:
count: int
: Speichert die Anzahl der getätigten Zügen.size: int
: Speichert die Anzahl der vorhandenen Scheiben.stapel_list: list[list[int]]
: Eine Liste, welche drei Listen enthält. Jeder dieser drei Listen soll ein Stapel darstellen. In diesen Stapeln werden die Scheiben (in einer sinnvollen Ordnung) gespeichert. Mit aufsteigendem Index werden die Scheiben kleiner. Die kleinste Scheibe des Stapels n
kann man also immer mit stapel_list[n][-1]
erreichen. Die größe einer Scheibe können Sie ganz einfach mit einer Ganzzahl festhalten.Sowie folgenden Methoden:
__init__(n: int)
: initialisiert ein neues TuermeVonHanoi
Objekt mit n
-Scheiben, wobei der Startstapel alle n
-Scheiben enthält (richtig geordnet). Die anderen Stapel starten leer. Wie bei Türme von Hanoi halt. count
wird logischerweise mit 0 initialisiert und size
wird auf n
gesetzt.__str__() -> str
: Gibt einen String zurück, der dem Spielstand entspricht. Sie können hier ganz frei entscheiden wie kompliziert/einfach Sie dieses Problem lösen.bewege(von: int, nach: int)
: Versucht die oberste Scheibe des Stapels von
auf dem Stapel nach
zu platzieren. Falls dies ein legaler Spielzug ist, wird die Aktion durchgeführt und count
wird inkrementiert. Falls von
/nach
auf nicht existierende Türme zugreifen würden oder falls der auch sonst Spielzug ein illegaler wäre, sollen Ausnahmen geworfen werfen. Hier lohnt es sich, eigene Ausnahmen zu scheiben!status() -> bool
: Berechnet, ob man gewonnen hat. Falls ja, wird man gelobt und falls man es sogar perfekt gelöst hat (in 2^n - 1 Zügen) wird man sogar sehr stark gelobt. Danach wird True
zurückgegeben. Sonst False
.reset()
: Setzt das Spiel auf den Initialzustand zurück.Implementieren Sie nun ein Türme von Hanoi Spiel in der Konsole, bei dem man so lange neue Züge machen muss, bis man gewinnt. Dazu ist die Methode tuerme_von_hanoi.status
sicher hilfreich, sowie die gute alte input
Methode. Ausnahmen sollen aufgefangen und richtig behandelt werden, dabei darf das Spiel nicht frühzeitig abbrechen!
Schreiben Sie eine Methode loese_iterativ(turm)
, welche ein Objekt turm
der Klasse TuermeVonHanoi
bekommt und dieses iterativ löst. Es empfehlt sich hier, den Turm am Anfang zurückzusetzen (mit der reset
Methode).
Tipp: Falls Sie nicht wissen, wie man Türme von Hanoi iterativ löst, können Sie jederzeit Amelie fragen! :D
Schreiben Sie eine Methode loese_rekrusiv(turm)
, welche ein Objekt turm
der Klasse TuermeVonHanoi
bekommt und dieses rekrusiv löst… Diese Aufgabe ist extrem schwer!