i

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

Hasenwelt

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 Methoden linksDrehen, 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 Typ int 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 Methode setRichtung 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 obigen Klassendiagramms und beschreibe den Aufbau und den Inhalt.

Ergänze das Attribut für die aktuelle richtung und die Methoden laufe und gelaufeneSchritte.

Suche

v
7.1.1.1.1
dev.inf-schule.de/oop/java/klassen/grundbegriffe/aktion
dev.inf-schule.de/7.1.1.1.1
dev.inf-schule.de/@/page/CVRSsvQRAHknoZgX

Rückmeldung geben