Simulation im Codepad
Spielen am Computer
Ziel ist es eine textbasierte Version des Spiels mit BlueJ zu programmieren und am Computer zu spielen. (Eine grafische Version des Spiels lenkt an dieser Stelle von den eigentlichen Lernzielen ab, kann aber später natürlich noch mit Greenfoot implementiert werden.) Um einen Eindruck zu bekommen, kannst Du dir das Spiel einmal ansehen, wie es fertig implementiert aussehen könnte:
Zuerst soll das Spiel allerdings noch nicht programmiert werden, sondern es sollen die notwendigen Anweisungen und Gedankenschritte erst einmal ausprobiert werden. Dazu benutzt Du das Codepad (bzw. bei BlueJ auf deutsch: die Direkteingabe) in BlueJ. Falls das Codepad bei Dir nicht aktiviert ist, kannst Du es im Menü unter View → Show Codepad (Ansicht → Direkteingabe anzeigen) aktivieren.
Figur-Klasse
Wir gehen von folgender Struktur für die Figuren-Klasse aus:
Dabei soll die Vereinbarung gelten, dass beim Bewegen der Figur in Richtung 0, 1, 2 oder 3 diese sich nach oben bzw. rechts, unten, links bewegt.
Aufgabe 1
Beschreibe mit je einem Satz die Attribute, den Konstruktor und die drei Methoden.
Aufgabe 2
Welche Ausgaben erwartest Du in folgendem Codepad-Dialog an den mit Fragezeichen markierten Stellen?
Figur f = new Figur("rot", -1, 0); f.gewonnen() ??? f.druckePosition(); f.x ??? f.y ??? f.gehe(1); f.x ??? f.gewonnen() ???
Erstelle die Klasse in einem neuen BlueJ-Projekt oder lade Dir das vorbereitete Projekt herunter. Teste die oben dargestellten Anweisungen und Ausdrücke im Codepad.
Hinweis: Achte darauf, ob eine Zeile mit einem Semikolon abgeschlossen wird oder nicht. Ohne Semikolon wird der Wert des Ausdrucks ausgegeben. Mit Semikolon wird eine Anweisung ausgeführt, ohne dass ein eventuell berechneter Wert ausgegeben wird. Eine ausführliche Erklärung zur Benutzung des Codepads findest Du im Abschnitt zu den BlueJ-Tipps.
Ein Spiel im Codepad simulieren
Es soll ein Spiel mit vorgegebenem Verlauf im Codepad simuliert werden. Dazu soll schon zufällig bestimmt worden sein, dass der Spieler mit der Farbe "blau" beginnt. Zuerst müssen alle Figuren auf den Startpositionen erzeugt werden:
Figur f1 = new Figur("blau", -2, 2); Figur f2 = new Figur("blau", 2, -2); Figur f3 = new Figur("rot", -2, -2); Figur f4 = new Figur("rot", 2, 2);
Dies bewirkt, dass vier Figuren erzeugt werden, die unter dem Namen f1 bis f4 angesprochen werden können. Als Objektdiagramm lässt sich das folgendermaßen darstellen:
Die nächsten Spielzüge könnten dann sein:
- Blau würfelt 1 und 4 und zieht nach rechts.
- Rot würfelt 3 und 3 und zieht nach oben.
- ...
Im Codepad lassen sich die Züge simulieren durch
f1.gehe(1); f4.gehe(1);
bzw.
f3.gehe(0); f3.gehe(0);
Aufgabe 3
Überlege Dir weitere Spielzüge, um ein vollständiges Spiel zu simulieren. Simuliere das Spiel im Codepad. Den aktuellen Zustand kannst Du kontrollieren durch Abfrage der Attribute mit f1.x etc. sowie durch Aufruf der Anweisungen f1.gewonnen() oder f1.druckePosition();. Du kannst zur Kontrolle das Spiel auch parallel auf einem echten Spielbrett spielen.
Ein Spiel im Codepad spielen
Als nächstes wollen wir das Spiel wirklich spielen, wir müssen also auch das Werfen der Würfel im Codepad erledigen. Dazu muss zunächst das Paket importiert werden, das die Random-Klasse enthält, mit deren Hilfe wir dann Zufallszahlen erzeugen können:
import java.util.Random; Random r = new Random(); int zahl1; int zahl2; zahl1 = r.nextInt(4); zahl2 = r.nextInt(4); zahl1 zahl2
Aufgabe 4
Beschreibe mit Hilfe von Fachbegriffen, was in jeder Zeile genau passiert und probiere das selbst aus.
Aufgabe 5
Probiere das selbst einmal im Codepad aus, indem Du das Spiel zumindest teilweise auf diese Art spielst.
Die aktuellen Figuren speichern
Bei der Programmierung wird es sich als hilfreich erweisen, wenn man die aktuellen Figuren speichert, da man so leichter mehrfach auf die aktuellen Figuren zugreifen kann. Wurden z.B. die Zahlen 2 und 4 gewürfelt, dann könnte dies durch folgende Anweisungen erreicht werden:
Figur aktuelleFigur1; Figur aktuelleFigur2; aktuelleFigur1 = f2; aktuelleFigur2 = f4;
Dies bewirkt, dass zwei neue Variablen aktuelleFigur1 und aktuelleFigur2 definiert werden, welche auf die gleichen Objekte zeigen, auf die auch f2 und f4 zeigen. Man spricht in diesem Zusammenhang auch von einer Referenz oder einem Verweis auf ein Objekt. aktuelleFigur1 und f2 referenzieren also das gleiche Objekt.
Anschließend können die Figuren z.B. nach links verschoben werden und die aktuelle Position ausdrucken.
aktuelleFigur1.gehe(3); aktuelleFigur2.gehe(3); aktuelleFigur1.druckePosition(); aktuelleFigur2.druckePosition();
Statt dessen hätte man hier auch schreiben können:
f2.gehe(3); f4.gehe(3); f2.druckePosition(); f4.druckePosition();
Aufgabe 6
Welchen Vorteil besitzt die erste Variante gegenüber der zweiten?
Aufgabe 7
Probiere das selbst einmal im Codepad aus, indem Du das Spiel zumindest teilweise auf diese Art spielst.