Schwarm-Simulation

Übersicht BlitzBasic Codearchiv

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen

 

CodeMaster

BeitragMi, Jan 21, 2004 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde es ein wenig schade, dass dasjenige, worauf ich eigentlich am meisten stolz war, nämlich der Schwanz, in der jetzigen Simulation etwas zu hintergründig ist. Ich fänds besser, wenn du den wieder ein wenig hervorheben (und vor allem bei den weiblichen Organismen wieder anbauen [auch wenn's keine große Schwierigkeit darstellt, das selbst zu machen]) könntest.

Ansonsten wunderbar! Musst nur drauf achten, dass die Übersichtstabelle den eigentlichen Augenmerk, also die Organismen, nicht zu sehr überdeckt - sonst hat man ja nix davon Wink
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
 

bommelid

BeitragMi, Jan 21, 2004 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@wunderkind: Das stimmt leider. Bin mit BB auch noch nicht vertraut.
Wie müßte die berechnungen von der Zeit entkoppeln. Gleichzeitig muß es aber eine max. Geschwindigkeit geben, da man sonst am Anfang gar nichts sehen würde.
Da müsst Ihr mir schon etwas Unterstützung geben.
Trotzdem mal wieder eine Änderung. Anzeige für Nachkommen/Org. ist da, geht aber nicht richtig (bei kleiner 2 sollte die Zahl der Organismen ja abnehmen).
Mit F1-F4 könnt Ihr verschiedene Sachen ausblenden (Birthplaces, Food, ...), um den Ablauf etwas zu beschleunigen.

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

AppTitle "Schwarm-Simulation 2"

Const StartingPop = 100
Const Lifetime = 30
Const Lifetimediffer# = 2
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const twinprob# = 0.012
Const tripletprob# = 0.00014
Const satisfiedtime = 5

Global ShowRelationships = True
Global ShowBirthplaces = False
Global ShowOrganisms = True
Global isFood = False
Global births = 0
Global twins = 0
Global triplets = 0
Global deaths = 0
Global maxpop
Global minpop = StartingPop
Global starttime = MilliSecs()
Global maxlifeexpectancy# = 0
Global minlifeexpectancy# = Lifetime+Lifetimediffer#
Global avAge#
Global avchildren#
Global avLifetime#
Global LivingfemOrganisms
Global LivingmaleOrganisms
Global Organisms = Startpop

Type FoodSource
 Field x#
 Field y#
 Field foodpoints
 Field origintime
End Type

Type Organism
 Field x#
 Field y#
 Field dir#
 Field speed#
 Field movement
 Field birthtime
 Field partner
 Field lastchild
 Field gender%
 Field lastfood
 Field lifeexpectancy#
 Field children
End Type

Type Birthplace
 Field x#
 Field y#
 Field expiry
End Type

CreateSwarm(StartingPop)

While Not KeyHit(1)
 If KeyHit(59) Then ShowRelationships = Not ShowRelationships
 If KeyHit(60) Then ShowBirthplaces = Not ShowBirthplaces
 If KeyHit(61) Then isFood = Not isFood
 If KeyHit(62) Then ShowOrganisms = Not ShowOrganisms
 Cls
 UpdateSwarm
 UpdateBirthplaces
 ShowSwarm
 If isFood Then ShowFood
 Flip
Wend
End

Function CreateSwarm(OrganismCount)
 For i = 1 To OrganismCount
  CreateOrganism(Rnd(GraphicsWidth()),Rnd(GraphicsHeight()),Lifetime)
 Next
End Function

Function newFoodSource(x#, y#)
 Temp.FoodSource = New FoodSource
 Temp\x# = x#
 Temp\y# = y#
 Temp\foodpoints = 10
 Temp\origintime = MilliSecs()
End Function

Function CreateOrganism(x#,y#,Lifetimetemp#)
 Temp.Organism = New Organism
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 Temp\speed = 0
 Temp\movement = Rand(360)
 Temp\birthtime = MilliSecs()
 Temp\partner = 0
 Temp\lastchild = MilliSecs()
 Temp\gender% = Rand(0,1)
 Temp\lastfood = MilliSecs()
 Temp\lifeexpectancy# = Lifetimetemp# + Rnd(-Lifetimediffer#,Lifetimediffer#)
 Temp\children = 0
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
 Organisms = Organisms + 1
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Temp\lifeexpectancy#*1000 Then
   newFoodSource(Temp\x#,Temp\y#)
   Delete Temp
   deaths = deaths + 1
  Else
   Temp\Speed# = Temp\speed# + Rnd(-1,1)
   If Temp\Speed# < 0 Then Temp\speed# = 0
   If Temp\Speed# > 4 Then Temp\speed# = 4
   Temp\movement = (Temp\movement + Temp\speed# * 10) Mod 360
   If Temp\partner Then
    Partner.Organism = Object.Organism(Temp\partner)
    If Partner = Null Then
     Temp\partner = 0
    Else
    If Partner\gender% = Temp\gender% Then
     Temp\partner = 0
     Else
      If distance#(Temp\x,Temp\y,Partner\x,Partner\y) > 50 Then
       Temp\partner = 0
       Partner\partner = 0
      Else
       If ShowRelationShips Then Line Temp\x#,Temp\y#,Partner\x#,Partner\y#
       Temp\dir# = Temp\dir# + Sgn(turnto(Temp\x#,Temp\y#,Partner\x#,Partner\y#,Temp\dir#)) * Temp\speed# * 2
       If distance#(Temp\x#,Temp\y#,Partner\x#,Partner\y#) < 10 Then
        If (age(Temp\lastchild) > Temp\gender * ImpotentPeriod * 1000) And (age(Partner\lastchild) > Partner\gender * ImpotentPeriod * 1000) Then
       births = births + 1
       Temp\children = Temp\children + 1
       Partner\children = Partner\children + 1
         multibirth# = Rnd(0, 1)
       CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2)
       If multibirth# <= twinprob# Then
        births = births + 1
        twins = twins + 1
        Temp\children = Temp\children + 1
        Partner\children = Partner\children + 1
        CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2)
       EndIf
       If multibirth# <= tripletprob# Then
        twins = twins - 1
        births = births + 1
        triplets = triplets + 1
        Temp\children = Temp\children + 1
        Partner\children = Partner\children + 1
        CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2)
       EndIf
         Temp\lastchild = MilliSecs()
         Partner\lastchild = MilliSecs()
         Temp\partner = 0
         Partner\partner = 0
        EndIf
       EndIf
      EndIf
     EndIf
    EndIf
   Else
    For NewPartner.Organism = Each Organism
     If (Not Handle(NewPartner) = Handle(Temp)) Then
      If distance#(Temp\x#,Temp\y#,NewPartner\x#,NewPartner\y#) < 30 Then
       If NewPartner\partner = 0 Then

        If (age(Temp\birthtime) > PotentAge * 1000) And (age(NewPartner\birthtime) > PotentAge * 1000) Then
         If (age(Temp\lastchild) > NoPleasurePeriod * 1000) And (age(NewPartner\lastchild) > NoPleasurePeriod * 1000) Then
          Temp\partner = Handle(NewPartner)
          NewPartner\partner = Handle(Temp)
         EndIf
        EndIf
       EndIf
      EndIf
     EndIf
    Next
    Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
   EndIf
   Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed#
   Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed#
   If Temp\x# < 0 Then Temp\x# = Temp\x# + GraphicsWidth()
   If Temp\x# > GraphicsWidth() Then Temp\x# = Temp\x# - GraphicsWidth()
   If Temp\y# < 100 Then Temp\y# = Temp\y# + GraphicsHeight() - 100
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight() + 100

  EndIf
 Next
End Function

Function ShowFood()
 For Temp.FoodSource = Each FoodSource
  If age(Temp\origintime) > 10*1000 Then
   Delete Temp
  Else
   Color 0,(255-25*age(Temp\origintime)/1000),0
   Oval Temp\x#,Temp\y#,5+Temp\foodpoints,5+Temp\foodpoints,1
  EndIf
 Next
 Color 255,255,255
End Function

Function ShowSwarm()
 avAge# = 0
 avLifetime# = 0
 avchildren# = 0
 LivingfemOrganisms = 0
 LivingmaleOrganisms = 0
 For Temp.Organism = Each Organism
  If Temp\lifeexpectancy# > maxlifeexpectancy# Then maxlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\lifeexpectancy# < minlifeexpectancy# Then minlifeexpectancy# = Temp\lifeexpectancy#
  avLifetime# = avLifetime# + Temp\lifeexpectancy#
  hunger = (MilliSecs() - Temp\lastfood)/1000
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - age(Temp\birthtime) * 255 / (Temp\lifeexpectancy# * 1000)
  If clr < 0 Then clr = 0
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  If ShowOrganisms Then DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement,Temp\gender%)
  avAge# = avAge# + age(Temp\birthtime) / 1000
  avchildren# = avchildren# + Temp\children
 Next
 Color 255,0,0
 Text 1,1,"Lebendige weibliche Organismen: " + LivingfemOrganisms
 Color 0,0,255
 Text 1,15,"Lebendige männliche Organismen: " + LivingmaleOrganisms
 Color 255,255,255
 Text 1,30,"Lebendige Organismen insgesamt: " + (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,45,"  höchste Lebenserwartung: " + maxlifeexpectancy#
 Text 1,60,"geringste Lebenserwartung: " + minlifeexpectancy#
 avLifetime# = avLifetime# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,75,"durchschn.Lebenserwartung: " + avLifetime#
 Text 300,0,"Geburten insgesamt: " + births
 Text 300,15," Zwillingsgeburten: " + twins
 Text 300,30," Drillingsgeburten: " + triplets
 avAge# = avAge# / (LivingfemOrganisms+LivingmaleOrganisms)
 avchildren# = avchildren# / Organisms
 Text 300,45,"   durchschn.Alter: " + avAge#
 Text 300,60,"   Nachkommen/Org.: " + avchildren#
 If LivingfemOrganisms+LivingmaleOrganisms > maxpop Then
  maxpop = LivingfemOrganisms+LivingmaleOrganisms
 ElseIf LivingfemOrganisms+LivingmaleOrganisms < minpop Then
  minpop = LivingfemOrganisms+LivingmaleOrganisms
 EndIf
 Text 550,0,"tragische Todesfälle: " + deaths
 Text 550,15," maximale Population: " + maxpop
 Text 550,30," minimale Population: " + minpop
 AppTitle "Schwarm Simulation 2 - Zeit in sek.: " + (MilliSecs() - starttime)/1000
 Color 255,255,255
End Function

Function UpdateBirthplaces()
 For Temp.Birthplace = Each Birthplace
  Temp\expiry = Temp\expiry + 1
  If Temp\expiry > 100 Then
   Delete Temp
  Else
   If ShowBirthplaces Then
    clr = 255 - 255 * Temp\expiry / 100
    size = 100 * Temp\expiry / 100
    Color 0,clr,0
    Oval Temp\x#-size/2,Temp\y#-size/2,size,size,0
   EndIf
  EndIf
 Next
End Function

Function age(birthtime)
 Return MilliSecs() - birthtime
End Function

Function distance#(x1#,y1#,x2#,y2#)
 Return Sqr((x2-x1)^2+(y2-y1)^2)
End Function

Function turnto(x1#,y1#,x2#,y2#,dir#)
 Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360
 If Temp# > 180 Then Temp# = Temp# - 360
 Return Temp#
End Function

Function DrawOrganism(x#,y#,dir#,size#,anim,gender%)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 If gender% = 0 Then 
  nx# = x# + Cos(dir#) * size# / 2
  ny# = y# + Sin(dir#) * size# / 2
 
  For i = 1 To size#/2
   ox# = nx#
   oy# = ny#
   nx# = x# + Cos(180 + dir#) * (size# / 2 + i*4) + Cos(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   ny# = y# + Sin(180 + dir#) * (size# / 2 + i*4) + Sin(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   Line ox#,oy#,nx#,ny#
  Next
 EndIf
End Function


PS: mein ältester Organismus war vohin mal über 40s (bei Startwert von 30s)
 

bommelid

BeitragMi, Jan 21, 2004 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
@CodeMaster: ok, der Schwanz kommt wieder rein (sicher in Stufen ausblendbar).
Dabei ging es mir nur um die Geschwindigkeit des Programms. Nicht böse sein Very Happy
Das ganze Sin/Cos Zeug braucht halt immer arg viel Rechenzeit.

Die Statistik sollte die Organismen eigentlich nicht mehr überdecken.

Gruß
bommelid

BigSnake

BeitragMi, Jan 21, 2004 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Lösung wäre es schlicht für die 360° die sin/cos Werte am Anfang des Programms vorzuberechnen und in einem Array zu speichern.

Mandrason

BeitragMi, Jan 21, 2004 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sit so genial!!!
Irren ist menschlich, und manche Menschen sind Irre

Albert Einstein
 

bommelid

BeitragMi, Jan 21, 2004 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@CodeMaster: Bitte nicht schlagen aber da ich ein wenig mit dem vererben von Eigenschaften experimentieren will, wollte ich den Frauen doch keine Schwänze mehr geben. Ich wollte die NoPleasurePeriod von der Länge abhängig machen (also je länger, desto kürzer die NoPleasurePeriod). Gibt es einen männlichen Nachkommen, wird die Länge mitvererbt (+/- ein Faktor, wie bei der Lebenserwartung).
Gleichzeitig sinkt mit zunehmender Länge aber die max. Geschwindigkeit des Männchens (kann ja nicht nur Vorteile geben!).
Wenn Du damit nicht einverstanden bist, benutze ich dafür halt ein anderes Merkmal.

@all: Bitte macht mal Vorschläge, was man noch so an "Genen" einbauen könnte.

z.B. max. Geschwindigkeit, NoPleasurePeriod, vermehrte Häufigkeit von Mehrlingsgeburten usw.
Oder auch eine Mutationsrate, die unabhängig von den Genen der Eltern, die Eigenschaften start verändern kann (die dürfte natürlich nur minimal sein, sonst rennen da nur noch Mutanten über den Bildschirm).

Gruß
bommelid

Mr.Keks

BeitragMi, Jan 21, 2004 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
genetisch sollten die viecher immer zwei werte transportieren, wovon einer halt inaktiv ist. hatte sowas in der schule zwar noch nicht, aber ich denke, das wäre besser.
die parungsgeschwindigkeit sowie die -reichweite sollte auch vererbbar sein. wenn man lust hat, kann man ja auch noch machen, dass sich die farbe etwas verändert und man mit einer bestimmten farbtönungsrichtung auf der einen bildschirmseite höhere überlebenschancen hat Wink.
ich weiß nicht, ob es das im code schon gibt, aber evtl auch soetwas wie eine weibchenzielsuche, die genetisch ihre quallität verändern kann.
ein bereich des bildschirms, in dem mutationen verstärkt vorkommen wäre übrigens lustig Wink
MrKeks.net
 

bommelid

BeitragMi, Jan 21, 2004 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Inarie hat Folgendes geschrieben:
genetisch sollten die viecher immer zwei werte transportieren, wovon einer halt inaktiv ist. hatte sowas in der schule zwar noch nicht, aber ich denke, das wäre besser.

Wieso denkst Du, das wäre besser?

Zitat:
die parungsgeschwindigkeit sowie die -reichweite sollte auch vererbbar sein. wenn man lust hat, kann man ja auch noch machen, dass sich die farbe etwas verändert und man mit einer bestimmten farbtönungsrichtung auf der einen bildschirmseite höhere überlebenschancen hat Wink.

Finde ich sehr gut. Besonders das mit der vorteilhaften Farbe in bestimmten Bereichen (sowas wie mit dunklerer Haut nicht so sonnenempfindlich zu sein).

Zitat:
ich weiß nicht, ob es das im code schon gibt, aber evtl auch soetwas wie eine weibchenzielsuche, die genetisch ihre quallität verändern kann.

Interessant, aber das werde ich wohl nach hinten schieben. Kann ja gerne jemand übernehmen.

Zitat:
ein bereich des bildschirms, in dem mutationen verstärkt vorkommen wäre übrigens lustig Wink

Finde ich auch sehr gut. Bereiche mit verstärkter Mutationsrate, verringerter Beweglichkeit, erhöhter Parungsdauer usw.
Aber die Viecher müßten dann auch lernen und das Wissen weitervererben können.

Gruß
bommelid
 

Buddah

BeitragMi, Jan 21, 2004 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hab da noch nen paar ideen:

1. Wählerische weibchen.. es ist in der natur so das Weibchen auf die größten, buntesten. stärksten, mächtigesten etc Männchen stehen..
das hieße z.b. das weibchen mit einer sehr geringeren wahrscheinlichkeit
Mutanten nehmen zur paarung.

2. wie wäre es mit einem Feind ?! der im grunde genauso "funktioniert" wie die kleinen racker.. nur das sie die kleinen racker als nahrungsquelle haben Wink

3. so art umwelt katastrophen.. plötzlicher nahrungs mangel... vergiftete nahrung mit auswirkung auf mutations rate und/oder lebenszeit des nachwuchses etc.
Alles ist gut so wie es ist und bald wird alles anders.
 

bommelid

BeitragDo, Jan 22, 2004 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe den Organismen mal noch die Eigenschaft "Attraktivität" gegeben.
Je attraktiver das Männchen, desto kürzer die Dauer der Paarung.
Die Attraktivität des Weibchens wird dabei noch nicht berücksichtigt, fließt allerdings in die des Nachwuchses mit ein.
Langfristig sollte die durchschnittliche Attraktivität steigen. Das konnte ich zwar auch nachvollziehen, allerdings ist es durch den zusätzlichen Zeitfaktor bei der Paarung nicht so leicht, wieder ein Gleichgewicht zu finden. Selbst bei 50 Startorganismen und 35 Jahren Lebenserwartung war die Population nach kurzer Zeit ausgestorben.

Gruß
bommelid
 

bommelid

BeitragDo, Jan 22, 2004 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
wieder ein Update, diesmal mit Raubtier.
Das Vieh sucht sich immer den Organismus, der ihm am nächsten ist und bewegt sich in die Richtung. Ist ein ganzes Rudel in der Nähe, bringt das den Räuber durcheinander und er weiß nicht, welches Opfer er sich aussuchen soll (also fast wie im richtigen Leben).
Ab einer gewissen Distanz fliehen die Organismen in die dem Räuber entgegengesetzte Richtung. Der ist aber etwas schneller. Sterben kann das Teil übrigens noch nicht (zwar kein Problem aber ich wollte erstmal testen).

Code: [AUSKLAPPEN]
AppTitle "Schwarm-Simulation 2"

Const StartingPop = 50
Const Lifetime = 35
Const Lifetimediffer# = 2
Const PotentAge = 6
Const ImpotentPeriod = 5
Const NoPleasurePeriod = 2
Const twinprob# = 0.012
Const tripletprob# = 0.00014
Const satisfiedtime = 10
Const coupletime# = 0.5
Const Normattractivity = 1

Global ShowRelationships = True
Global ShowBirthplaces = False
Global ShowOrganisms = True
Global isFood = False
Global births = 0
Global twins = 0
Global triplets = 0
Global deaths = 0
Global maxpop
Global minpop = StartingPop
Global starttime = MilliSecs()
Global maxlifeexpectancy# = 0
Global minlifeexpectancy# = Lifetime+Lifetimediffer#
Global avAge#
Global avchildren#
Global avLifetime#
Global LivingfemOrganisms
Global LivingmaleOrganisms
Global Organisms = Startpop
Global Lasttic
Global tail = 1
Global maxspeed# = 4
Global escapedist = 50
Global PredSize = 15
Global predvictums = 0


Dim costab#(360)
Dim sintab#(360)

Type FoodSource
 Field x#
 Field y#
 Field foodpoints
 Field origintime
End Type

Type Predator
 Field x#
 Field y#
 Field dir#
 Field size#
 Field speed#
 Field speedfactor#
 Field movement
End Type

Type Organism
 Field x#
 Field y#
 Field dir#
 Field speed#
 Field speedfactor#
 Field movement
 Field birthtime
 Field partner
 Field lastchild
 Field gender%
 Field lastfood
 Field lifeexpectancy#
 Field children
 Field attractivity#
 Field startcouple
 Field maxspeed#
End Type

Type Birthplace
 Field x#
 Field y#
 Field expiry
End Type

Function init()
 Graphics 800,600,0,2
 SetBuffer BackBuffer()
 SeedRnd MilliSecs()
 For counter=0 To 360
  costab#(counter) = Cos(counter)
  sintab#(counter) = Sin(counter)
 Next
 CreateSwarm(StartingPop)
 CreatePredator(Rnd(800),Rnd(540)+100)
End Function

Function CreateSwarm(OrganismCount)
 For i = 1 To OrganismCount
  CreateOrganism(Rnd(GraphicsWidth()),Rnd(GraphicsHeight()),Lifetime,Normattractivity)
 Next
End Function

Function newFoodSource(x#, y#)
 Temp.FoodSource = New FoodSource
 Temp\x# = x#
 Temp\y# = y#
 Temp\foodpoints = 10
 Temp\origintime = MilliSecs()
End Function

Function CreatePredator(x#,y#)
 Temp.Predator = New Predator
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 temp\size = PredSize
 Temp\speed# = 3
 Temp\speedfactor# = 1
 Temp\movement = Rand(360)
End Function

Function CreateOrganism(x#,y#,Lifetimetemp#,attractivity#)
 Temp.Organism = New Organism
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 Temp\speed = 0
 Temp\speedfactor = 1
 temp\maxspeed# = maxspeed + Rnd(-1,1)
 Temp\movement = Rand(360)
 Temp\birthtime = MilliSecs()
 Temp\partner = 0
 Temp\lastchild = MilliSecs()
 Temp\gender% = Rand(0,1)
 Temp\lastfood = MilliSecs()
 Temp\lifeexpectancy# = Lifetimetemp# + Rnd(-Lifetimediffer#,Lifetimediffer#)
 Temp\children = 0
 Temp\attractivity# = attractivity# + Rnd(-0.2,0.2)
 Temp\startcouple = MilliSecs() + Temp\lifeexpectancy# * 1000
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
 Organisms = Organisms + 1
End Function

Function UpdatePredator()
 For Temp.Predator = Each Predator
  Temp\Speed# = Temp\speed# + Rnd(-1,1)
  If Temp\Speed# < 0 Then Temp\speed# = 0
  If Temp\Speed# > 6 Then Temp\speed# = 6
  Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
  nearest# = 1000
  For tmporg.Organism = Each Organism
   If distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < PredSize Then
    Delete tmporg
    deaths = deaths + 1
   predvictums = predvictums + 1
   ElseIf distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < nearest# Then
    nearest# = distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#)
   dirtofood# = ATan((Temp\y# - tmporg\y#) / (Temp\x# - tmporg\x#))
   If dirtofood# < 0 Then dirtofood# = dirtofood# + 360
   If tmporg\x# < Temp\x# Then dirtofood# = (dirtofood# + 180) Mod 360
    Temp\dir# = (dirtofood#) Mod 360
   EndIf
  Next
  Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
  Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  If Temp\x# < 0 Then Temp\x# = Temp\x# + GraphicsWidth()
  If Temp\x# > GraphicsWidth() Then Temp\x# = Temp\x# - GraphicsWidth()
  If Temp\y# < 100 Then Temp\y# = Temp\y# + GraphicsHeight() - 100
  If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight() + 100
 Next
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Temp\lifeexpectancy#*1000 Then
   newFoodSource(Temp\x#,Temp\y#)
   Delete Temp
   deaths = deaths + 1
  Else
   Temp\Speed# = Temp\speed# + Rnd(-1,1)
   If (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $408040 Then
    Temp\speedfactor# = 0.5
   ElseIf (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $000000 Then
    Temp\speedfactor# = 1
   EndIf
   If Temp\Speed# < 0 Then Temp\speed# = 0
   If Temp\Speed# > Temp\maxspeed# Then Temp\speed# = Temp\maxspeed#
   Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
   If Temp\partner Then
    Partner.Organism = Object.Organism(Temp\partner)
    If Partner = Null Then
     Temp\partner = 0
    Else
    If Partner\gender% = Temp\gender% Then
     Temp\partner = 0
     Else
      If distance#(Temp\x,Temp\y,Partner\x,Partner\y) > 50 Then
       Temp\partner = 0
       Partner\partner = 0
      Else
       If ShowRelationShips Then Line Temp\x#,Temp\y#,Partner\x#,Partner\y#
       Temp\dir# = Temp\dir# + Sgn(turnto(Temp\x#,Temp\y#,Partner\x#,Partner\y#,Temp\dir#)) * Temp\speed# * 2 * Temp\speedfactor#
       If distance#(Temp\x#,Temp\y#,Partner\x#,Partner\y#) < 10 Then
        If (age(Temp\lastchild) > Temp\gender * ImpotentPeriod * 1000) And (age(Partner\lastchild) > Partner\gender * ImpotentPeriod * 1000) Then
         If (Temp\gender = 1) And (age(Temp\startcouple) > (coupletime# / Partner\attractivity#) * 1000) Then
       ElseIf (Temp\gender = 0) And (age(Partner\startcouple) > (coupletime# / Temp\attractivity#) * 1000) Then
         births = births + 1
        Temp\children = Temp\children + 1
        Partner\children = Partner\children + 1
          multibirth# = Rnd(0, 1)
        CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2)
        If multibirth# <= twinprob# Then
         births = births + 1
         twins = twins + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
         CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2)
        EndIf
        If multibirth# <= tripletprob# Then
         twins = twins - 1
         births = births + 1
         triplets = triplets + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
         CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2)
        EndIf
          Temp\lastchild = MilliSecs()
          Partner\lastchild = MilliSecs()
          Temp\partner = 0
          Partner\partner = 0
         EndIf
       EndIf
       EndIf
      EndIf
     EndIf
    EndIf
   Else
    For NewPartner.Organism = Each Organism
     If (Not Handle(NewPartner) = Handle(Temp)) Then
      If distance#(Temp\x#,Temp\y#,NewPartner\x#,NewPartner\y#) < 30 Then
       If NewPartner\partner = 0 Then

        If (age(Temp\birthtime) > PotentAge * 1000) And (age(NewPartner\birthtime) > PotentAge * 1000) Then
         If (age(Temp\lastchild) > NoPleasurePeriod * 1000) And (age(NewPartner\lastchild) > NoPleasurePeriod * 1000) Then
          Temp\partner = Handle(NewPartner)
        Temp\startcouple = MilliSecs()
          NewPartner\partner = Handle(Temp)
        NewPartner\startcouple = MilliSecs()
         EndIf
        EndIf
       EndIf
      EndIf
     EndIf
    Next
    Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
   EndIf
   For tmppred.Predator = Each Predator
   If distance#(Temp\x#,Temp\y#,tmppred\x#,tmppred\y#) < escapedist Then
    dirtopred# = ATan((Temp\y# - tmppred\y#) / (Temp\x# - tmppred\x#))
    If dirtopred# < 0 Then dirtopred# = dirtopred# + 360
    If tmppred\x# < Temp\x# Then dirtopred# = (dirtopred# + 180) Mod 360
    Temp\speed# = Temp\maxspeed#
    Temp\dir# = (dirtopred# + 180) Mod 360
      EndIf
   Next
   Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   If Temp\x# < 0 Then Temp\x# = Temp\x# + GraphicsWidth()
   If Temp\x# > GraphicsWidth() Then Temp\x# = Temp\x# - GraphicsWidth()
   If Temp\y# < 100 Then Temp\y# = Temp\y# + GraphicsHeight() - 100
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight() + 100
  EndIf
 Next
End Function

Function ShowFood()
 For Temp.FoodSource = Each FoodSource
  If age(Temp\origintime) > 10*1000 Then
   Delete Temp
  Else
   Color 0,(255-25*age(Temp\origintime)/1000),0
   Oval Temp\x#,Temp\y#,5+Temp\foodpoints,5+Temp\foodpoints,1
  EndIf
 Next
 Color 255,255,255
End Function

Function ShowPredator()
 For Temp.Predator = Each Predator
  DrawPredator(Temp\x#,Temp\y#,Temp\size,Temp\dir#,Temp\movement)
 Next
End Function

Function ShowSwarm()
 minattractivity# = 5
 LivingfemOrganisms = 0
 LivingmaleOrganisms = 0
 For Temp.Organism = Each Organism
  If Temp\lifeexpectancy# > maxlifeexpectancy# Then maxlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\lifeexpectancy# < minlifeexpectancy# Then minlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\attractivity# < minattractivity# Then minattractivity# = Temp\attractivity#
  If Temp\attractivity# > maxattractivity# Then maxattractivity# = Temp\attractivity#
  avLifetime# = avLifetime# + Temp\lifeexpectancy#
  avattractivity# = avattractivity# + Temp\attractivity#
  hunger = (MilliSecs() - Temp\lastfood)/1000
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - age(Temp\birthtime) * 255 / (Temp\lifeexpectancy# * 1000)
  If clr < 0 Then clr = 0
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  If ShowOrganisms Then DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Temp\lifeexpectancy*1000)+5,Temp\movement,Temp\gender%,Temp\attractivity)
  avAge# = avAge# + age(Temp\birthtime) / 1000
  avchildren# = avchildren# + Temp\children
 Next
 Color 255,0,0
 Text 1,1,"Lebendige weibliche Organismen: " + LivingfemOrganisms
 Color 0,0,255
 Text 1,12,"Lebendige männliche Organismen: " + LivingmaleOrganisms
 Color 255,255,255
 Text 1,30,"Lebendige Organismen insgesamt: " + (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,45,"  höchste Lebenserwartung: " + maxlifeexpectancy#
 Text 1,60,"geringste Lebenserwartung: " + minlifeexpectancy#
 avLifetime# = avLifetime# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,75,"durchschn.Lebenserwartung: " + avLifetime#
 Text 300,0,"Geburten insgesamt: " + births
 Text 300,15," Zwillingsgeburten: " + twins
 Text 300,30," Drillingsgeburten: " + triplets
 Text 300,45,"max. Attraktivität: " + maxattractivity
 Text 300,60,"min. Attraktivität: " + minattractivity
 avattractivity# = avattractivity# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 300,75,"durchschn.Attrakt.: " + avattractivity
 
 If LivingfemOrganisms+LivingmaleOrganisms > maxpop Then
  maxpop = LivingfemOrganisms+LivingmaleOrganisms
 ElseIf LivingfemOrganisms+LivingmaleOrganisms < minpop Then
  minpop = LivingfemOrganisms+LivingmaleOrganisms
 EndIf
 Text 550,0," natürl. Todesfälle: " + (deaths - predvictums)
 Text 550,15,"      Raubtieropfer: " + predvictums
 Text 550,30,"maximale Population: " + maxpop
 Text 550,45,"minimale Population: " + minpop
 avAge# = avAge# / (LivingfemOrganisms+LivingmaleOrganisms)
 avchildren# = avchildren# / Organisms
 Text 550,45,"durchschn.Alter: " + avAge#
 Text 550,60,"Nachkommen/Org.: " + avchildren#
 AppTitle "Schwarm Simulation 2 - Zeit in sek.: " + (MilliSecs() - starttime)/1000
 Color 255,255,255
End Function

Function UpdateBirthplaces()
 For Temp.Birthplace = Each Birthplace
  Temp\expiry = Temp\expiry + 1
  If Temp\expiry > 100 Then
   Delete Temp
  Else
   If ShowBirthplaces Then
    clr = 255 - 255 * Temp\expiry / 100
    size = 100 * Temp\expiry / 100
    Color 0,clr,0
    Oval Temp\x#-size/2,Temp\y#-size/2,size,size,0
   EndIf
  EndIf
 Next
End Function

Function age(birthtime)
 Return MilliSecs() - birthtime
End Function

Function distance#(x1#,y1#,x2#,y2#)
 Return Sqr((x2-x1)^2+(y2-y1)^2)
End Function

Function turnto(x1#,y1#,x2#,y2#,dir#)
 Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360
 If Temp# > 180 Then Temp# = Temp# - 360
 Return Temp#
End Function

Function DrawPredator(x#,y#,size#,dir#,anim)
 Color 128,128,128
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx1# = x# + Cos(dir#-5) * size# / 2
 ny1# = y# + Sin(dir#-5) * size# / 2
 nx2# = x# + Cos(dir#+5) * size# / 2
 ny2# = y# + Sin(dir#+5) * size# / 2
 For i = 1 To size# / 2
  ox1# = nx1#
  oy1# = ny1#
  ox2# = nx2#
  oy2# = ny2#
  nx1# = x# + Cos(180 + dir# - 5) * (size# / 2 + i*4) + Cos(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  ny1# = y# + Sin(180 + dir# - 5) * (size# / 2 + i*4) + Sin(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  nx2# = x# + Cos(180 + dir# + 5) * (size# / 2 + i*4) + Cos(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * .75
  ny2# = y# + Sin(180 + dir# + 5) * (size# / 2 + i*4) + Sin(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * .75
  Line ox1#,oy1#,nx1#,ny1#
  Line ox2#,oy2#,nx2#,ny2#
 Next

 Color 255,255,255
End Function

Function DrawOrganism(x#,y#,dir#,size#,anim,gender%,attractivity)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 If gender% = 0 And tail < 5 Then 
  nx# = x# + Cos(dir#) * size# / 2
  ny# = y# + Sin(dir#) * size# / 2
  For i = 1 To size# * attractivity / tail
   ox# = nx#
   oy# = ny#
   nx# = x# + Cos(180 + dir#) * (size# / 2 + i*4) + Cos(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   ny# = y# + Sin(180 + dir#) * (size# / 2 + i*4) + Sin(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   Line ox#,oy#,nx#,ny#
  Next
 EndIf
End Function

Function UpdateSpecialAreas()
  Color 64, 128, 64
  Rect 150, 150, 200, 120, True
  Color 255, 255, 255
End Function


init()

While Not KeyHit(1)
 If KeyHit(59) Then ShowRelationships = Not ShowRelationships
 If KeyHit(60) Then ShowBirthplaces = Not ShowBirthplaces
 If KeyHit(61) Then isFood = Not isFood
 If KeyHit(62) Then ShowOrganisms = Not ShowOrganisms
 If KeyHit(78) And tail > 1 Then tail = tail - 1
 If KeyHit(74) And tail < 5 Then tail = tail + 1
 If MilliSecs() - Lasttic >= 40 Then
  Lasttic = MilliSecs()
  Cls
;  UpdateSpecialAreas
  UpdatePredator
  UpdateSwarm
  UpdateBirthplaces
  ShowPredator
  ShowSwarm
  If isFood Then ShowFood
  Flip
 
 EndIf
Wend
FreeFont deffont
End


Gruß
bommelid
 

bommelid

BeitragDo, Jan 22, 2004 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
da der Code immer unübersichtlicher wurde (besonders hier im Thread), habe ich das Programm mal aufgeteilt. So behält man doch eher den Überblick und wenn jemand was updatet, muß nicht immer das ganze Programm gepostet werden. Ich hoffe auch, daß dadurch mehr Leute Vorschläge einbringen (in Form von Code).

hier also nun die Teile:

main.bbCode: [AUSKLAPPEN]
AppTitle "Schwarm-Simulation 3"

Include "variablen.bb"
Include "createthings.bb"
Include "math.bb"
Include "simpleai.bb"
Include "show.bb"

Function init()
 Graphics 800,600,0,2
 SetBuffer BackBuffer()
 SeedRnd MilliSecs()
 CreateSwarm(StartingPop)
 CreatePredator(Rnd(800),Rnd(540)+100)
End Function

init()

While Not KeyHit(1)
 If KeyHit(59) Then ShowRelationships = Not ShowRelationships
 If KeyHit(60) Then ShowBirthplaces = Not ShowBirthplaces
 If KeyHit(61) Then isFood = Not isFood
 If KeyHit(62) Then ShowOrganisms = Not ShowOrganisms
 If KeyHit(78) And tail > 1 Then tail = tail - 1
 If KeyHit(74) And tail < 5 Then tail = tail + 1
 If MilliSecs() - Lasttic >= 40 Then
  Lasttic = MilliSecs()
  Cls
;  UpdateSpecialAreas
  UpdatePredator
  UpdateSwarm
  UpdateBirthplaces
  ShowPredator
  ShowSwarm
  If isFood Then ShowFood
  Flip
 EndIf
Wend
End


variablen.bbCode: [AUSKLAPPEN]
Const StartingPop = 50
Const Lifetime = 35
Const Lifetimediffer# = 2
Const PotentAge = 6
Const ImpotentPeriod = 5
Const NoPleasurePeriod = 2
Const twinprob# = 0.012
Const tripletprob# = 0.00014
Const satisfiedtime = 10
Const coupletime# = 0.5
Const Normattractivity = 1
Const nostarvingtime = 4

Global ShowRelationships = True
Global ShowBirthplaces = False
Global ShowOrganisms = True
Global isFood = False
Global births = 0
Global twins = 0
Global triplets = 0
Global deaths = 0
Global maxpop
Global minpop = StartingPop
Global starttime = MilliSecs()
Global maxlifeexpectancy# = 0
Global minlifeexpectancy# = Lifetime+Lifetimediffer#
Global avAge#
Global avchildren#
Global avLifetime#
Global LivingfemOrganisms
Global LivingmaleOrganisms
Global Organisms = Startpop
Global Lasttic
Global tail = 1
Global maxspeed# = 4
Global escapedist = 40
Global PredSize = 15
Global predvictums = 0

Type FoodSource
 Field x#
 Field y#
 Field foodpoints
 Field origintime
End Type

Type Predator
 Field x#
 Field y#
 Field dir#
 Field size#
 Field speed#
 Field speedfactor#
 Field movement
 Field lastfood
End Type

Type Organism
 Field x#
 Field y#
 Field dir#
 Field speed#
 Field speedfactor#
 Field movement
 Field birthtime
 Field partner
 Field lastchild
 Field gender%
 Field lastfood
 Field lifeexpectancy#
 Field children
 Field attractivity#
 Field startcouple
 Field maxspeed#
 Field social#
End Type

Type Birthplace
 Field x#
 Field y#
 Field expiry
End Type


createthings.bbCode: [AUSKLAPPEN]
Function CreateSwarm(OrganismCount)
 For i = 1 To OrganismCount
  CreateOrganism(Rnd(GraphicsWidth()),Rnd(GraphicsHeight()),Lifetime,Normattractivity,1)
 Next
End Function

Function CreateFoodSource(x#, y#)
 Temp.FoodSource = New FoodSource
 Temp\x# = x#
 Temp\y# = y#
 Temp\foodpoints = 10
 Temp\origintime = MilliSecs()
End Function

Function CreatePredator(x#,y#)
 Temp.Predator = New Predator
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 temp\size = PredSize
 Temp\speed# = 3
 Temp\speedfactor# = 1
 Temp\movement = Rand(360)
 Temp\lastfood = MilliSecs()
End Function

Function CreateOrganism(x#,y#,Lifetimetemp#,attractivity#,social#)
 Temp.Organism = New Organism
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 Temp\speed = 0
 Temp\speedfactor = 1
 temp\maxspeed# = maxspeed * Rnd(0.75, 1.25)
 Temp\movement = Rand(360)
 Temp\birthtime = MilliSecs()
 Temp\partner = 0
 Temp\lastchild = MilliSecs()
 Temp\gender% = Rand(0,1)
 Temp\lastfood = MilliSecs()
 Temp\lifeexpectancy# = Lifetimetemp# + Rnd(-Lifetimediffer#,Lifetimediffer#)
 Temp\children = 0
 Temp\attractivity# = attractivity# * Rnd(0.8, 1.2)
 Temp\startcouple = MilliSecs() + Temp\lifeexpectancy# * 1000
 Temp\social# = social# * Rnd(0.9, 1.1)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
 Organisms = Organisms + 1
End Function


math.bbCode: [AUSKLAPPEN]
Function age(birthtime)
 Return MilliSecs() - birthtime
End Function

Function distance#(x1#,y1#,x2#,y2#)
 Return Sqr((x2-x1)^2+(y2-y1)^2)
End Function

Function turnto(x1#,y1#,x2#,y2#,dir#)
 Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360
 If Temp# > 180 Then Temp# = Temp# - 360
 Return Temp#
End Function


simpleai.bbCode: [AUSKLAPPEN]
Function UpdatePredator()
 For Temp.Predator = Each Predator
  Temp\Speed# = Temp\speed# + Rnd(-1,1)
  If Temp\Speed# < 0 Then Temp\speed# = 0
  If Temp\Speed# > 6 Then Temp\speed# = 6
  Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
  If age(Temp\lastfood) / 1000 > nostarvingtime Then
   nearest# = 1000
   For tmporg.Organism = Each Organism
    If distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < PredSize Then
     Delete tmporg
     deaths = deaths + 1
     predvictums = predvictums + 1
     Temp\lastfood = MilliSecs()
    ElseIf distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < nearest# - 5 Then
     nearest# = distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#)
     dirtofood# = ATan((Temp\y# - tmporg\y#) / (Temp\x# - tmporg\x#))
    If dirtofood# < 0 Then dirtofood# = dirtofood# + 360
    If tmporg\x# < Temp\x# Then dirtofood# = (dirtofood# + 180) Mod 360
     Temp\dir# = (dirtofood#) Mod 360
    EndIf
   Next
   If Temp\Speed# < 4 Then Temp\Speed = 4
  EndIf
  Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
  Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  If Temp\x# < 0 Then Temp\x# = Temp\x# + GraphicsWidth()
  If Temp\x# > GraphicsWidth() Then Temp\x# = Temp\x# - GraphicsWidth()
  If Temp\y# < 100 Then Temp\y# = Temp\y# + GraphicsHeight() - 100
  If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight() + 100
 Next
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Temp\lifeexpectancy#*1000 Then
   CreateFoodSource(Temp\x#,Temp\y#)
   Delete Temp
   deaths = deaths + 1
  Else
   Temp\Speed# = Temp\speed# + Rnd(-1,1)
   If (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $408040 Then
    Temp\speedfactor# = 0.5
   ElseIf (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $000000 Then
    Temp\speedfactor# = 1
   EndIf
   If Temp\Speed# < 0 Then Temp\speed# = 0
   If Temp\Speed# > Temp\maxspeed# Then Temp\speed# = Temp\maxspeed#
   Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
   If Temp\partner Then
    Partner.Organism = Object.Organism(Temp\partner)
    If Partner = Null Then
     Temp\partner = 0
    Else
    If Partner\gender% = Temp\gender% Then
     Temp\partner = 0
     Else
      If distance#(Temp\x,Temp\y,Partner\x,Partner\y) > 50 Then
       Temp\partner = 0
       Partner\partner = 0
      Else
       If ShowRelationShips Then Line Temp\x#,Temp\y#,Partner\x#,Partner\y#
       Temp\dir# = Temp\dir# + Sgn(turnto(Temp\x#,Temp\y#,Partner\x#,Partner\y#,Temp\dir#)) * Temp\speed# * 2 * Temp\speedfactor#
       If distance#(Temp\x#,Temp\y#,Partner\x#,Partner\y#) < 10 Then
        If (age(Temp\lastchild) > Temp\gender * ImpotentPeriod * 1000) And (age(Partner\lastchild) > Partner\gender * ImpotentPeriod * 1000) Then
         If (Temp\gender = 1) And (age(Temp\startcouple) > (coupletime# / Partner\attractivity#) * 1000) Then
       ElseIf (Temp\gender = 0) And (age(Partner\startcouple) > (coupletime# / Temp\attractivity#) * 1000) Then
         births = births + 1
        Temp\children = Temp\children + 1
        Partner\children = Partner\children + 1
          multibirth# = Rnd(0, 1)
        CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2)
        If multibirth# <= twinprob# Then
         births = births + 1
         twins = twins + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
         CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2)
        EndIf
        If multibirth# <= tripletprob# Then
         twins = twins - 1
         births = births + 1
         triplets = triplets + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
         CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2)
        EndIf
          Temp\lastchild = MilliSecs()
          Partner\lastchild = MilliSecs()
          Temp\partner = 0
          Partner\partner = 0
         EndIf
       EndIf
       EndIf
      EndIf
     EndIf
    EndIf
   Else
    For NewPartner.Organism = Each Organism
     If (Not Handle(NewPartner) = Handle(Temp)) Then
      If distance#(Temp\x#,Temp\y#,NewPartner\x#,NewPartner\y#) < 30 Then
       If NewPartner\partner = 0 Then

        If (age(Temp\birthtime) > PotentAge * 1000) And (age(NewPartner\birthtime) > PotentAge * 1000) Then
         If (age(Temp\lastchild) > NoPleasurePeriod * 1000) And (age(NewPartner\lastchild) > NoPleasurePeriod * 1000) Then
          Temp\partner = Handle(NewPartner)
        Temp\startcouple = MilliSecs()
          NewPartner\partner = Handle(Temp)
        NewPartner\startcouple = MilliSecs()
         EndIf
        EndIf
       EndIf
      EndIf
     EndIf
    Next
    Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
   EndIf
   issocial = False
   For tmporg.Organism = Each Organism
    If (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < 100*Temp\social#) And (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) <> 0) Then issocial = True
   Next
   If Not issocial Then
    nearest# = 1000
    For tmporg.Organism = Each Organism
     If (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < nearest# - 5) And (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) <> 0) Then
      nearest# = distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#)
      dirtoorg# = ATan((Temp\y# - tmporg\y#) / (Temp\x# - tmporg\x#))
     If dirtoorg# < 0 Then dirtoorg# = dirtoorg# + 360
     If tmporg\x# < Temp\x# Then dirtoorg# = (dirtofood# + 180) Mod 360
     Temp\dir# = (dirtoorg#) Mod 360
     EndIf
    Next
   EndIf
   For tmppred.Predator = Each Predator
   If distance#(Temp\x#,Temp\y#,tmppred\x#,tmppred\y#) < escapedist Then
    dirtopred# = ATan((Temp\y# - tmppred\y#) / (Temp\x# - tmppred\x#))
    If dirtopred# < 0 Then dirtopred# = dirtopred# + 360
    If tmppred\x# < Temp\x# Then dirtopred# = (dirtopred# + 180) Mod 360
    Temp\speed# = Temp\maxspeed#
    Temp\dir# = (dirtopred# + 180) Mod 360
      EndIf
   Next
   Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   If Temp\x# < 0 Then Temp\x# = Temp\x# + GraphicsWidth()
   If Temp\x# > GraphicsWidth() Then Temp\x# = Temp\x# - GraphicsWidth()
   If Temp\y# < 100 Then Temp\y# = Temp\y# + GraphicsHeight() - 100
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight() + 100
  EndIf
 Next
End Function


show.bbCode: [AUSKLAPPEN]
Function ShowFood()
 For Temp.FoodSource = Each FoodSource
  If age(Temp\origintime) > 10*1000 Then
   Delete Temp
  Else
   Color 0,(255-25*age(Temp\origintime)/1000),0
   Oval Temp\x#,Temp\y#,5+Temp\foodpoints,5+Temp\foodpoints,1
  EndIf
 Next
 Color 255,255,255
End Function

Function ShowPredator()
 For Temp.Predator = Each Predator
  DrawPredator(Temp\x#,Temp\y#,Temp\size,Temp\dir#,Temp\movement,Temp\lastfood)
 Next
End Function

Function ShowSwarm()
 minattractivity# = 5
 LivingfemOrganisms = 0
 LivingmaleOrganisms = 0
 For Temp.Organism = Each Organism
  If Temp\lifeexpectancy# > maxlifeexpectancy# Then maxlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\lifeexpectancy# < minlifeexpectancy# Then minlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\attractivity# < minattractivity# Then minattractivity# = Temp\attractivity#
  If Temp\attractivity# > maxattractivity# Then maxattractivity# = Temp\attractivity#
  avLifetime# = avLifetime# + Temp\lifeexpectancy#
  avattractivity# = avattractivity# + Temp\attractivity#
  hunger = (MilliSecs() - Temp\lastfood)/1000
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - (200 / Temp\lifeexpectancy#) * (age(Temp\birthtime) / 1000)
  If clr < 0 Then clr = 0
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  If ShowOrganisms Then DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Temp\lifeexpectancy*1000)+5,Temp\movement,Temp\gender%,Temp\attractivity)
  avAge# = avAge# + age(Temp\birthtime) / 1000
  avchildren# = avchildren# + Temp\children
 Next
 Color 255,0,0
 Text 1,1,"   weibl.Org.: " + LivingfemOrganisms
 Color 0,0,255
 Text 1,12,"   männl.Org.: " + LivingmaleOrganisms
 Color 255,255,255
 Text 1,30,"    Org.insg.: " + (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,45,"Geb.insgesamt: " + births
 Text 1,60,"Zwillingsgeb.: " + twins
 Text 1,75,"Drillingsgeb.: " + triplets

 Text 170,1,"max.Lebenserw.: " + maxlifeexpectancy#
 Text 170,15,"min.Lebenserw.: " + minlifeexpectancy#
 avLifetime# = avLifetime# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 170,30,"avr Lebenserw.: " + avLifetime#
 
 Text 170,45,"  max.Attrakt.: " + maxattractivity
 Text 170,60,"  min.Attrakt.: " + minattractivity
 avattractivity# = avattractivity# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 170,75,"  avr Attrakt.: " + avattractivity
 
 If LivingfemOrganisms+LivingmaleOrganisms > maxpop Then
  maxpop = LivingfemOrganisms+LivingmaleOrganisms
 ElseIf LivingfemOrganisms+LivingmaleOrganisms < minpop Then
  minpop = LivingfemOrganisms+LivingmaleOrganisms
 EndIf
 Text 400,0,"nat.Todesfälle: " + (deaths - predvictums)
 Text 400,15," Raubtieropfer: " + predvictums
 Text 400,30,"max.Population: " + maxpop
 Text 400,45,"min.Population: " + minpop
 avAge# = avAge# / (LivingfemOrganisms+LivingmaleOrganisms)
 avchildren# = avchildren# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 400,60,"     avr Alter: " + avAge#
 Text 400,75,"   Nachk./Org.: " + avchildren#
 AppTitle "Schwarm Simulation 3 - Zeit in sek.: " + (MilliSecs() - starttime)/1000
 Color 255,255,255
End Function

Function UpdateBirthplaces()
 For Temp.Birthplace = Each Birthplace
  Temp\expiry = Temp\expiry + 1
  If Temp\expiry > 100 Then
   Delete Temp
  Else
   If ShowBirthplaces Then
    clr = 255 - 255 * Temp\expiry / 100
    size = 100 * Temp\expiry / 100
    Color 0,clr,0
    Oval Temp\x#-size/2,Temp\y#-size/2,size,size,0
   EndIf
  EndIf
 Next
End Function

Function DrawPredator(x#,y#,size#,dir#,anim,lastfood)
 Color 128,128,128
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx1# = x# + Cos(dir#-5) * size# / 2
 ny1# = y# + Sin(dir#-5) * size# / 2
 nx2# = x# + Cos(dir#+5) * size# / 2
 ny2# = y# + Sin(dir#+5) * size# / 2
 For i = 1 To size# / 2
  ox1# = nx1#
  oy1# = ny1#
  ox2# = nx2#
  oy2# = ny2#
  nx1# = x# + Cos(180 + dir# - 5) * (size# / 2 + i*4) + Cos(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  ny1# = y# + Sin(180 + dir# - 5) * (size# / 2 + i*4) + Sin(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  nx2# = x# + Cos(180 + dir# + 5) * (size# / 2 + i*4) + Cos(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * .75
  ny2# = y# + Sin(180 + dir# + 5) * (size# / 2 + i*4) + Sin(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * .75
  Line ox1#,oy1#,nx1#,ny1#
  Line ox2#,oy2#,nx2#,ny2#
 Next
 If age(lastfood) / 1000 < nostarvingtime Then
  Color 0,255,0
 Else Color 255,0,0
 EndIf
 Oval x#-size#/4,y#-size#/4,size#/2,size#/2,1
 Color 255,255,255
End Function

Function DrawOrganism(x#,y#,dir#,size#,anim,gender%,attractivity)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 If gender% = 0 And tail < 5 Then 
  nx# = x# + Cos(dir#) * size# / 2
  ny# = y# + Sin(dir#) * size# / 2
  For i = 1 To size# * attractivity / tail
   ox# = nx#
   oy# = ny#
   nx# = x# + Cos(180 + dir#) * (size# / 2 + i*4) + Cos(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   ny# = y# + Sin(180 + dir#) * (size# / 2 + i*4) + Sin(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   Line ox#,oy#,nx#,ny#
  Next
 EndIf
End Function

Function UpdateSpecialAreas()
  Color 64, 128, 64
  Rect 150, 150, 200, 120, True
  Color 255, 255, 255
End Function


Ein paar kleine Änderungen zur Vorversion sind auch drin. Hat der Räuber gefressen, ist er für einige Zeit satt (grüner Punkt). Hat er wieder Hunger, wird der Punkt auf dem Körper rot.
Die Organismen haben ein social-"Gen". Sind in einem bestimmten Umkreis keine anderen Organismen, suchen sie den nächsten und laufen hin.

Gruß
bommelid
 

IonPainter

BeitragDo, Jan 22, 2004 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
schwarm ist nach ca 180 sekunden abgenippelt
 

bommelid

BeitragDo, Jan 22, 2004 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ist bei mir im Moment auch so. Durch die Änderungen stimmen die Parameter nicht mehr. Wenn jemand gut Werte für die einzelnen Parameter findet, bitte posten Very Happy

Gruß
bommelid

tft

BeitragSa, Jan 24, 2004 7:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.....

ist echt klasse. Jetzt das ganze noch in 3D in einem Würfel......
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

littleRabbit

BeitragSa, Jan 24, 2004 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Orga(ni)smus ist zwar süß aber irgendwie fehlt da noch was...
Vielleicht etwas mehr Farbe?
 

Eisrabe

BeitragFr, Jan 30, 2004 4:45
Antworten mit Zitat
Benutzer-Profile anzeigen
leute, dieser Thread und das gemeinschaftsprojekt (super Smile codemaster und bommelid)

da ich gamedesigner bin (wenn auch NOCH nicht beruflich) hätte ich bestimmt einige Anregungen. besonders, wie man daraus ein game machen kann. aber leider konnte ich bis auf die ersten beiden listings die anderen nicht ansehen. ich bekomme bei ALLEN anderen listings bei DER zeile den Fehler:
Function not found
Code: [AUSKLAPPEN]
Partner.Organism = Object.Organism(Temp\partner)


sobald ich es mal sehe, kommen auch Vorschläge von mir, was design und spielbarkeit betrifft. mit dem coden hab ich es nicht so. habe auch grad erst mit BB angefangen. ich bin eh mehr der kreative visionär als der ausführende.

wie kann ich den fehler beheben? oder liegts an meinem BB2D ?
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!
 

bommelid

BeitragFr, Jan 30, 2004 9:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Eisrabe,
kann mir nicht vorstellen, daß der Fehler was mit Blitz2d zu tun hat.
Ich poste einfach mal die Dateien, wie sie jetzt sind. Leider habe ich fast alle verändert, muß also doch wieder viel posten. Das ist zwar etwas umständlich für Euch aber wesentlich übersichtlicher für mich, sorry.
Gibt nicht viel Neues (habe kaum Zeit im Moment). Farben werden vererbt, wie genau steht in genetics.bb.
Falls es trotzdem nicht funzt, kann ich dir auch die .exe packen und mailen.

main.bb:
Code: [AUSKLAPPEN]
AppTitle "Schwarm-Simulation 3"

Include "variablen.bb"
Include "createthings.bb"
Include "math.bb"
Include "simpleai.bb"
Include "show.bb"
Include "genetics.bb"

Function init()
 Graphics 800,600,0,2
 SetBuffer BackBuffer()
 ClsColor 32,32,128
 SeedRnd MilliSecs()
 CreateSwarm(StartingPop)
 CreatePredator(Rnd(800),Rnd(540)+100)
 Timetics = 0
End Function

init()


While Not KeyHit(1)
 If KeyHit(59) Then ShowRelationships = Not ShowRelationships
 If KeyHit(60) Then ShowBirthplaces = Not ShowBirthplaces
 If KeyHit(61) Then isFood = Not isFood
 If KeyHit(62) Then ShowOrganisms = Not ShowOrganisms
 If KeyHit(78) And tail > 1 Then tail = tail - 1
 If KeyHit(74) And tail < 5 Then tail = tail + 1
 If MilliSecs() - Lasttic >= 40 Then
  Lasttic = MilliSecs()
  Cls
;  UpdateSpecialAreas
  UpdatePredator
  UpdateSwarm
  UpdateBirthplaces
  ShowPredator
  ShowSwarm
  If isFood Then ShowFood
  Flip
 EndIf
Wend
End


simpleai.bb:
Code: [AUSKLAPPEN]
Function UpdatePredator()
 For Temp.Predator = Each Predator
  Temp\Speed# = Temp\speed# + Rnd(-1,1)
  If Temp\Speed# < 0 Then Temp\speed# = 0
  If Temp\Speed# > 6 Then Temp\speed# = 6
  Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
  If age(Temp\lastfood) / 1000 > nostarvingtime Then
   nearest# = 1000
   For tmporg.Organism = Each Organism
    If distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < PredSize Then
     Delete tmporg
     deaths = deaths + 1
     predvictums = predvictums + 1
     Temp\lastfood = MilliSecs()
    ElseIf distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < nearest# - 5 Then
     nearest# = distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#)
     dirtofood# = ATan((Temp\y# - tmporg\y#) / (Temp\x# - tmporg\x#))
    If dirtofood# < 0 Then dirtofood# = dirtofood# + 360
    If tmporg\x# < Temp\x# Then dirtofood# = (dirtofood# + 180) Mod 360
     Temp\dir# = (dirtofood#) Mod 360
    EndIf
   Next
   If Temp\Speed# < 4 Then Temp\Speed = 4
  EndIf
  Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
  Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
  If (Temp\x# < 0) And (Temp\dir# > 90) And (Temp\dir# < 270) Then Temp\dir# = (360-(Temp\dir#-180)) Mod 360 ;Temp\x# = Temp\x# + GraphicsWidth()
  If (Temp\x# > GraphicsWidth()) And ((Temp\dir# < 90) Or (Temp\dir# > 270)) Then Temp\dir# = (360-(Temp\dir#-180)) Mod 360 ;Temp\x# = Temp\x# - GraphicsWidth()
  If (Temp\y# < 100) And (Temp\dir# > 180) Then Temp\dir# = (360-Temp\dir#) Mod 360 ;Temp\y# = Temp\y# + GraphicsHeight() - 100
  If (Temp\y# > GraphicsHeight()) And (Temp\dir# < 180) Then Temp\dir# = (360-Temp\dir#) Mod 360 ;Temp\y# = Temp\y# - GraphicsHeight() + 100
 Next
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Temp\lifeexpectancy#*1000 Then
   CreateFoodSource(Temp\x#,Temp\y#)
   Delete Temp
   deaths = deaths + 1
  Else
   Temp\Speed# = Temp\speed# + Rnd(-1,1)
   If (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $408040 Then
    Temp\speedfactor# = 0.5
   ElseIf (ReadPixel(Temp\x, Temp\y) And $FFFFFF) = $000000 Then
    Temp\speedfactor# = 1
   EndIf
   If Temp\Speed# < 0 Then Temp\speed# = 0
   If Temp\Speed# > Temp\maxspeed# Then Temp\speed# = Temp\maxspeed#
   Temp\movement = (Temp\movement + Temp\speed# * 10 * Temp\speedfactor#) Mod 360
   If Temp\partner Then
    Partner.Organism = Object.Organism(Temp\partner)
    If Partner = Null Then
     Temp\partner = 0
    Else
    If Partner\gender% = Temp\gender% Then
     Temp\partner = 0
     Else
      If distance#(Temp\x,Temp\y,Partner\x,Partner\y) > 50 Then
       Temp\partner = 0
       Partner\partner = 0
      Else
       If ShowRelationShips Then Line Temp\x#,Temp\y#,Partner\x#,Partner\y#
       Temp\dir# = Temp\dir# + Sgn(turnto(Temp\x#,Temp\y#,Partner\x#,Partner\y#,Temp\dir#)) * Temp\speed# * 2 * Temp\speedfactor#
       If distance#(Temp\x#,Temp\y#,Partner\x#,Partner\y#) < 10 Then
        If (age(Temp\lastchild) > Temp\gender * ImpotentPeriod * 1000) And (age(Partner\lastchild) > Partner\gender * ImpotentPeriod * 1000) Then
         If (Temp\gender = 1) And (age(Temp\startcouple) > (coupletime# / Partner\attractivity#) * 1000) Then
       ElseIf (Temp\gender = 0) And (age(Partner\startcouple) > (coupletime# / Temp\attractivity#) * 1000) Then
         births = births + 1
        Temp\children = Temp\children + 1
        Partner\children = Partner\children + 1
          multibirth# = Rnd(0, 1)
        CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2,Temp\red,Temp\green,Temp\blue,Partner\red,Partner\green,Partner\blue,True)
        If multibirth# <= twinprob# Then
         births = births + 1
         twins = twins + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
         CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2,Temp\red,Temp\green,Temp\blue,Partner\red,Partner\green,Partner\blue,True)
        EndIf
        If multibirth# <= tripletprob# Then
         twins = twins - 1
         births = births + 1
         triplets = triplets + 1
         Temp\children = Temp\children + 1
         Partner\children = Partner\children + 1
          CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2,(Temp\attractivity#+Partner\attractivity#)/2,(Temp\social#+Partner\social#)/2,Temp\red,Temp\green,Temp\blue,Partner\red,Partner\green,Partner\blue,True)
        EndIf
          Temp\lastchild = MilliSecs()
          Partner\lastchild = MilliSecs()
          Temp\partner = 0
          Partner\partner = 0
         EndIf
       EndIf
       EndIf
      EndIf
     EndIf
    EndIf
   Else
    For NewPartner.Organism = Each Organism
     If (Not Handle(NewPartner) = Handle(Temp)) Then
      If distance#(Temp\x#,Temp\y#,NewPartner\x#,NewPartner\y#) < 30 Then
       If NewPartner\partner = 0 Then

        If (age(Temp\birthtime) > PotentAge * 1000) And (age(NewPartner\birthtime) > PotentAge * 1000) Then
         If (age(Temp\lastchild) > NoPleasurePeriod * 1000) And (age(NewPartner\lastchild) > NoPleasurePeriod * 1000) Then
          Temp\partner = Handle(NewPartner)
        Temp\startcouple = MilliSecs()
          NewPartner\partner = Handle(Temp)
        NewPartner\startcouple = MilliSecs()
         EndIf
        EndIf
       EndIf
      EndIf
     EndIf
    Next
    Temp\dir# = (Temp\dir# + Rnd(-2,2) + 360) Mod 360
   EndIf
   issocial = False
   For tmporg.Organism = Each Organism
    If (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < 60/Temp\social#) And (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) <> 0) Then issocial = True
   Next
   If Not issocial Then
    nearest# = 1000
    For tmporg.Organism = Each Organism
     If (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) < nearest# - 5) And (distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#) <> 0) Then
      nearest# = distance#(Temp\x#,Temp\y#,tmporg\x#,tmporg\y#)
      dirtoorg# = ATan((Temp\y# - tmporg\y#) / (Temp\x# - tmporg\x#))
     If dirtoorg# < 0 Then dirtoorg# = dirtoorg# + 360
     If tmporg\x# < Temp\x# Then dirtoorg# = (dirtofood# + 180) Mod 360
     Temp\dir# = (dirtoorg#) Mod 360
     EndIf
    Next
   EndIf
   For tmppred.Predator = Each Predator
   If distance#(Temp\x#,Temp\y#,tmppred\x#,tmppred\y#) < escapedist Then
    dirtopred# = ATan((Temp\y# - tmppred\y#) / (Temp\x# - tmppred\x#))
    If dirtopred# < 0 Then dirtopred# = dirtopred# + 360
    If tmppred\x# < Temp\x# Then dirtopred# = (dirtopred# + 180) Mod 360
    Temp\speed# = Temp\maxspeed#
    Temp\dir# = (dirtopred# + 180) Mod 360
      EndIf
   Next
   Temp\x# = Temp\x# + Cos(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   Temp\y# = Temp\y# + Sin(Temp\dir#) * Temp\speed# * Temp\speedfactor#
   If (Temp\x# < 0) And (Temp\dir# > 90) And (Temp\dir# < 270) Then Temp\dir# = (360-(Temp\dir#-180)) Mod 360 ;Temp\x# = Temp\x# + GraphicsWidth()
   If (Temp\x# > GraphicsWidth()) And ((Temp\dir# < 90) Or (Temp\dir# > 270)) Then Temp\dir# = (360-(Temp\dir#-180)) Mod 360 ;Temp\x# = Temp\x# - GraphicsWidth()
   If (Temp\y# < 100) And (Temp\dir# > 180) Then Temp\dir# = (360-Temp\dir#) Mod 360 ;Temp\y# = Temp\y# + GraphicsHeight() - 100
   If (Temp\y# > GraphicsHeight()) And (Temp\dir# < 180) Then Temp\dir# = (360-Temp\dir#) Mod 360 ;Temp\y# = Temp\y# - GraphicsHeight() + 100
  EndIf
 Next
End Function


show.bb:
Code: [AUSKLAPPEN]

Function ShowFood()
 For Temp.FoodSource = Each FoodSource
  If age(Temp\origintime) > 10*1000 Then
   Delete Temp
  Else
   Color 0,(255-25*age(Temp\origintime)/1000),0
   Oval Temp\x#,Temp\y#,5+Temp\foodpoints,5+Temp\foodpoints,1
  EndIf
 Next
 Color 255,255,255
End Function

Function ShowPredator()
 For Temp.Predator = Each Predator
  DrawPredator(Temp\x#,Temp\y#,Temp\size,Temp\dir#,Temp\movement,Temp\lastfood)
 Next
End Function

Function ShowSwarm()
 minattractivity# = 5
 LivingfemOrganisms = 0
 LivingmaleOrganisms = 0
 LivingPredators = 0
 For Temp.Organism = Each Organism
 
  If Temp\lifeexpectancy# > maxlifeexpectancy# Then maxlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\lifeexpectancy# < minlifeexpectancy# Then minlifeexpectancy# = Temp\lifeexpectancy#
  If Temp\attractivity# < minattractivity# Then minattractivity# = Temp\attractivity#
  If Temp\attractivity# > maxattractivity# Then maxattractivity# = Temp\attractivity#
  avLifetime# = avLifetime# + Temp\lifeexpectancy#
  avattractivity# = avattractivity# + Temp\attractivity#
  hunger = (MilliSecs() - Temp\lastfood)/1000
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr% = 255 - (200 / Temp\lifeexpectancy#) * (age(Temp\birthtime) / 1000)
  If clr < 0 Then clr = 0
  Color Floor(Temp\red / 3)*clr, Floor(Temp\green / 3)*clr, Floor(Temp\blue / 3)*clr
  If ShowOrganisms Then DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Temp\lifeexpectancy*1000)+5,Temp\movement,Temp\gender%,Temp\attractivity)
  avAge# = avAge# + age(Temp\birthtime) / 1000
  avchildren# = avchildren# + Temp\children
 Next
 torg = First Organism
 torg2 = Last Organism
 For Temp2.Predator = Each Predator
  LivingPredators = LivingPredators+1
 Next
 If (LivingfemOrganisms+LivingmaleOrganisms) / LivingPredators > 25 Then
  CreatePredator(Rnd(800),Rnd(540)+100)
 ElseIf ((LivingfemOrganisms+LivingmaleOrganisms) / LivingPredators < 15) And (LivingPredators > 1) Then
  Temp2.Predator = Last Predator
  Delete Temp2
 EndIf

; Infos anzeigen
 Color 0,0,0
 Rect 0,0,799,99,1
 Color 255,0,0
 Text 1,1,"   weibl.Org.: " + LivingfemOrganisms
 Color 0,0,255
 Text 1,12,"   männl.Org.: " + LivingmaleOrganisms
 Color 255,255,255
 Text 1,30,"    Org.insg.: " + (LivingfemOrganisms+LivingmaleOrganisms)
 Text 1,45,"Geb.insgesamt: " + births
 Text 1,60,"Zwillingsgeb.: " + twins
 Text 1,75,"Drillingsgeb.: " + triplets

 Text 170,1,"max.Lebenserw.: " + dec(maxlifeexpectancy#, 3)
 Text 170,15,"min.Lebenserw.: " + dec(minlifeexpectancy#, 3)
 avLifetime# = avLifetime# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 170,30,"avr Lebenserw.: " + dec(avLifetime#, 3)
 
 Text 170,45,"  max.Attrakt.: " + dec(maxattractivity#, 3)
 Text 170,60,"  min.Attrakt.: " + dec(minattractivity#, 3)
 avattractivity# = avattractivity# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 170,75,"  avr Attrakt.: " + dec(avattractivity#, 3)
 
 If LivingfemOrganisms+LivingmaleOrganisms > maxpop Then
  maxpop = LivingfemOrganisms+LivingmaleOrganisms
 ElseIf LivingfemOrganisms+LivingmaleOrganisms < minpop Then
  minpop = LivingfemOrganisms+LivingmaleOrganisms
 EndIf
 Text 400,0,"nat.Todesfälle: " + (deaths - predvictums)
 Text 400,15," Raubtieropfer: " + predvictums
 Text 400,30,"max.Population: " + maxpop
 Text 400,45,"min.Population: " + minpop
 avAge# = avAge# / (LivingfemOrganisms+LivingmaleOrganisms)
 avchildren# = avchildren# / (LivingfemOrganisms+LivingmaleOrganisms)
 Text 400,60,"     avr Alter: " + dec(avAge#, 3)
; Text 400,75,"   Nachk./Org.: " + avchildren#
 AppTitle "Schwarm Simulation 3 - Zeit in sek.: " + (MilliSecs() - starttime)/1000
 Color 255,255,255
End Function

Function UpdateBirthplaces()
 For Temp.Birthplace = Each Birthplace
  Temp\expiry = Temp\expiry + 1
  If Temp\expiry > 100 Then
   Delete Temp
  Else
   If ShowBirthplaces Then
    clr = 255 - 255 * Temp\expiry / 100
    size = 100 * Temp\expiry / 100
    Color 0,clr,0
    Oval Temp\x#-size/2,Temp\y#-size/2,size,size,0
   EndIf
  EndIf
 Next
End Function

Function DrawPredator(x#,y#,size#,dir#,anim,lastfood)
 Color 128,128,128
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx1# = x# + Cos(dir#-5) * size# / 2
 ny1# = y# + Sin(dir#-5) * size# / 2
 nx2# = x# + Cos(dir#+5) * size# / 2
 ny2# = y# + Sin(dir#+5) * size# / 2
 For i = 1 To size# / 2
  ox1# = nx1#
  oy1# = ny1#
  ox2# = nx2#
  oy2# = ny2#
  nx1# = x# + Cos(180 + dir# - 5) * (size# / 2 + i*4) + Cos(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  ny1# = y# + Sin(180 + dir# - 5) * (size# / 2 + i*4) + Sin(180+dir#+85) * Sin(anim - i * (360 / size#)) * i * .75
  nx2# = x# + Cos(180 + dir# + 5) * (size# / 2 + i*4) + Cos(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * -.75
  ny2# = y# + Sin(180 + dir# + 5) * (size# / 2 + i*4) + Sin(180+dir#+95) * Sin(anim - i * (360 / size#)) * i * -.75
  Line ox1#,oy1#,nx1#,ny1#
  Line ox2#,oy2#,nx2#,ny2#
 Next
 If age(lastfood) / 1000 < nostarvingtime Then
  Color 0,255,0
 Else Color 255,0,0
 EndIf
 Oval x#-size#/4,y#-size#/4,size#/2,size#/2,1
 Color 255,255,255
End Function

Function DrawOrganism(x#,y#,dir#,size#,anim,gender%,attractivity)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 If gender% = 0 And tail < 5 Then 
  nx# = x# + Cos(dir#) * size# / 2
  ny# = y# + Sin(dir#) * size# / 2
  For i = 1 To size# * attractivity / tail
   ox# = nx#
   oy# = ny#
   nx# = x# + Cos(180 + dir#) * (size# / 2 + i*4) + Cos(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   ny# = y# + Sin(180 + dir#) * (size# / 2 + i*4) + Sin(180+dir#+90) * Sin(anim - i * (360 / size#)) * i * .75
   Line ox#,oy#,nx#,ny#
  Next
 EndIf
 Color ColorRed()/2,ColorGreen()/2,ColorBlue()/2
 Oval x#-size#/2,y#-size#/2,size#,size#,0
End Function

Function UpdateSpecialAreas()
  Color 64, 128, 64
  Rect 150, 150, 200, 120, True
  Color 255, 255, 255
End Function


createthings.bb
Code: [AUSKLAPPEN]
Function CreateSwarm(OrganismCount)
 For i = 1 To OrganismCount
  CreateOrganism(Rnd(GraphicsWidth()),100+Rnd(GraphicsHeight()-100),Lifetime,Normattractivity,1,Rand(0,1),Rand(0,1),Rand(0,1),0,0,0, False)
 Next
End Function

Function CreateFoodSource(x#, y#)
 Temp.FoodSource = New FoodSource
 Temp\x# = x#
 Temp\y# = y#
 Temp\foodpoints = 10
 Temp\origintime = MilliSecs()
End Function

Function CreatePredator(x#,y#)
 Temp.Predator = New Predator
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 temp\size = PredSize
 Temp\speed# = 3
 Temp\speedfactor# = 1
 Temp\movement = Rand(360)
 Temp\lastfood = MilliSecs()
End Function

Function CreateOrganism(x#,y#,Lifetimetemp#,attractivity#,social#,red1,green1,blue1,red2,green2,blue2,child)
 Temp.Organism = New Organism
 Temp\x# = x#
 Temp\y# = y#
 Temp\dir# = Rand(360)
 Temp\speed = 0
 Temp\speedfactor = 1
 temp\maxspeed# = maxspeed * Rnd(0.75, 1.25)
 Temp\movement = Rand(360)
 Temp\birthtime = MilliSecs()
 Temp\partner = 0
 Temp\lastchild = MilliSecs()
 Temp\gender% = Rand(0,1)
 Temp\lastfood = MilliSecs()
 Temp\lifeexpectancy# = Lifetimetemp# + Rnd(-Lifetimediffer#,Lifetimediffer#)
 Temp\children = 0
 Temp\attractivity# = attractivity# * Rnd(0.8, 1.2)
 Temp\startcouple = MilliSecs() + Temp\lifeexpectancy# * 1000
 Temp\social# = social# * Rnd(0.9, 1.1)
 If child Then
  tmpcolor = colorgen(red1, green1, blue1, red2, green2, blue2)
  Temp\red = (tmpcolor And 48) Shr 4
  Temp\green = (tmpcolor And 12) Shr 2
  Temp\blue = (tmpcolor And 3)
 Else
  Temp\red = red1*3
  Temp\green = green1*3
  Temp\blue = blue1*3
 End If
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
 Organisms = Organisms + 1
End Function


genetics.bb:
Code: [AUSKLAPPEN]
Function rule1(gen1%, gen2%)
 half1 = Rand(1,2)
 half2 = Rand(1,2)
 result1% = gen1% And (half1 + (half1 Shl 2) + (half1 Shl 4) + (half1 Shl 6))
 If half1 = 2 Then result1 = result1 Shr 1
 result2% = gen2% And (half2 + (half2 Shl 2) + (half2 Shl 4) + (half2 Shl 6))
 If half2 = 1 Then result2 = result2 Shl 1
 Return (result1 + result2)
End Function

Function colorgen(red1%, green1%, blue1%, red2%, green2%, blue2%)
 newcolor% = rule1(((red1 Shl 4) + (green1 Shl 2) + blue1), ((red2 Shl 4) + (green2 Shl 2) + blue2))
 Return (newcolor)
End Function


math.bb:
Code: [AUSKLAPPEN]
Function age(birthtime)
 Return MilliSecs() - birthtime
End Function

Function distance#(x1#,y1#,x2#,y2#)
 Return Sqr((x2-x1)^2+(y2-y1)^2)
End Function

Function turnto(x1#,y1#,x2#,y2#,dir#)
 Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360
 If Temp# > 180 Then Temp# = Temp# - 360
 Return Temp#
End Function

Function dec#(a#, dig%)
   b# = a# * 10^dig%
   b# = Floor(b#)/10^dig%
   Return (b#)
End Function


variablen.bb
Code: [AUSKLAPPEN]
Const StartingPop = 50
Const Lifetime = 30
Const Lifetimediffer# = 2
Const PotentAge = 5
Const ImpotentPeriod = 4
Const NoPleasurePeriod = 2
Const twinprob# = 0.02
Const tripletprob# = 0.0008
Const satisfiedtime = 10
Const coupletime# = 0.5
Const Normattractivity = 1
Const nostarvingtime = 6

Global ShowRelationships = True
Global ShowBirthplaces = False
Global ShowOrganisms = True
Global isFood = False
Global births = 0
Global twins = 0
Global triplets = 0
Global deaths = 0
Global maxpop
Global minpop = StartingPop
Global starttime = MilliSecs()
Global maxlifeexpectancy# = 0
Global minlifeexpectancy# = Lifetime+Lifetimediffer#
Global avAge#
Global avchildren#
Global avLifetime#
Global LivingfemOrganisms
Global LivingmaleOrganisms
Global Organisms = Startpop
Global Lasttic
Global tail = 1
Global maxspeed# = 5
Global escapedist = 50
Global PredSize = 15
Global predvictums = 0
Global torg.Organism
Global torg2.Organism

Type FoodSource
 Field x#
 Field y#
 Field foodpoints
 Field origintime
End Type

Type skincolor
 Field red
 Field green
 Field blue
End Type

Type Predator
 Field x#
 Field y#
 Field dir#
 Field size#
 Field speed#
 Field speedfactor#
 Field movement
 Field lastfood
End Type

Type Organism
 Field x#
 Field y#
 Field dir#
 Field speed#
 Field speedfactor#
 Field movement
 Field birthtime
 Field partner
 Field lastchild
 Field gender%
 Field lastfood
 Field lifeexpectancy#
 Field children
 Field attractivity#
 Field startcouple
 Field maxspeed#
 Field social#
 Field red
 Field green
 Field blue
End Type

Type Birthplace
 Field x#
 Field y#
 Field expiry
End Type


Gruß
bommelid
 

Eisrabe

BeitragFr, Jan 30, 2004 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für das vollständige listing.

aber ich bekomme immernoch fehermeldungen. u.a hier:
[syntax="bb":1:9faf579aeb] Partner.Organism = Object.Organism(Temp\partner)[/syntax:1:9faf579aeb]

dieses problem kenne ich schon von anderen listing. und ich verstehe es auch nicht. weiso die klammern hinter dem type? ist nicht dimensioniert oder ne function. also wieso?
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Mr.Keks

BeitragFr, Jan 30, 2004 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
MENSCH EISRABE! Du nervst! Update mal dein BB und hör auf andauernd zu posten, dass irgendwas nicht funzt! Lass die finger vom Postknopf, überprüfe ob es EVENTUELL auch mal an deiner BBVersion liegen könnte und wenn es nicht an ihr liegt, dann poste!

p.s. die befehle object und handle gibt es nicht in den uraltbbversionen...
MrKeks.net

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group