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.
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.
new Main().
Rufe anschließend ziehe(1, 3) auf.
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
- ☐ Ich kann ein Objekt der Klasse
Mainerzeugen. - ☐ Ich kann mit
ziehe(von, nach)einen Zug testen. - ☐ Ich kann erklären, warum keine
main-Methode nötig ist.
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 |
Main nicht selbst jede Scheibe zeichnen?
Mögliche Antwortidee
Wenn jede Scheibe selbst weiß, wie sie gezeichnet und bewegt wird, bleibt die KlasseMain ü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. |
Main die Stelle, an der meinStapel1,
meinStapel2 und meinStapel3 erstellt werden.
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.
ziehe von oben nach unten.
Schreibe zu jedem Abschnitt eine kurze Erklärung.
Orientierung
- Stapelnummern prüfen
- Prüfen, ob Start und Ziel verschieden sind
- Start- und Zielstapel bestimmen
- Prüfen, ob auf dem Startstapel eine Scheibe liegt
- Prüfen, ob der Zug erlaubt ist
- Scheibe vom Startstapel nehmen
- Neue Position berechnen
- Scheibe bewegen und auf Zielstapel legen
- Zugzähler erhöhen
- Gewinnbedingung prüfen
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.
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.
farben in der Methode
erstelleScheiben().
berechneBreite. Achte darauf,
dass die größte Scheibe weiterhin nicht zu breit für das Spielfeld wird.
zeichneSpielfeld() eine zusätzliche Beschriftung der Türme,
zum Beispiel A, B und C.
Tipp zum Zeichnen mit Buntstift
NutzemeinStift.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.
zugAnzahl verwendet wird.
Erkläre, wann der Wert erhöht wird und wann nicht.
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.
Main kommt also in Main.java, die Klasse
Scheibe in Scheibe.java.
Tipp: In BlueJ zuerst die Klasse Main öffnen, alten Inhalt markieren und dann diesen Code einfügen.
Tipp: Danach kompilieren. Gestartet wird das Projekt über new Main().
Abschlussreflexion
Beantworte am Ende kurz diese Fragen:
- Welche Aufgabe hat die Klasse
Main? - Welche Aufgabe hat die Klasse
Scheibe? - Warum passt die Datenstruktur
Stapelbesonders gut zu Türme von Hanoi? - Welche Bedingung verhindert ungültige Züge?
- Welche Erweiterung würdest du als nächstes einbauen?