In vorliegender Aufgabe wird die Situation in einem Fisch-Teich simuliert:
Ex1: Fische bewegen sich zufällig hin und her In der Vorlage FishSimEx1_0.java werden 15 Fische erzeugt. Ergänzen Sie die Methode act() in der Klasse Fish so, dass die Fische bewegen. Nach jedem Schritt ändern sie ihre Bewegungsrichtung um einen zufälligen Winkel, z.Bsp: Programmcode downloaden: FishSimEx1_0.zip |
|||
Ex2: Fischfalle Seit kurzem gibt es im Teich eine Fischfalle. Wenn ein Fisch in die Fischfalle hineinschwimmt, wird er vernichtet. Die Fischfalle wird bei jedem Programmstart an eine neue, zufällig gewählte Position gesetzt. Um zu überprüfen, ob sich eine Fisch in der Fischfalle befindet, können Sie den GGActorCollisionListener mit der Callbackmethode collide(Actor actor1, Actor actor2) verwenden. Versuchen Sie zuerst selbst an Hand der Musterbeispiele, die Sie im Lernprogramm unter Präzise Kollisionserkennung finden, diese Aufgabe zu lösen. |
|||
Ex3: Fische sollen einer Fischfalle ausweichen Die Fische haben
keine Ahnung, wie man einer Fischfalle ausweicht. Jetzt ist es an Ihnen, es ihnen beizubringen. Schreiben Sie eine Methode tryToAvoidTrap() in der Klasse Fish. Wenn der Abstand zwischen dem Fisch und der Falle
Auch beim Erzeugen jedes Fisch-Objekts ist dieser Parameter notwendig. Actor fish = new Fish(trap); Man könnte sogar "lernfähige" Fische programmieren. Die Position der Fischfalle wird erst danach der erste Fisch hineingelockt und vernichtet wurde ermittelt.
|
|||
Ex4: Fische vermehren sich Bringen Sie den Fischen bei, sich zu paaren. Das geschieht, wenn zwei Fische nahe zusammen sind. Die Tatsache, dass sich nicht alle mit allen paaren möchten und dass es Mänchen und Weibchen gibt, können Sie mit einer "Paarungswahrscheinlichkeit" erfassen, die z. Bsp. auf 0.1 gesetzt werden kann. Zusätzlich kann man die Paarungsrate reduzieren, in dem sich die Fische nach dem Paaren immer einige Simulationszyklen ausruhen müssen. Ergänzen Sie die Klasse Fish mit der Methode tryToMate(), die bewirken soll, dass untergünstigen Umständen ein neuer Fisch erzeugt wird.
Es ist vorteilhaft die Zahlenparameter 10 und 0.1 als Instanzvariablen in der Klasse Fish zu deklarieren (z.B. private double matingProbability = 0.1), damit diese bei Bedarf schnell angepasst werden können.
|
|||
Ex5: Raubfische Jetzt hat es wieder zu viele Fische im Teich. Neu gibt es aber Raubfische im Teich, die den Fischbestand reduzieren. Die Klasse AngryFish, ist eine Unterklasse von Fish, da der Raubfisch viele Verhaltensweisen von den normalen Fischen übernimmt. Zu Beginn ist nur ein Raubfisch da. Wenn er 3 Fische gefressen hat, entsteht ein neuer Raubfisch. Ergänzen Sie die Klasse AngryFish mir der Methode tryToEat(). Damit die Vererbung funktioniert muss die Methode tryToEat() auch in der Klasse Fish() existieren (sie kann hier leer sein) und wird im Konstruktor der Klasse Fish aufgerufen. Wenn es bald zu viele Raubfische gibt, können Sie ihren Bestand reduzieren, in dem Sie diese in die Falle laufen lassen (die Methode tryToAvoidTrap() in der Klasse AngryFish durch eine leere überschreiben). Sie müssen auch die Methode tryToMate() anpassen.
|
Die Aufgabe kann weiter entwickelt werden, in dem man den Fischen Schwarm-Verhalten beibring. Fischschärme bewegen sich ähnlich wie Vögelschwärme (siehe Schwarmsimulation ).