Objekte in Aktion
Spielidee
Beim Spiel Rabbit geht es um einen Hasen, der möglichst schnell alle vorhandenen Karotten auffressen soll. Dabei läuft der Hase immer geradeaus, solange er nicht auf einen Elefanten oder das Ende seiner Welt stößt. Elefanten bleiben die meiste Zeit einfach ruhig stehen, aber gelegentlich bewegen sie sich ein wenig. Der Hase kann sich nach links drehen, wenn man die Leertaste oder die linke Pfeiltaste drückt. Wenn das Spiel mit mehreren Spielern gespielt wird, gewinnt der Spieler, der am wenigsten Schritte benötigt. Du kannst Dir eine fertige Version des Spiels herunterladen, um es zu spielen. Einen beispielhaften Spielverlauf kannst Du in folgendem Video sehen:
Untersuchung des fertigen Spiels
Das Spiel ist schon fertig programmiert. Deine Aufgabe ist es einige grundsätzliche Strukturen zu analysieren. Dabei wirst Du wichtige Begriffe der objektorientierten Programmierung kennenlernen. In späteren Projekten wirst Du lernen selbst Spiele zu programmieren.
Lade das Szenario Rabbit herunter und entpacke es. Doppelklicken auf die zip-Datei genügt nicht, da dann nur einzelne Dateien des Projekts in ein temporäres Verzeichnis entpackt werden. Öffne das Projekt durch Doppelklick auf die Projektdatei "project.greenfoot" im entsprechenden Ordner. Dadurch startet Greenfoot und öffnet das Projekt. In Greenfoot werden Projekte auch Szenarien genannt. (Alternativ: Starte Greenfoot und öffne das Projekt, indem Du das Verzeichnis mit dem Projekt auswählst).
Objekte und Klassen
Im rechten Bereich findest Du die Klassen, die in diesem Szenario vorkommen, wie z.B. HasenWelt oder Hase. Jedes der Rechtecke repräsentiert eine Klasse. Im linken Bereich findest Du einige Objekte dieser Klassen.
Aufgabe 1
Klicke mit der rechten Maustaste auf die Klasse Hase
und wähle new Hase()
aus dem Kontextmenü.
Du kannst dann durch Klicken auf die Fläche im linken Bereich - die Welt dieses Szenarios -
einen Hasen darin positionieren. Du hast gerade ein Objekt der Klasse Hase erzeugt!
Erzeuge mehrere Objekte der Klassen Karotte
und Elefant
ähnlich der obigen Abbildung.
Methoden
Die Fähigkeiten, die ein Objekt besitzt, werden durch die Methoden definiert, die an diesem Objekt aufgerufen werden können.
Aufgabe 2
Rufe die MethodenlinksDrehen
, laufe
und esseKarotte
durch Rechtsklick an einem Hase-Objekt auf und beobachte was sie bewirken.
Auch die Welt ist ein Objekt. Man kann auf deren Methoden zugreifen,
indem man in einem freien Bereich der Welt mit der rechten Maustaste klickt.
Rufe die Methode erzeugeStartbelegung
des hasenwelt-Objekts auf.
Parameter
Einige Methoden benötigen zusätzliche Information, um ausgeführt werden zu können.
Diese Information kann man ihnen als Parameter übergeben.
So benötigt bspw. die Methode setRichtung
eine Angabe zur Richtung,
in die sich ein Hase drehen soll.
Die Art der Information wird durch die Signatur der Methode vorgegeben.
Diese kann man sehen, wenn man auf ein Objekt mit der rechten Maustaste klickt.
Für die Methode setRichtung
hat sie die Form
void setRichtung(int richtung)
Der Teil zwischen den Klammern liefert die Information über die benötigten Parameter. Für jeden Parameter wird ein Datentyp und ein Name definiert. Bei mehreren Parametern werden diese durch Kommata voneinander getrennt. Wenn der Bereich zwischen den Klammern leer ist, wird kein Parameter erwartet. Dennoch gehören die Klammern auch dann zur Signatur der Methode dazu, um zu kennzeichnen, dass es sich um eine Methode ohne Parameter handelt.
Datentypen
Der Datentyp gibt an welche Art von Information als Parameter übergeben werden muss. Der Typint
steht bspw. für ganze Zahlen (aus dem Englischen: integer).
Es gibt noch andere Datentypen, um z.B. Zeichen oder Kommazahlen als Typen festzulegen.
Aufgabe 3
Rufe die MethodesetRichtung
an einem Hase-Objekt
auf und übergebe dabei den benötigten Parameter.
Teste auch die Methode erzeugeObjekte(..)
des hasenwelt-Objekts und übergebe die benötigten Parameter.
Rückgabewerte
Methoden können nicht nur Informationen verlangen, sie können diese auch als Antwort liefern. Der Datentyp des Rückgabewertes lässt sich ebenfalls an der Signatur der Methode erkennen. So kann man z.B. an der Signatur der Methode
int gelaufeneSchritte()
eines Hase-Objekts erkennen, dass diese eine ganze Zahl zurück gibt,
da links vom Namen der Methode der Datentyp int
angegeben ist.
Falls eine Methode keine Rückgabe liefert, wird dies durch void
angegeben.
Aufgabe 4
Rufe verschiedene Methoden eines Hase-Objekts auf und vergleiche den zurückgegebenen Wert mit der Signatur der Methode.Attribute
Objekte haben bestimmte Eigenschaften und Daten, die zu ihnen gehören. Diese werden in den Attributen des Objekts gespeichert. Man kann sich diese in Greenfoot anschauen, wenn man mit der rechten Maustaste auf ein Objekt klickt und dann den Objektinspektor über den Eintrag "Inspizieren" aufruft. Auch Attribute haben - ebenso wie Parameter von Methoden - einen Namen und einen Typ.Aufgabe 5
Untersuche mit dem Objektinspektor mehrere Hase-Objekte und suche z.B. die Attribute und Attributwerte, die deren Position in der Welt angeben.
Quelltext
Die Methoden und Attribute von Objekten werden in deren Klassen definiert. Dazu schreibt man für jede Klasse Quelltext in einer objektorientierten Programmiersprache wie z.B. Java. Den Quelltext kann man sich ansehen, wenn man auf die Klasse mit der rechten Maustaste klickt und "Editor öffnen" auswählt. (Alternativ: Doppelklicken) Um diesen Text in ein für den Computer ausführbares Programm umzuwandeln, muss man ihn "compilieren". Dies hat zur Folge, dass man den Quelltext jedesmal, wenn man eine Änderung vorgenommen hat, neu übersetzen lassen muss.
Aufgabe 6
Öffne den Quelltext der Hase-Klasse und gehe ans Ende der Datei zur act-Methode.
Entferne dort die beiden Schrägstriche am Anfang der Zeilen.
Durch die Schrägstriche werden Kommentare eingeleitet, so dass dieser
Bereich bis jetzt nicht übersetzt wurde.
Die Zeilen definieren die Methode act
, die in Greenfoot eine besondere Funktion besitzt:
Wenn der Act-Button gedrückt wird, wird diese Methode automatisch einmal ausgeführt.
Wenn der Run-Button gedrückt wird, wird die Methode immer wieder ausgeführt, bis man die Simulation stoppt.
Der Quelltext wird in ein ausführbares Programm übersetzt sobald Du mit dem Cursor in eine andere
Zeile wechselst.
In anderen Entwicklungsumgebungen - wie z.B. BlueJ - musst Du diesen Übersetzungsprozess
anstoßen, indem Du auf "Kompilieren" o.ä. klickst.
Auch in der Klasse HasenWelt
solltest du noch Kommentare
entfernen.
Dort wurde die Zeile erzeugeStartbelegung();
auskommentiert,
um eine Erzeugung der Startbelegung zu verhindern.
Vererbung
Wenn man sich den Quelltext der Klasse Elefant
oder Karotte
anschaut, sieht man,
dass dort fast nichts drin steht. Dennoch ergibt eine Untersuchung mit Hilfe des Objektinspektors,
dass die Objekte der Klassen einige Attribute besitzen.
Dies kommt daher, dass die Klassen als Unterklasse der Klasse Actor
definiert wurden.
Somit erbt jedes Objekt der Klasse Hase
alle Attribute und Methoden der Klasse Actor
.
Aufgabe 7
Klicke auf ein Hase
-Objekt mit der rechten Maustaste und untersuche welche Methoden
es von Actor
geerbt hat und welche in der Klasse Hase
definiert sein müssen.
Verfahre ebenso für die Klasse Elefant
.
Klassendiagramme
Um sich einen Überblick über eine Klasse zu schaffen, benutzt man oft Klassendiagramme, die
in der Unified Modeling Language (UML) definiert sind.
Ein (um einige Attribute und Methoden gekürztes) Klassendiagramm für die Klasse Hase
hat z.B. folgende Gestalt:
Aufgabe 8 - Klassendiagramm für Hase
Klicke auf die verschiedenen Bereiche des Klassendiagramms und beschreibe den Aufbau und den Inhalt.
Ergänze das Attribut für die aktuelle richtung
und die Methoden laufen
und gelaufeneSchritte
.