Spielprogrammierung mit Java
HomeAufgabenDruckenJava-Online

Aufgabe 8: Fisch Simulation

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:
double angle = (Math.random() * 20) - 10
Am Rand des Spielfensters drehen sie um 180°.

FishSimEx1_0.java im Online-Editor bearbeiten

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. Falls Sie nicht weiter kommen, hilft Ihnenfolgende Vorlage weiter:

FishSimEx2_0.java im Online-Editor bearbeiten

 


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
fishLoc.getDistanceTo(trapLoc) kleiner ist als 50, muss der Fisch um 180° drehen. Damit der Fisch die Falle "kennt", kann man es ihm als Parameter übergeben. Dazu muss die Klasse Fish wie folgt ergänzt werden:

class Fish extends Actor
{
  private FishTrap trap;
  
  {
    super(true"sprites/sfish.gif"2);
    this.trap = trap;
  }
}

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.

private void tryToMate()
{
  if (getNeighbours(10).size() != && Math.random() < 0.1)
  {
    .....
  }
}

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.

class AngryFish extends Fish
{
  public AngryFish(FishTrap trap)
  {
    show(1); 
  }

  public void tryToEat()
  {
  } 

  public void tryToMate()
  {
  }
}
 

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 ).