Simulation im Codepad
Spielen am Computer
Ziel ist es eine textbasierte Version des Spiels mit BlueJ zu programmieren und am Computer zu spielen. Wenn du möchtest, kannst du das Spiel später auch in Greenfoot grafisch umsetzen. Das Video gibt dir einen Eindruck vom fertigen Spiel:
Zuerst soll das Spiel allerdings noch nicht programmiert werden, sondern es sollen die notwendigen Anweisungen und Gedankenschritte erst einmal ausprobiert werden. Dazu benutzt Du die Direkteingabe (bzw. bei BlueJ auf englisch: Codepad). Falls das Codepad bei Dir nicht aktiviert ist, kannst Du es im Menü unter View → Show Codepad bzw. Ansicht → Direkteingabe anzeigen aktivieren. Alternativ kannst es mit der Maus einblenden:
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.
Wir folgen der bei Computergrafiken üblichen Konvention, dass die y-Achse nach unten zeigt, der Ursprung also oben links ist und die Nummerierung bei 0 beginnt. Damit ergeben sich beispielhaft folgende Koordinaten:
Aufgabe 1
Beschreibe mit je einem Satz die Attribute, den Konstruktor und die Methoden.
Aufgabe 2
Welche Ausgaben erwartest Du in folgendem Codepad-Dialog an den mit Fragezeichen markierten Stellen?
Figur f = new Figur("rot", 0, 2);
f.gewonnen()
???
f.x
???
f.y
???
f.gehe(1);
f.gewonnen()
???
f.gehe(1);
f.gewonnen()
???
Implementiere die Klasse selbst in einem neuen BlueJ-Projekt oder lade das vorbereitete Projekt herunter. Teste die oben dargestellten Anweisungen und Ausdrücke im Codepad.
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 die Figuren auf den Startpositionen erzeugt werden:
Figur f1 = new Figur("blau", 0, 0);
Figur f2 = new Figur("rot", 4, 4);
Dies bewirkt, dass zwei Figuren erzeugt werden, die unter dem Namen f1 und f2 angesprochen werden können. Als Objektdiagramm lässt sich das folgendermaßen darstellen:
Die nächsten Spielzüge könnten dann sein:
- Blau wirft eine rote und blaue Münze und zieht nach rechts.
- Rot wirft zwei rote Münzen und zieht nach oben.
- ...
Im Codepad lassen sich die Züge simulieren durch
f1.gehe(1);
f2.gehe(1);
bzw.
f2.gehe(0);
f2.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 Anweisung
f1.gewonnen()
bzw. f2.gewonnen()
.
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 Münzen 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(2);
zahl2 = r.nextInt(2);
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
Um die aktuellen Figuren - also die Figuren, die man per Münzwurf bestimmt hat - zu bewegen, muss man genau darauf achten, welche Figuren gerade an der Reihe sind. Wenn man dies an mehreren Stellen im Programm berücksichtigen muss, kann es leicht zu Fehlern kommen und der Code wird unübersichtlich. Deshalb ist es sinnvoll, die aktuellen Figuren zu speichern:
Figur aktuelleFigur1;
Figur aktuelleFigur2;
// wenn man rot und rot geworfen hat
aktuelleFigur1 = f2;
aktuelleFigur2 = f2;
// wenn man blau und rot geworfen hätte
// aktuelleFigur1 = f1;
// aktuelleFigur2 = f2;
Dies bewirkt, dass zwei neue Variablen aktuelleFigur1
und aktuelleFigur2
definiert werden, welche auf die gleichen Objekte
zeigen, auf die auch f2
zeigt.
Man spricht in diesem Zusammenhang auch von einer Referenz oder einem
Verweis auf ein Objekt.
aktuelleFigur1
, aktuelleFigur2
und f2
referenzieren also alle das gleiche Objekt.
Anschließend können z.B. die Farben der aktuellen Figuren ausgegeben werden und die Figuren z.B. nach links verschoben werden.
System.out.println("Am Zug ist" + aktuelleFigur1.farbe + " und " + aktuelleFigur2.farbe);
aktuelleFigur1.gehe(3);
aktuelleFigur2.gehe(3);
Statt dessen hätte man hier - d.h. also wenn zwei mal rot geworfen wurde - auch schreiben können:
System.out.println("Am Zug ist" + f2.farbe + " und " + f2.farbe);
f2.gehe(3);
f2.gehe(3);
Aufgabe 6
Beschreibe den Vorteil der ersten Variante gegenüber der zweiten.
Aufgabe 7
Probiere das selbst einmal im Codepad aus, indem Du das Spiel zumindest teilweise auf diese Art spielst.