Implementierung des Grundgerüsts
Zuerst solltest Du eine konkretere Vorstellung haben, wie das Spiel später aussehen könnte. Dies kannst Du natürlich am besten erreichen, indem Du eine fertige Version des Spiels spielst :-)
Vererbung
Wir werden das Spiel nicht von Anfang an beginnend programmieren, sondern wir nutzen ein Projekt, in dem z.B. schon geeignete Grafiken zur Verfügung stehen. Außerdem gibt es dort schon verschiedene Klassen, die Funktionalität zur Verfügung stellen. Wir können diese Klassen nutzen ohne sie zu verstehen oder auch nur ansehen zu müssen. Dazu erstellen wir Unterklassen. Jedes Objekt einer Unterklasse besitzt die Eigenschaften (Attribute) und Fähigkeiten (Methoden) der Oberklassen.
Aufgabe 1 - Projekt vorbereiten
Zuerst musst Du das vorbereitete Projekt herunterladen und entpacken. Öffne das Projekt "SIW" und erstelle eine neue Unterklasse von Actor, in der ein Schwein programmiert werden soll. Stelle das laufende Schwein als Grafik für Objekte der Klasse ein. Compiliere das Projekt, erstelle ein Schwein und experimentiere durch Rechts-Klick mit den Methoden, die ein Schwein ausführen kann. Erkläre warum das Schwein schon einiges kann, obwohl wir selbst noch gar nichts programmiert haben.
Act-Methode
Die Methode act()
spielt in Greenfoot eine besondere Rolle:
Beim Klicken auf den Act-Button wird die Methode einmal ausgeführt.
Beim Klicken auf den Run-Button wird die Methode immer wieder ausgeführt bis man die Simulation stoppt.
Als nächstes könnte man also die act-Methode so ergänzen, dass das Schwein sich mit jedem act-Schritt
ein klein wenig bewegt.
public class Schwein extends Actor
{
public void act() {
move(2);
}
}
Aufgabe 2 - Erste Bewegungen
Erweitere Deine Klasse so, dass das Schwein beim Klicken auf "Act" einen Schritt macht und sich um einen kleinen Winkel dreht.
Beim Klicken auf "Run" sollte das Schwein dann im Kreis laufen.
Achtung: Die act-Methode muss als public
definiert werden!
(Für Hintergrund-Wissen-Woller: act
ist in Actor
als
public definiert. Ein Weglassen des Zugriffsmodifikators würde die Zugreifbarkeit
theoretisch einschränken, was in Unterklassen nicht erlaubt ist.)
Links-Rechts-Bewegungen
Die Bewegung des Schweins ist so natürlich noch lange nicht zufriedenstellend. Im nächsten Schritt sollten wir die Bewegung etwas zufälliger gestalten. Eine Idee, die sich so ähnlich oft wiederverwenden lässt, wäre: "Ermittle zufällig eine der beiden Zahlen 0 oder 1. Wenn die Zahl gleich 0 ist, dann drehe Dich ein wenig nach rechts, sonst drehe Dich ein wenig nach links." Diese Idee lässt sich etwas formaler als Flussdiagram darstellen:
Alternativ lässt sich die Vorgehensweise auch als Struktogramm darstellen:
Aufgabe 3 - Zufällige Bewegungen
Implementiere die beschriebene Funktionalität in der act
-Methode.
Wie man Zufallszahlen erzeugt, kannst Du z.B. im
Anhang nachschlagen.
Aufgabe 4 - Nicht so zappelig
Die Bewegungen sind nicht besonders schön, da das Schwein sehr zittrig läuft. Folgende Idee bewirkt eine Verbesserung: "Ermittle eine Zufallszahl zwischen 0 und 19. Wenn die Zufallszahl gleich 0 ist, dann drehe Dich um 20 Grad nach rechts. Wenn die Zufallszahl gleich 1 ist, dann drehe Dich um 20 Grad nach links." Stelle die Idee als Flussdiagramm und/oder Struktogramm dar und implementiere sie. Was passiert, wenn die Zufallszahl im Bereich von 2 bis 19 liegt?
Klassenmethoden
Der Ausdruck zum Berechnen einer Zufallszahl ist in Java leider sehr länglich. Da man Zufallszahlen in Greenfoot oft benötigt, haben die Entwickler von Greenfoot eine Methode programmiert, mit der man etwas einfacher Zufallszahlen berechnen kann. Diese lässt sich z.B. folgendermaßen aufrufen:
int zufallszahl = Greenfoot.getRandomNumber(20);
Hier fällt auf, dass Greenfoot groß geschrieben wird.
Wenn die Greenfoot-Entwickler sich an die in Java üblichen Konventionen gehalten haben,
(was natürlich der Fall ist) dann muss es sich dabei um eine Klasse handeln.
Das bedeutet, dass die Methode getRandomNumber(...)
nicht an einem
Objekt aufgerufen wird, sondern nur im Kontext einer Klasse.
Die Gedanken der Greenfoot-Entwickler könnten folgende gewesen sein:
"Zufallszahlen sind doch eigentlich nicht abhängig vom konkreten Zustand
eines Objektes, sie sollten ja zufällig sein.
Also würde es Sinn machen, dass man eine Methode zum Berechnen einer Zufallszahl
auch aufrufen kann, ohne dass man ein Objekt erzeugen muss.
Also lasst uns die Methode doch in der Klasse Greenfoot
bereit stellen, aber eben als Klassenmethode.
Dann braucht der Benutzer der Methode nicht immer ein Objekt erstellen,
sondern kann einfach die Methode getRandomNumber
, die in der
Klasse Greenfoot
programmiert wurde, aufrufen durch
Greenfoot.getRandomNumber(...)
.
Das klingt gut, so machen wir das!"
Die Klasse Greenfoot enthält noch einige weitere Klassenmethoden, z.B.
stop()
, mouseClicked(...)
oder playSound(...)
,
die man alle nach dem gleichen Schema nutzen kann.
So lässt sich z.B. die folgende Idee mit Greenfoot sehr leicht umsetzen:
"Wenn ich (als Schwein) geklickt wurde, dann soll ein Sound abgespielt werden
und das Spiel soll anhalten." Sounds müssen dabei im Verzeichnis "sounds" des Projektordners
gespeichert sein.
Als Flussdiagramm lässt sich diese Idee folgendermaßen darstellen:
this
bedeutet in Java so viel wie "ich selbst".
Alternativ könnte man an dieser Stelle irgend ein anderes Objekt,
also z.B. einen anderen Actor oder die Welt angeben.
Die Methode mouseClicked
gibt genau dann true
zurück, wenn auf das Objekt geklickt wurde, das als Parameter übergeben wurde.
Aufgabe 5 - Spielende auf Mausklick
Setze das dargestellte Flussdiagramm in der act-Methode um.
Älter werden
Das Schwein muss die Zahl der Schritte mitzählen, die es gemacht hat. Wenn das Schwein 1000 act-Schritte alt ist, soll Greenfoot automatisch anhalten und die Grafik geändert werden. Es benötigt also eine Eigenschaft (ein Attribut), in dem das eigene Alter gespeichert wird. Mit jedem act-Schritt wird das Alter um eins erhöht, falls das Alter 1000 erreicht, soll Greenfoot anhalten und die Grafik des Schweins geändert werden.
Aufgabe 6 - Altes Schwein
Ergänze in der Schwein-Klasse ein Attribut für das Alter. Setze das dargestellte Struktogramm in der act-Methode um. Tipp: Du kannst durch Rechtsklick auf ein Schwein herausfinden, wie die Methode zum Ändern der Grafik heißt.
Startzustand eines Spiels
Beim Start des Spiels soll immer ein Schwein auf der Welt sein. Bis jetzt musste man dieses immer erst per Hand erzeugen. In Greenfoot ist es ganz leicht einen Startzustand für das Spiel zu definieren. Dazu muss man nur den gewünschten Startzustand herstellen und danach auf einem freien Bereich der Welt rechtsklicken. Im dann erscheinenden Menü wählt man den Punkt "Save the world" bzw. auf deutsch "Die Welt speichern". Greenfoot erzeugt dann automatisch den Code, der nötig ist, um den Zustand wiederherzustellen. Ab dann ist das Schwein automatisch auf der Welt, ohne dass man es nach jeder Änderung am Code und jedem Übersetzungsvorgang neu erstellen müsste.
Aufgabe 7 - Spiel vorbereiten
Probiere das selbst einmal aus. Versuche den generierten Code zu erklären.