Machs wie Amelie!

Story

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!

Aufgabe

Zum Lösen der Aufgabe implementieren Sie eine einfache Variante von den Türmen von Hanoi wie folgt:

1.

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.
2.

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!

3.

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

4.

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!