Simulation von Geburt/Tod und "richtige" Erkennung eines Hindernisses

demika

Mitglied
Hallo zusammen,

ich bin noch ein Neuling wenn es ums Programmieren und dementsprechend auch um Java geht. Momentan bin ich dabei mit dem Programm Greenfoot eine eigene Simulation zu erstellen, bzw. ein bereits vorhandenes Szenario (siehe Anhang) zu erweitern. Dieses simuliert bisher einen Vogelschwarm. Nun möchte ich zwei Dinge hinzufügen:

1. sollen in festen Abständen Vögel sterben und neue Vögel "geboren" werden. Dabei hatte ich mir gedacht dass pro zehn Vögel ein neuer Vogel geboren werden soll. Dies soll in bestimmten Zyklen geschehen, bspw. alle 30 Runden. Ähnliches gilt für den Tod der Vögel: ebenfalls alle 30 Runden soll pro zwanzig Vögeln ein Tier sterben, also gelöscht werden. Dementsprechend: Geburtenrate 10%, Sterberate 5%.

2. Gibt es in dem Szenario nicht nur Vögel, sondern auch Bäume (welche allerdings nichts machen außer rumzustehen). Bisher ist es so, dass die Vögel den Bäumen zwar ausweichen, allerdings ein kleines Stück in den Baum "reinfliegen" ehe sie abdrehen. Lieber hätte ich es so, dass sobald der Rand eines Baums erreicht wird, der Vogel abdreht.

Soweit erstmal mein Plan. Für beide Probleme habe ich auch einen Ansatz, an der Umsetzung hapert es allerdings.

Zu 1. meine Idee war es, sich zuerst die gesamte Anzahl der Vögel über getObjects(bird.class) zu holen und diese dann mit 0,1 (Geburt) bzw. 0,05 (Tod) zu multiplizieren. Das jeweilige Ergebnis würde dann gerundet werden und alle 30 Runden die entsprechende Anzahl an Vögeln geboren werden bzw. verschwinden. Dafür hatte ich mir eine while-Schleife überlegt, welche grob so aussehen würde:

Java:
    int i = 0  
    while (i < Anzahl der Geburten)  
    {  
    addObject(new bird(), Greenfoot.getRandomNumber(900), Greenfoot.getRandomNumber(700));  
    i = i + 1  
    }

Gleiches dann halt für die sterbenden Vögel, allerdings mit der entsprechenden Zahl an Geburten und removeObject statt addObject. Keine Idee habe ich für die Frage, wie man es macht dass nur bei jedem dreißigsten Aufruf der act-Methode Vögel erzeugt/entfernt werden.

Zu 2. hier hatte ich eine zusätzliche Vogelklasse eingefügt, nur um zu testen ob meine Idee des Ausweichens funktioniert. Der Ansatz war es mit getObjectsInRange zu versuchen und zwar folgendermaßen:

Java:
    public void checkCollision()
    {
        List closeObjects = getObjectsInRange(15, Tree.class);
        if (closeObjects != null)
        {
            turn(20);
        }
    }

Dummerweise drehen sich diese Vögel ununterbrochen im Kreis, egal wie nach sie an einem Baum sind.

Würde mich sehr über Hilfe freuen, nicht nur damit das Szenario entsprechend modifiziert werden kann, sondern auch um aus der Lösung lernen zu können.

Viele Grüße
 

Anhänge

Für einen Programmieranfänger klingt das recht umfangreich.

Leider kann ich mit der Zip nichts anfangen, ist mir nich klar, wo das vorn und hinten ist.
Außerdem scheint Greenfoot.lib zu fehlen, ...

Aber vielleicht bin ich nur von Eclipse verwöhnt.
 
Für einen Programmieranfänger klingt das recht umfangreich.

Leider kann ich mit der Zip nichts anfangen, ist mir nich klar, wo das vorn und hinten ist.
Außerdem scheint Greenfoot.lib zu fehlen, ...

Aber vielleicht bin ich nur von Eclipse verwöhnt.

Du hast vollkommen Recht, da scheint irgendwas schiefgelaufen zu sein. Habe es mit zwei verschiedenen Packer-Programmen versucht, beide Male hats nicht geklappt. Gibt es noch eine andere Möglichkeit einen ganzen Ordner hochzuladen? Denn ich denke ohne den Ursprungscode wird es schwierig.

Umfangreich? Die gesamte Vogelsimulation ist bereits da, ich möchte nur meine zwei Verbesserungen einbauen, was doch nicht so viel ist. Oder täusche ich mich?

Viele Grüße
 
Zum ausführen benötigst du Greenfoot.

Das ist ein Framework um Programieranfängern in einem Crashkurs super schnell ergebnisse zu liefern.

Das Szenario, das er hochgeladen hat, uss man in ein Verzeichnis von Greenfoot packen und dann mit Greenfoot öffnen.
 
Ich denke es scheitert momentan an zwei Dingen:

1. wie kriege ich die aktuelle Gesamtzahl aller Objekte einer Klasse? Sprich ich möchte zu jeder Zeit wissen, wie viele Vögel grade leben (bzw. ich muss es nicht wissen, sondern Greenfoot).

Hatte mir folgendes gedacht, was allerdings aufgrund von List und int nicht funktioniert...

Java:
    private List killBirds(Class cls)
    {
        List allObjects = getWorld().getObjects(Boid.class);
        (allObjects*0.1) = currentAmount;
        for (int i = 0; i < currentAmount; i++)
        {
            int x = 500;
            int y = 200;
            addObject(new Boid(),x,y);
        }
    }

2. wie schaffe ich es, dass eine bestimmte Methode nur in bestimmten Abständen ausgeführt wird? Also bspw. wird die act-Methode in einer Dauerschleife ausgeführt und jedes 20. Mal soll dann die Methode XY ausgeführt werden.

Das mit dem exportieren mittels Eclipse hat irgendwie nicht funktioniert, habe im Anhang mal die jeweiligen java-Dateien der entsprechenden Klassen. Kann man ja einfach in Eclipse öffnen, hoffe es hilft.
 

Anhänge

Also ich kenne mich mit Greenfood jetzt nicht aus. Kenne die api nicht.

Aber wenn das korrekt ist:
Code:
List allObjects = getWorld().getObjects(Boid.class);
, dann wirdt
Code:
allObject.size()
die anzahl von "Boids" liefern.

Was bedeutet das?

Code:
(allObjects*0.1) = currentAmount;


Zu 2) Das ist sehr trivial. Da jeder Actor ein Object ist, kannst du in einer member variable die aufrufe von act() zählen und bei x % 10 kannst du dann eine methode ausführen.

eine while() schleife in der act () ethode ist falsch.

Bezieht sich die Frage auf eine der Dateien im Anhang?

Ich habe keine Lust mir das durchzuelsen.
 
Zu 2) Das ist sehr trivial. Da jeder Actor ein Object ist, kannst du in einer member variable die aufrufe von act() zählen und bei x % 10 kannst du dann eine methode ausführen.

eine while() schleife in der act () ethode ist falsch.

Bezieht sich die Frage auf eine der Dateien im Anhang?

Ich habe keine Lust mir das durchzuelsen.

Problem 1 ist gelöst. Problem 2, also der Aufruf einer Methode zu bestimmten Zeitpunkten, noch nicht. Hier mein Code, welcher sich compilieren lässt, allerdings werden leider nur ganz am Anfang einmal ein paar Boids zusätzlich erzeugt, jedoch nicht alle 10 Runden.
Java:
    private int timer = 0;  
      
    private void addBoids()  
    {  
        timer++;  
        if (timer < 10) return;  
        timer = 0;  
        int boidCount = getObjects(Boid.class).size();  
        int currentAmount = boidCount / 10;  
        for (int i = 0; i < currentAmount; i++)  
        {  
            int x = Greenfoot.getRandomNumber(900);  
            int y = Greenfoot.gerRandomNumber(200);  
            addObject(new Boid(),x,y);  
        }  
    }


Es gibt keine while-Schleife in der act() Methode, wenn man auf den "run" Button bei Greenfoot klickt wird die act() Methode so oft hintereinander aufgerufen, bis man auf stop klickt.
Bezieht sich zwar auf die Anhänge, diese muss man aber glaube ich nicht lesen um das Problem zu lösen...
 

Zurück
Oben