2.1
Starte Greenfoot und öffne das Szenario little-crab. Platziere eine Krabbe in der Welt und führe das Programm aus. Was kannst du beobachten ?
Lösung: Die Krabbe verändert ihre X- und Y-Koordinate nicht
2.2
Ergänze die act-Methode in deiner Klasse **Crab** um den den Befehl **move()**, wie oben gezeigt. Übersetzte das Szenario und platziere eine Krabbe in der Welt. Klicke jetzt auf die Buttons Act und Run.
Lösung: Die Krabbe Bewegt sich zum rechten Rand der Welt.
2.3
Platzire mehrere Krabben in der in der Welt. Führe das Szenario aus. Was kannst du beobachten?
Lösung: Alle krabben bewegen sich gleich schnell zum rechten Rand der Welt.
2.4
Ersetze in deinem Szenario den Befehl **move()** durch den Befehl **turn(5)**. Führe das Szenario aus. Gib probeweise auch andere Werte statt 5 ein und beobachte, was passiert. Denke daran: Jedes Mal, wenn du deinen Quelltext änderst, musst du ihn erneut übersetzt.
Lösung: Die Krabbe dreht sich unterschiedlich schnell nach rechts im Kreis herum.
2.5
Wie kannst du erreichen, dass sich die Krabbe links herum dreht?
Lösungng: Man gibt einen Minuswert ein.
2.6
Verwende in der act-Methode deiner Krabbe sowohl einen Befehl **move()** als auch einen Befehl **turn(*N*)**. Gib verschiedene Werte für N ein.
Lösung: Die Krabbe dreht sich auf einem unterschiedlich großen Kreis.
2.7
Öffne den Editor, um den Quelltext der Krabbe anzuzeigen, und entferne das Semikolon hinter **move()**. Übersetze den Code. Experimentiere auch mit andern Fehlern herum, wie eine falsche Schreibweise von move oder andern Zufallsänderungen am Code. Achte jedoch darauf, dass nach der Übung alle Änderungen wieder zurückgenommen werden.
Lösung: Es werden Fehlermeldungen angezeigt.
2.8
Nimm verschiedene Änderungen vor, um unterschiedlich Fehlermeldungen zu erhalten. Finde mindestens fünf verschiedene Fehlermeldungen. Notiere dir jede Fehlermeldung und durch welchen Fehler sie ausgelöst wurde.
Lösung:1.";" expected. Wird durch ein vergessenes bzw. fehlendes Simikolon hervorgerufen.
2.reached end of file while parsing. Wird durch eine Vergessene bzw. fehlende Geschweifteklammer hervorgerufen.
3.cannot find symbol - class voi. Wird durch einen Schreibfehler (void) hervorgerufen.
4.illegal start of expression. Wird durch eine vergessene bzw. fehlende schließende Klamme hervorgerufen.
5.not a statement. Wird durch zwei bzw. beide fehlende Klammer
2.9
Öffne den Editor für die Klasse **Animal**. Wechsel in die Ansicht Dokumentation. Scrolle zur Liste der Methoden für diese Klasse. Wie viele Methoden hat diese Klasse?
Lösung: Es gibt sechs methoden.
2.10
Erzeuge eine Krabbe. Klicke sie mit der rechten Maustaste an und suche die Methode **atWorldEdge()**. Rufe diese Methode auf. Was liefert sie zurück?
Lösung: Sie Liefert den wert "False" zurück
2.11
Lass die Krabbe an den Rand des Bildschirms laufen und rufe dann erneut die Methode **atWorldEdge()*** Was liefert sie jetzt zurück ?
Lösung: Sie Liefert den wert "True" zurück
2.12
Starte einen Versuch! Tippe den oben angegebenen Code in deinen Editor ein und schau, ob sich deinen Krabbe bei Erreichen des Weltrandes umdrehen. Achte besonders auf die öffnenden und schlißenden Klammern-Schnell hat man eine zu viel oder zu wenig eingetippt.
Lösung: Ja, Die krabbe dreht sich am rand um.
2.13
Gib für den Parameter der **turn**-Methode verschidene Werte ein, bis das Ergebnis gefällt.
Lösung: Der Parameter 16 passt am besten.
2.14 Plaziere die **move()**-Anweisung in die **if**-Anweisung statt dahinter.Stelle fest, welche Auswirkungen das hat, und erkläre das zu beobachtende Verhalten.(Anschließend behebe diesen Fehler und mache alles wieder rückgängig.)
Lösung: Es Passiert nichts, da die Bedingung nicht erfüllt ist.
Übung 3.1
Bevor du weiterliest, versuche einmal auf Papier einen Ausdruck aufzuschreiben, der
die Mehode getRandomNumber und den Kleiner-als-Operator verwendet und bei
em die Ausführung in genau zehn Prozent aller Fälle wahr ist.
Lösung: Greenfoot.getRandomNumber(100)<10
Übung 3.2
Schreibe einen weiteren Ausdruck nieder, der in genau sieben Prozent aller Fälle
wahr ist.
Lösung: Greenfoot.getRandomNumber(100)<7
Übung 3.3
Implementiere diese zufälligen Kursänderungen in deiner eigenen Version.
Experimentiere mit verschiedenen Wahrscheinlichkeiten für die Krabbe, einen
anderen Kurs einzuschlagen.
Lösung: Die krabbe ändert unterschiedlich häufig ihre Richtung.
Übung 3.4
Gib den obenstehenden Code in dein Beispiel ein. Was kannst du beobachten?
Dreht sich die Krabbe um verschiedene Winkel, wenn sie sich dreht?
Lösung: Nein, sie dreht sich immer um den gleichen Winkel.
Übung 3.5
Bleibt noch das Problem, dass sich die Krabbe immer nach rechts dreht. Dies
entspricht nicht dem normalen Verhalten einer Krabbe, sodass hier noch
Handlungsbedarf besteht. Ändere deinen Code so, dass sich deine Krabbe bei jeder
Drehung entweder nach rechts oder nach links um bis zu 45 Grad dreht.
Lösung: if (Greenfoot.getRandomNumber(100)<10)
{
turn(45);
}
if (Greenfoot.getRandomNumber(100)<9)
{
turn(-45);
}
Übung 3.6
Führe verschiedene Szenarien mit mehreren Krabben in der Welt aus. Drehen sie
sich alle zur selben Zeit oder unabhängig voneinander? Warum?
Lösung: Ja, sie drehen sich zur selben Zeit, weil sie den selben Befehl erhalten.
Übung 3.7
Füge einige Würmer in deine Welt ein. Füge außerdem einige Krabben ein. Führe
das Szenario aus. Was kannst du beobachten? Was machen die Würmer? Was
passiert, wenn eine Krabbe auf einen Wurm trifft?
Lösung : Es passiert nichts.Die Krabbe läuft einfach durch die Würmer durch. Die Würmer bleiben allerdings an Ort und Stelle.
Übung 3.8
Erzeuge eine weitere neue Methode namens randomTurn (diese Methode
übernimmt keine Parameter und liefert auch nichts zurück). Markiere den Code für
die zufälligen Drehbewegungen und verschiebe ihn aus der act-Methode in die neue
Methode randomTurn. Rufe dann diese neue randomTurn-Methode aus deiner actMethode heraus auf. Denke daran, einen Kommentar für diese Methode zu
schreiben.
Lösung:Wir haben die randomTurn Methode aus der act-Methode kopiert und diese dann ausgeführt. Die krabbe hat sich dann zu einer Wahrscheinlichkeit von 10% gedreht daher hatte sie sich beim ersten mal nicht gedreht. Nach mehrfachen versuchen drehte sie sich dann um die gewünschte Grad Anzahl.
Übung 3.9
Erzeuge noch eine neue Methode namens turnAtEdge (sie übernimmt ebenfalls
keine Parameter und liefert nichts zurück). Verschiebe den Code, der prüft, ob wir
uns am Rand der Welt befinden (und wenn ja eine Drehung auslöst), in die Methode
turnAtEdge. Rufe die Methode turnAtEdge aus deiner act-Methode heraus auf.
Deine act-Methode sollte jetzt wie die Version in Listing 3.4 aussehen.
Lösung: Wenn man die Methode turnAtEdge aufruft passiert nichts, wenn die Krabbe sich nicht an einem Rand befindet. Wenn doch, dann dreht sie sich um den angegebenen Winkel.
Übung 3.10
Füge deinem Szenario eine neue Klasse hinzu. Die Klasse sollte eine Unterklasse
von Animal sein und den Namen Lobster (Hummer) mit einem großgeschriebenen
L erhalten. Außerdem solltest du die Klasse mit dem vorgegebenen Bild lobster.png
verbinden.
Lösung:Es wurde die Lobster Klasse erstellt indem "new subclass" angeklickt und daraufhin das Bild vom Hummer ausgewählt wurde.
Übung 3.11
Was glaubst du, machen Hummer, wenn du sie so, wie sie sind, in der Welt
platzierst? Kompliliere dein Szenario und probiere es aus.
Lösung: Es passiert nichts und die Krabben laufen einfach durch die Hummer.
Übung 3.12
Kopiere die komplette act-Methode aus der Klasse Crab in die Klasse Lobster.
Kopiere ebenfalls die Methoden lookForWorm, turnAtEdge und randomTurn.
Übung 3.13
Ändere den Code von Lobster so, dass der Hummer nach Krabben und nicht nach
Würmern Ausschau hält. Dazu musst du lediglich jedes Vorkommen von „Worm“ im
Quelltext in „Crab“ ändern. Dort, wo zum Beispiel Worm.class auftaucht, ändere den
Code in Crab.class. Ändere auch den Namen der Methode lookForWorm in
lookForCrab. Denke auch daran, deine Kommentare anzupassen.
Lösung: Wir haben den Quellcode verändert indem wir das Wort "Worm" mit dem Wort "Krabbe" ausgetauscht.
Übung 3.14
Platziere eine Krabbe, drei Hummer und viele Würmer in der Welt. Führe das
Szenario aus. Schafft es die Krabbe, alle Würmer zu fressen, bevor sie von einem
Hummer vernichtet wird?
Lösung: Nein die Krabbe wird vorher von den Hummern gefressen.
Übung 3.15
Entferne den Code für die zufälligen Drehbewegungen aus der Krabbe.
Lösung:Wir haben den Kot entfernt
Übung 3.16
Entferne den Code, der dafür zuständig ist, dass die Krabbe am Rand der Welt
wendet.
Lösung: Wir haben den Code entfernt
Übung 3.17
Füge Code in die act-Methode der Krabbe ein, der dafür sorgt, dass sich die Krabbe
immer nach links dreht, wenn die die linke Cursortaste gedrückt wird. Teste den
Code.
Lösung: if (Greenfoot.isKeyDown("left"))
{
turn(-5);
}
Der Code Funktioniert.
Übung 3.18
Füge weiteren – ähnlichen – Code in die act-Methode der Krabbe ein, der dafür
sorgt, dass sich die Krabbe immer nach rechts dreht, wenn die rechte Cursortaste
gedrückt wird.
Lösung: if (Greenfoot.isKeyDown("right"))
{
turn(5);
}
Der Code Funktioniert
Übung 3.19
Sofern du es noch nicht gemacht hast, sorge dafür, dass der Code, der das Drücken
der Tasten prüft und ein Drehen veranlasst, nicht direkt in die act-Methode eingefügt
wird, sondern in eine eigene Methode ausgelagert wird, die z.B checkKeypress
heißen könnte. Diese Methode sollte von der act-Methode aus aufgerufen werden.
Lösung: public void checkKeypress()
{
if (Greenfoot.isKeyDown("left"))
{
turn(-5);
}
if (Greenfoot.isKeyDown("right"))
{
turn(5);
}
}
Übung 3.20
Öffne die Greenfoot API in deinem Browser. Wähle die Klasse Greenfoot. In ihrer
Dokumentation findest du einen Abschnitt mit der Überschrift „Method Summary“.
Versuche, in diesem Abschnitt eine Methode zu finden, die die Ausführung eines
laufenden Szenarios stoppt. Wie wird diese Methode genannt?
Lösung: Die Methode die das Szenario benndet heißt stop()
Übung 3.21
Erwartet diese Methode irgendwelche Parameter? Wie lautet ihr Rückgabetyp?
Lösung: Da void angegeben ist gibt es keinen Rückgabetyp.
Übung 3.22
Füge deinem Szenario Code hinzu, der das Spiel beendet, wenn ein Hummer die
Krabbe fängt. Dazu musst du entscheiden, wo dieser Code einzufügen ist. Suche
nach der Codestelle, die ausgeführt wird, wenn ein Hummer eine Krabbe frisst, und
füge hier die obige Codezeile ein.
Lösung: Die Richtige Stelle für den stop() befehl ist nachdem, eine Krabbe gefressen wurde und der Todes Ton ertönt.
Code:public void lookForCrab()
{
if( canSee(Krabbe.class))
{
eat(Krabbe.class);
Greenfoot.playSound("au.wav");
Greenfoot.stop();
}
}
Übung 3.23
Öffne die Greenfoot KLASSENDOKUMENTATION (über das HILFE-Menü) und rufe die
Dokumentation der Klasse Greenfoot auf. Suche nach einer Methode, mit der du
einen Sound abspielen kannst. Wie lautet ihr Name? Welche Parameter erwartet
sie?
Lösung:Die Methode lautet playSound und erwartet den Parameter soundFile
Übung 3.24
Ergänze dein Szenario um das Abspielen von Sounddateien: Wenn eine Krabbe
einen Wurm frisst, spiele den Sound „slurp.wav“, und wenn ein Hummer die Krabbe
frisst, spiele den Sound „au.wav“. Das Wichtigste dabei ist es, die richtige Position im
Code zu finden, wo dies passieren soll.
Lösung:Die richtige stelle für die Sounddatei für den Hummer ist nachdem er die Krabbe gefressen hat das gleiche gilt bei der Krabbe und dem Wurm.
Übung 3.25
Wenn dir bei deinem Computer ein Mikrofon zur Verfügung steht, erstelle deine
eigenen Sounds, um das Fressen der Würmer oder der Krabbe zu untermalen. Nimm
die Sounds mit einem beliebigen Soundaufnahmeprogramm auf, speichere sie in
dem Szenario-Ordner sounds und verwende sie in deinem Code.
Lösung: Wir hatten leider keine möglichkeit den Ton aufzunehmen.
Übung 4.1
Füge in den CrabWorld-Konstruktor deines eigenen Projekts Code ein, um wie oben
beschrieben automatisch eine Krabbe zu erzeugen.
Lösung:Wir haben den Code in den CrabWorld-Konstrucktor eingefügt, daher entstand beim öffnen des Szenarios eine Krabbe.
Code:addObject( new Krabbe(), 280, 280);
Übung 4.2
Füge in der CrabWorld Code ein, um automatisch drei Hummer zu erzeugen. Du
kannst dafür beliebige Positionen in deiner Welt wählen.
Lösung:Wir haben den Code für die automatische erzeugung von drei Hummern in den CrabWorld-Konstrucktor eingefügt.
Code: addObject(new lobster(), 90, 80);
addObject(new lobster(), 276, 190);
addObject(new lobster(), 380, 500);
Übung 4.3
Füge Code hinzu, um zehn Würmer an beliebigen Positionen in der CrabWorld zu
erzeugen.
Lösung:Wir haben den Code für die automatische erzeugung von zehn Würmen in den CrabWorld-Konstrucktor eingefügt
Code: Siehe Übung 4.5
Übung 4.4
Verschiebe in der Klasse CrabWorld den ganzen Code, der die Objekte erzeugt, in
eine eigene Methode namens populateWorld. Du musst die Methode
populateWorld selbst deklarieren (sie übernimmt keine Parameter und liefert nichts
zurück) und vom Konstruktor aus ausrufen. Versuche es einmal.
Lösung: public void populateWorld()
{
addObject( new Krabbe(), 280, 280);
addObject(new lobster(), 90, 80);
addObject(new Fritten(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Fritten(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Fritten(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
}
Übung 4.5
Verwende Zufallszahlen für die Koordinaten der Würmer. Dazu musst du deine
Koordinatenwerte durch Aufrufe ersetzen, die mittels der Klasse Greenfoot
Zufallszahlen generieren.
Lösung: Wir haben den Code für die Würmer so verändert das Jeder Wurm an einer zufälligen Stelle erscheint
Code: addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
Übung 4.6
Wirf einen Blick in die Dokumentation der Actor-Klasse. Dort findest du zwei
Methoden, die es uns erlauben, das Bild eines Akteurs zu ändern. Wie heißen sie
und wie lauten ihre Parameter? Was liefern sie zurück?
Lösung: Sie lauten beide setImage und liefern String Parameter zurück.
Übung 4.7
Bevor du diesen Code hinzufügst, klicke mit der rechten Maustaste auf ein KrabbenObjekt in deiner Welt und wähle aus dem aufspringenden Kontextmenü der Krabbe
den Befehl INSPIZIEREN. Notiere dir alle Variablen, die im Krabben, die im KrabbenProjekt angezeigt werden.
Lösung: int x, int y, private int mySequenceNumber, private int lastPaintSequenceNumber, int rotation, World world, private GreenfootImage image, private Object data, private Rect boundingRect, private int[] boundingXs, private int[] boundingYs, private int imageWidth, private int imageHeight
Übung 4.8
Warum glaubst du, hat die Krabbe überhaupt irgendwelche Variablen, auch wenn wir
keine in unserer Klasse Crab deklariert haben?
Lösung: Damit sie zum Beispiel weiß, ob sie gerade mit dem Rand oder auch einem Wurm/Hummer kolidiert.
Übung 4.9
Füge die Variablendeklarationen aus Listing 4.2 in deine Version der Klasse Crab
ein. Achte darauf, dass sich die Klasse übersetzen lässt.
Lösung:
public class Crab extends Animal
{
private GreenfootImage image1;
private GreenfootImage image2;
}
Übung 4.10
Nachdem du die Variablen ergänzt hast, erzeuge und inspiziere erneut dein
Krabben-Objekt. Notiere dir die Variablen und ihre Werte (die in den weißen
Kästchen angezeigt werden).
Lösung: int x (280), int y(280), private int mySequenceNumber (280), private int lastPaintSequenceNumber (0), int rotation (0), World world (?), private GreenfootImage image (?), private Object data ("null"), private Rect boundingRect (?), private int[] boundingXs (?), private int[] boundingYs (?), private int imageWidth (80), private int imageHeight (49)
Übung 4.11
Füge diesen Konstruktor in deine Crab-Klasse ein. Du wirst keine
Verhaltensänderungen bei der Krabbe beobachten können, aber die Klasse sollte
sich übersetzen lassen und du solltest in der Lage sein, Krabben zu erzeugen.
Lösung: public class Crab extends Animal
{
private GreenfootImage image1;
private GreenfootImage image2;
}
Übung 4.12
Inspiziere noch einmal dein Krabben-Objekt. Beachte auch hier wieder die Variablen
und ihre Werte. Vergleiche sie mit denen, die du zuvor notiert hast.
Lösung: Es hat sich nichts verändert
Übung 4.13
Füge den Code aus Listing 4.4 zum Alternieren der Bilder in die act-Methode deiner
Crab-Klasse ein. Versuche es einmal selbst. (Wenn du einen Fehler einbaust,
behebe ihn. Das Beispiel sollte funktionieren.) Klicke in Greenfoot auch ab und zu
auf den ACT-Button anstatt auf den RUN-Button – damit kannst du das Verhalten
etwas besser beobachten.
Lösung: Die Krabbe wechselt zwischen 2 Bildern
Übung 4.14
In Kapitel 3 haben wir besprochen, dass man für Unteraufgaben eigene Methoden
definieren sollte, anstatt immer mehr Code in die act-Methode zu packen. Übertrage
dieses Prinzip auf den Code zum Alternieren des Bildes: Erzeuge eine neue
Methode namens switchImage, verschiebe in diese deinen Code und rufe die
Methode von der act-Methode aus auf.
Lösung: public void switchImage()
{
if (getImage() == image1)
{
setImage(image2);
}
else
{
setImage(image1);
}
}
Übung 4.15
Rufe die Methode switchImage interaktiv von dem Kontextmenü der Krabbe aus auf.
Funktioniert das?
Lösung: Ja, auch hier wechselt die Krabbe zwischen den Bildern hin und her.
Übung 4.16
Füge den zuvor besprochenen Code in dein Szenario ein, teste ihn und stelle sicher,
dass er funktioniert.
Lösung: Die Methode hat wie gewünscht funktioniert.
Übung 4.17
Als zusätzliche Kontrolle kannst du den Objektinspektor für dein Krabben-Objekt
öffnen (wähle dazu einfach INSPIZIEREN aus den Kontextmenü der Krabbe), bevor du
mit dem Spielen anfängst. Lass den Inspektor geöffnet, während du spielst, und
beobachte die Variable wormsEaten.
Lösung: Sie wird mit jedem gefressenen Wurm 1 mehr.
Übung 4.18
Das Bild der Krabbe ändert sich beim Laufen sehr schnell, was die Krabbe ein wenig
hyperaktiv wirken lässt. Vielleicht wäre es netter, wenn sich das Bild der Krabbe nur
bei jedem zweiten oder dritten act-Schritt ändern würde. Versuche einmal, dies zu
implementieren. Dazu könntest du einen Zähler hinzufügen, der in der act-Methode
inkrementiert wird. Jedes Mal, wenn dieser Zähler 2 (oder 3) erreicht, ändert sich das
Bild und der Zähler wird wieder auf 0 zurückgesetzt.
Lösung: mithife einer Variable kann man mit diesem jeweils 2 act-schritte überspringen:
private int imageSwitch;
{
imageSwitch = 0;
}
Anleitung: Um die Krabbe zu steuern kann man die linke und rechte Pfeiltasten verwenden. Ziel ist mit der Krabbe alle Würmer zu Fresen ohne vom Hummer gefressen zu werden.
Um den Hummer zu steuern kann man die tasten A und D verwenden. Ziel ist es, die Krabbe aufzufressen. Das kann jedoch erst gelingen, nachdem amn drei Pommes gegessen hat.
Eigene **IDEEN**
1.Wir haben einen Multi-Player programmiert, dass bedeutet in unserem fall das man auch den Hummer steuern kann.
2.Der Hummer in unserem Szenario muss erst 3 Pommes essen damit er die Krabbe fressen kann.