i

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 Implementierung der 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:

if-else-beispiel

Alternativ lässt sich die Vorgehensweise auch als Struktogramm darstellen:

if-else-struktogramm

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.

int zufallszahl = new java.util.Random().nextInt(2); if(zufallszahl == 0) turn(-2); else turn(2);

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:

mouseClicked

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.

aelterWerden

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.

Suche

v
7.1.2.2.1
inf-schule.de/oop/java/implementierung/siw/grundgeruest
inf-schule.de/7.1.2.2.1
inf-schule.de/@/page/lNozuvzEStnWULLH

Rückmeldung geben