Lernstrecke: Türme von Hanoi mit BlueJ und SuM

In dieser Lernstrecke arbeitest du parallel zur Code-Vorlage mit den Klassen Main und Scheibe. Du startest mit einfachen Beobachtungen, verstehst dann Stapel als Datenstruktur und erweiterst das Spiel Schritt für Schritt.

EF Informatik BlueJ SuM-Bibliothek Datenstruktur Stapel

0. Vorbereitung

Öffne zuerst BlueJ und erstelle ein neues Projekt. Füge die Dateien Main.java und Scheibe.java ein. Kompiliere anschließend beide Klassen.

Start: Erzeuge in BlueJ ein Objekt der Klasse Main. Das Spielfeld erscheint automatisch. Einzelne Züge kannst du mit Methodenaufrufen testen:
ziehe(1, 3)
ziehe(1, 2)
zeigeHilfe()

Hinweis: Es gibt absichtlich keine main-Methode. In BlueJ startet das Programm durch das Erzeugen eines Objekts der Klasse Main.

Kompetenzziele

Objekte und Klassen

Du erkennst, welche Aufgaben die Klassen Main und Scheibe übernehmen.

Arrays

Du nutzt das Array scheibenArray, um alle Scheiben gemeinsam zu verwalten.

Stapel

Du verwendest die Datenstruktur Stapel, um die drei Türme zu modellieren.

Spielregeln

Du übersetzt Regeln des Spiels in Bedingungen und Methoden.

Phase 1: Programm starten und Oberfläche erkunden

Ziel: Du kannst das Programm starten, einzelne Züge ausführen und die wichtigsten Bereiche der Oberfläche benennen.

Auftrag 1.1: Starte das Programm in BlueJ durch new Main(). Rufe anschließend ziehe(1, 3) auf.
Auftrag 1.2: Notiere: Was bedeuten die Zahlen in ziehe(1, 3)?
Tipp Die erste Zahl ist der Startstapel, die zweite Zahl der Zielstapel. ziehe(1, 3) bedeutet also: Ziehe die oberste Scheibe von Stapel 1 auf Stapel 3.

Checkliste

Phase 2: Die zwei Klassen verstehen

Ziel: Du verstehst die Arbeitsteilung zwischen Main und Scheibe.

Klasse Aufgabe Typische Methoden
Main Steuert das Spiel, verwaltet Stapel, prüft Regeln und zählt Züge. ziehe, istZugGueltig, istGewonnen
Scheibe Zeichnet, radiert und bewegt eine einzelne Scheibe. zeichne, radiere, bewegeZu
Auftrag 2.1: Öffne beide Klassen. Markiere in jeder Klasse drei Methoden, die du schon ungefähr verstehst.
Auftrag 2.2: Erkläre schriftlich: Warum sollte Main nicht selbst jede Scheibe zeichnen?
Mögliche Antwortidee Wenn jede Scheibe selbst weiß, wie sie gezeichnet und bewegt wird, bleibt die Klasse Main übersichtlicher. Main kümmert sich dann um die Spiellogik.

Phase 3: Stapel als Datenstruktur

Ziel: Du verstehst, warum die Türme von Hanoi gut mit Stapeln modelliert werden können.

Ein Stapel funktioniert nach dem Prinzip: Das zuletzt abgelegte Objekt wird zuerst wieder genommen. Bei Türme von Hanoi darf immer nur die oberste Scheibe bewegt werden. Genau deshalb passt ein Stapel sehr gut.

Wichtige Stapel-Methoden

Methode Bedeutung im Spiel
legeAuf(scheibe) Legt eine Scheibe oben auf einen Stapel.
oberstes() Liefert die oberste Scheibe, ohne sie zu entfernen.
nimmAb() Entfernt die oberste Scheibe.
istLeer() Prüft, ob auf einem Stapel keine Scheibe liegt.
laenge() Gibt an, wie viele Scheiben auf einem Stapel liegen.
Auftrag 3.1: Suche in Main die Stelle, an der meinStapel1, meinStapel2 und meinStapel3 erstellt werden.
Auftrag 3.2: Suche die Methode erstelleScheiben(). Erkläre, warum die größte Scheibe zuerst auf meinStapel1 gelegt wird.
Tipp Wenn zuerst die größte Scheibe abgelegt wird, liegt sie unten. Danach kommen kleinere Scheiben darüber.

Phase 4: Einen Zug nachvollziehen

Ziel: Du kannst erklären, was bei einem Aufruf von ziehe(von, nach) passiert.

Auftrag 4.1: Lies die Methode ziehe von oben nach unten. Schreibe zu jedem Abschnitt eine kurze Erklärung.

Orientierung

  1. Stapelnummern prüfen
  2. Prüfen, ob Start und Ziel verschieden sind
  3. Start- und Zielstapel bestimmen
  4. Prüfen, ob auf dem Startstapel eine Scheibe liegt
  5. Prüfen, ob der Zug erlaubt ist
  6. Scheibe vom Startstapel nehmen
  7. Neue Position berechnen
  8. Scheibe bewegen und auf Zielstapel legen
  9. Zugzähler erhöhen
  10. Gewinnbedingung prüfen
Auftrag 4.2: Teste absichtlich ungültige Züge, zum Beispiel:
ziehe(2, 3)
ziehe(1, 1)
Notiere, welche Meldungen erscheinen.

Phase 5: Spielregel untersuchen und verändern

Ziel: Du verstehst die Methode istZugGueltig und kannst sie begründen.

return pScheibe.gibNummer() < obereZielScheibe.gibNummer();

In dieser Vorlage gilt: Eine kleinere Nummer bedeutet eine kleinere Scheibe. Scheibe 1 darf also auf Scheibe 2 liegen, aber Scheibe 5 darf nicht auf Scheibe 1 liegen.

Auftrag 5.1: Erstelle drei Beispiele für gültige und drei Beispiele für ungültige Züge. Begründe deine Entscheidung jeweils mit der Scheibennummer.
Auftrag 5.2: Ergänze in der Methode istZugGueltig einen eigenen Kommentar, der die Regel verständlich erklärt.

Phase 6: Design-Aufgaben

Ziel: Du kannst die grafische Darstellung verändern, ohne die Spielregeln kaputtzumachen.

Auftrag 6.1: Ändere die Farben der Scheiben im Array farben in der Methode erstelleScheiben().
Auftrag 6.2: Ändere die Formel in berechneBreite. Achte darauf, dass die größte Scheibe weiterhin nicht zu breit für das Spielfeld wird.
Auftrag 6.3: Ergänze in zeichneSpielfeld() eine zusätzliche Beschriftung der Türme, zum Beispiel A, B und C.
Tipp zum Zeichnen mit Buntstift Nutze meinStift.bewegeBis(x, y), um den Stift zu positionieren, und anschließend meinStift.schreibeText("Text").

Phase 7: Gewinnbedingung und Zugzähler

Ziel: Du erkennst, wann das Spiel gewonnen wurde, und kannst den Zugzähler erklären.

Auftrag 7.1: Suche alle Stellen, an denen zugAnzahl verwendet wird. Erkläre, wann der Wert erhöht wird und wann nicht.
Auftrag 7.2: Suche die Methode istGewonnen(). Warum reicht es bei dieser Vorlage zunächst zu prüfen, ob meinStapel3.laenge() gleich der Anzahl der Scheiben ist?
Erklärung Weil nur gültige Züge erlaubt sind, kann der dritte Stapel nicht falsch aufgebaut sein, wenn alle Scheiben dort liegen. Trotzdem kann man die Methode später noch genauer machen.

Phase 8: Erweiterungen für Fortgeschrittene

Ziel: Du wählst eine Erweiterung und setzt sie möglichst selbstständig um.

Challenge A: Animation

Erweitere Scheibe.bewegeZu, sodass die Scheibe erst nach oben, dann seitlich und dann nach unten fährt.

Challenge B: Mehr Scheiben

Mache die Anzahl der Scheiben veränderbar. Prüfe, ob Farben und Spielfeld noch passen.

Challenge C: Maussteuerung

Statt ziehe(1, 3) sollen Start- und Zielstapel mit der Maus ausgewählt werden.

Challenge D: Automatische Lösung

Programmiere eine rekursive Lösung. Nutze die Idee: loese(n, start, ziel, hilfe).

Challenge E: Minimum anzeigen

Berechne die minimale Zuganzahl mit der Formel 2^n - 1 und zeige sie an.

Challenge F: Fehlermeldungen

Gestalte ungültige Züge deutlicher, z.B. mit farbiger Meldungsfläche.

Kompletter Code zum Kopieren

Lege in BlueJ zwei Klassen mit den Namen Main und Scheibe an. Kopiere anschließend den passenden Code vollständig in die jeweilige Klasse.

Wichtig: Der Dateiname und der Klassenname müssen übereinstimmen. Die Klasse Main kommt also in Main.java, die Klasse Scheibe in Scheibe.java.
Main.java

Tipp: In BlueJ zuerst die Klasse Main öffnen, alten Inhalt markieren und dann diesen Code einfügen.

Scheibe.java

Tipp: Danach kompilieren. Gestartet wird das Projekt über new Main().

Abschlussreflexion

Beantworte am Ende kurz diese Fragen:

  1. Welche Aufgabe hat die Klasse Main?
  2. Welche Aufgabe hat die Klasse Scheibe?
  3. Warum passt die Datenstruktur Stapel besonders gut zu Türme von Hanoi?
  4. Welche Bedingung verhindert ungültige Züge?
  5. Welche Erweiterung würdest du als nächstes einbauen?