Schwarm-Simulation

Übersicht BlitzBasic Codearchiv

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

Neue Antwort erstellen

 

CodeMaster

BeitragMi, Jan 07, 2004 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Der passende Titel fürs Spiel hieße dann "Evolution".
Das, was du ansprichst, boss@future, ist die zweite Möglichkeit, ein solches Spiel zu schreiben: Das gesamte Fortpflanzungssystem wieder auszubauen - diese Idee wäre tatsächlich sehr einfach umgesetzt.
Was ich aber auch suche, ist eine Spielidee, die diese schon vorhandene Fortpflanzungssimulation miteinbezieht.
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

theBlade

BeitragMi, Jan 07, 2004 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
oder tamagotchie mässig... er speichert die anzahl ständig ab, sodass das prog auch nach nem neustart weiterlaufen kann... und die teile sich weiter vermegren können... wär doch mal interessant zu sehen wieviel man bekommt ;D

aber cooles teil Smile

/edit: ok vergiss den vorschlag, ab 90 wird übel lahm... trotzdem cooles teil Smile
"Ich bin wie ich bin. Die einen kennen mich, die anderen können mich." (Dr. Konrad Adenauer)

UTFSB -> (use the fuckin "suchen"-button)

User posted image <- link -.-

Travis

BeitragMi, Jan 07, 2004 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hört sich cool an. Vielleicht könnte man ja noch Nahrung für die Organismen einbauen, die sie essen müssen, um nicht zu sterben. Die Nahrung könnte man dann ja entweder automatisch nachwachsen lassen, oder per Eingabe einfügen, oder mit der Maus "hinmalen".
Und man könnte noch zwischen zwei Geschlechtern unterscheiden.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

ViciouS

BeitragSa, Jan 10, 2004 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
da das jetzt ja geschlechtliche vermehrung ist will ich männlein und weiblein..
und kämpfende männchen... wie bei anderen tieren...
Skaten ist scheisse...
Bilanz: 3 Knochenbrüche in 4 Jahren...
und es werden mehr Laughing

theBlade

BeitragSa, Jan 10, 2004 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
mal ne frage: sollen diese organismen das sein wofür man(n) sie auf den ersten blick hält, oder ist das irgendwas anderes (halt was tier-ähnliches)
"Ich bin wie ich bin. Die einen kennen mich, die anderen können mich." (Dr. Konrad Adenauer)

UTFSB -> (use the fuckin "suchen"-button)

User posted image <- link -.-
 

CodeMaster

BeitragSa, Jan 10, 2004 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Smile das soll eurer Fantasie überlassen sein Laughing
Ein Problem bestand während der Programmierung auch in dem Wort "Organismus" - wenn man zwei bestimmte Buchstaben flüchtigerweise auslässt, erhält man Einblick in die ... ich nenne es mal "Urquelle des Sinns und Seins der Simulation"
Geschlechtliche Trennung wird's demnächst geben.
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

BeitragDi, Jan 20, 2004 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hab' mal versucht, den Organismen Geschlechter zuzuordnen. Das funzt auch soweit, nur kommt nach kurzer Zeit ein "memory access violation".

hier mal der code (blöderweise funktioniert beim posten von code die Farbänderung nicht. darum ein --> davor):
Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

AppTitle "Schwar-Simulation 2"

Const Lifetime = 30
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const ShowRelationships = True
Const ShowBirthplaces = True

Type Organism
 Field x#
 Field y#
 Field dir#
 Field speed#
 Field movement
 Field birthtime
 Field partner
 Field lastchild
--> Field gender
End Type

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

CreateSwarm(20)

While Not KeyDown(1)
 Cls
 UpdateSwarm
 UpdateBirthplaces
 ShowSwarm
 Flip
Wend
End

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

Function CreateOrganism(x#,y#)
 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(2)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Lifetime*1000 Then
   Delete Temp
  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 Or 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) > ImpotentPeriod * 1000) And (age(Partner\lastchild) > ImpotentPeriod * 1000) Then
        CreateOrganism(Temp\x#,Temp\y#)
        Temp\lastchild = MilliSecs()
        Partner\lastchild = MilliSecs()
        Temp\partner = 0
        Partner\partner = 0
       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# < 0 Then Temp\y# = Temp\y# + GraphicsHeight()
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight()
  EndIf
 Next
End Function

Function ShowSwarm()
 Color 255,255,255
 For Temp.Organism = Each Organism
  LivingOrganisms = LivingOrganisms + 1
  clr = 255 - age(Temp\birthtime) * 255 / (Lifetime * 1000)
-->  Color 0,0,clr
-->  If Temp\gender = 1 Then Color clr,0,0
  DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement)
 Next
 Color 255,0,0
 Text 1,1,"Lebendige Organismen: " + LivingOrganisms
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)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx# = x# + Cos(dir#) * size# / 2
 ny# = y# + Sin(dir#) * size# / 2
 For i = 1 To size#
  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
End Function


Gruß
bommelid
 

CodeMaster

BeitragDi, Jan 20, 2004 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht schön aus!

Ich hab keinen Fehler bekommen, es allerdings auch nur etwa 20 Sekunden laufen lassen Wink

Um ehrlich zu sein, ich hab dieses "Projekt" (welches ja eigentlich gar keins ist) aufgrund von mangelnder Wichtigkeit im Vergleich zu meinen anderen momentanen Projekten erstmal auf Eis gelegt (um nicht zu sagen aufgegeben Smile)

Es ist jedoch ausdrücklich erwünscht, dass ihr wenn ihr möchtet, den Code weiterentwickelt oder "entführt".
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

BeitragDi, Jan 20, 2004 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab' den Fehler gefunden. Durch die zusätzliche gender-Abfrage konnte es dazu kommen, daß einer der Partner beim Liebesspiel stirbt Wink
Mit den Änderungen sollte es jetzt klappen.
Man könnte auch noch eine Wahrscheinlichkeit für Mehrlingsgeburten einfügen.
Laßt doch mal ein paar Ideen hören. Der Thread ist ja eigentlich interessant genug.

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

AppTitle "Schwar-Simulation 2"

Const Lifetime = 30
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const ShowRelationships = True
Const ShowBirthplaces = True

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

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

CreateSwarm(30)

While Not KeyDown(1)
 Cls
 UpdateSwarm
 UpdateBirthplaces
 ShowSwarm
 Flip
Wend
End

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

Function CreateOrganism(x#,y#)
 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(2)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Lifetime*1000 Then
   Delete Temp
  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) > ImpotentPeriod * 1000) And (age(Partner\lastchild) > ImpotentPeriod * 1000) Then
         CreateOrganism(Temp\x#,Temp\y#)
         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# < 0 Then Temp\y# = Temp\y# + GraphicsHeight()
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight()
  EndIf
 Next
End Function

Function ShowSwarm()
 Color 255,255,255
 For Temp.Organism = Each Organism
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - age(Temp\birthtime) * 255 / (Lifetime * 1000)
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement)
 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)
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)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx# = x# + Cos(dir#) * size# / 2
 ny# = y# + Sin(dir#) * size# / 2
 For i = 1 To size#
  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
End Function


Gruß
bommelid
 

bommelid

BeitragDi, Jan 20, 2004 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon wieder ich Very Happy
Habe jetzt noch Zwillings- u. Drillingsgeburten hinzugefügt (alle 85 bzw. alle 85*85 Geburten)
Trotzdem waren bald keine Organismen mehr da.
Dann habe ich die ImpotentPeriod bei den Männlichen Organismen weggenommen (Schuldgefühle zählen nicht).
Jetzt pendelt sich das hier bei etwa 50 Organismen ein.

Hier mal noch der Code:

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

AppTitle "Schwar-Simulation 2"

Const Lifetime = 30
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const ShowRelationships = True
Const ShowBirthplaces = True
Const twinprob# = 0.012
Const tripletprob# = 0.00014

Global births = 0
Global twins = 0
Global triplets = 0

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

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

CreateSwarm(30)

While Not KeyDown(1)
 Cls
 UpdateSwarm
 UpdateBirthplaces
 ShowSwarm
 Flip
Wend
End

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

Function CreateOrganism(x#,y#)
 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)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Lifetime*1000 Then
   Delete Temp
  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
         multibirth# = Rnd(0, 1)
       CreateOrganism(Temp\x#,Temp\y#)
       If multibirth# <= twinprob# Then
        twins = twins + 1
        CreateOrganism(Temp\x#,Temp\y#)
       EndIf
       If multibirth# <= tripletprob# Then
        twins = twins - 1
        triplets = triplets + 1
        CreateOrganism(Temp\x#,Temp\y#)
       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# < 0 Then Temp\y# = Temp\y# + GraphicsHeight()
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight()
  EndIf
 Next
End Function

Function ShowSwarm()
 Color 255,255,255
 For Temp.Organism = Each Organism
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - age(Temp\birthtime) * 255 / (Lifetime * 1000)
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement)
 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 400,0,"Geburten insgesamt: " + births
 Text 400,15," Zwillingsgeburten: " + twins
 Text 400,30," Drillingsgeburten: " + triplets
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)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx# = x# + Cos(dir#) * size# / 2
 ny# = y# + Sin(dir#) * size# / 2
 For i = 1 To size#
  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
End Function


Gruß
bommelid
 

CodeMaster

BeitragDi, Jan 20, 2004 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, echt cool! Wird immer besser!
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

Travis

BeitragDi, Jan 20, 2004 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, nicht schlecht. Was man jetzt noch einbauen könnte wäre eine Statistikanzeige über die minimale und die maximale Bevölkerung. Und eine Anzeige der Todesfälle. Very Happy
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

bommelid

BeitragDi, Jan 20, 2004 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@Travis: Dein Wunsch ist mir Befehl! Min/Max-Population und Todesfälle.
In der Titelleiste stehen jetzt auch die verstrichenen Sekunden.

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

AppTitle "Schwar-Simulation 2"

Const StartingPop = 30
Const Lifetime = 30
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const ShowRelationships = True
Const ShowBirthplaces = False
Const twinprob# = 0.012
Const tripletprob# = 0.00014

Global births = 0
Global twins = 0
Global triplets = 0
Global deaths = 0
Global maxpop
Global minpop = StartingPop
Global starttime = MilliSecs()

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

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

CreateSwarm(StartingPop)

While Not KeyDown(1)
 Cls
 UpdateSwarm
 UpdateBirthplaces
 ShowSwarm
 Flip
Wend
End

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

Function CreateOrganism(x#,y#)
 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)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
End Function

Function UpdateSwarm()
 For Temp.Organism = Each Organism
  If age(Temp\birthtime) > Lifetime*1000 Then
   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
         multibirth# = Rnd(0, 1)
       CreateOrganism(Temp\x#,Temp\y#)
       If multibirth# <= twinprob# Then
        births = births + 1
        twins = twins + 1
        CreateOrganism(Temp\x#,Temp\y#)
       EndIf
       If multibirth# <= tripletprob# Then
        twins = twins - 1
        births = births + 1
        triplets = triplets + 1
        CreateOrganism(Temp\x#,Temp\y#)
       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# < 0 Then Temp\y# = Temp\y# + GraphicsHeight()
   If Temp\y# > GraphicsHeight() Then Temp\y# = Temp\y# - GraphicsHeight()

  EndIf
 Next
End Function

Function ShowSwarm()
 Color 255,255,255
 For Temp.Organism = Each Organism
  If Temp\gender% = 1 Then
   LivingfemOrganisms = LivingfemOrganisms + 1
  Else
   LivingmaleOrganisms = LivingmaleOrganisms + 1
  EndIf
  clr = 255 - age(Temp\birthtime) * 255 / (Lifetime * 1000)
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement)
 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 300,0,"Geburten insgesamt: " + births
 Text 300,15," Zwillingsgeburten: " + twins
 Text 300,30," Drillingsgeburten: " + triplets
 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
; Text 550,45," Zeit: " + (MilliSecs() - starttime)/1000 + "s"
 AppTitle " Zeit in sek.: " + (MilliSecs() - starttime)/1000


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)
 Oval x#-size#/2,y#-size#/2,size#,size#,1
 nx# = x# + Cos(dir#) * size# / 2
 ny# = y# + Sin(dir#) * size# / 2
 For i = 1 To size#
  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
End Function


Ich meinte aber eher Vorschläge zur Implementation von Nahrung oder Wasser.
Danach käme dann die Unterteilung der Organismen in solche, welche die implementierte Nahrung fressen und solche, die die Nahrung fressenden Organis´men fressen. Sowas wie Pflanzen- u. Fleischfresser.

Vorschläge zur Codeoptimierung sind natürlich auch willkommen.

Gruß
bommelid

Travis

BeitragDi, Jan 20, 2004 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool und auch eine Laufzeitanzeige Very Happy . Was das mit dem Futter angeht, würde ich vorschlagen, dass die Organismen vielleicht nur 1-2 mal im Leben essen, oder zur Paarung. Sonst wären sie wohl nur am futtern.

So könnte man ja mit Hilfe von Birthtime bestimmen, wann die Organismen hunger haben. Dann müsste er sich eine Futterquelle aussuchen und sie ansteuern. Wenn er eine findet, ist der hunger weg. Also braucht man wohl eine Variable dafür. Wenn er keine findet, dann stirbt er.

Für die erzeugung des Futters müßte man sich überlegen, ob man feste Futterplätze einbaut, die permanent bestehenbleiben (unerschöpflich) oder immer wieder neue erzeugt. Dann muss man sich allerdings genau überlegen, wie man das anstellt, dass auch immer so viel futter da ist, dass nicht alles sterben. Letzteres wäre natürlich interessanter, aber auch schwieriger.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

bommelid

BeitragDi, Jan 20, 2004 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte mir die Futterquellen einfach als Kreise. Je mehr Futter noch an der jeweiligen Quelle vorhanden ist, desto größer der Kreis.
Futtern die Organismen, nimmt der Radius logischerweise ab.
Desweiteren sollte die Futterquelle noch eine Regenerationsrate besitzen. Frißt keiner, wird der Kreis wieder größer.
Die Organismen fressen und können dann weitere x Sekunden überleben (natürlich nur bis zur max. Lebensdauer).
Man muß versuchen, die Regenerationsrate der Futterquellen so zu wählen, daß die Zahl der Organismen sich irgendwie selbst reguliert. weniger Futter, weniger Organismen.
Alles nicht so einfach aber sicher machbar.
 

CodeMaster

BeitragDi, Jan 20, 2004 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir fällt was ganz böööses ein:
Die toten Organismen könnten als Futterquelle dienen Twisted Evil
Es gibt tatsächlich Tierarten, bei denen es nach diesem Prinzip verläuft. Und ganz böse Diktator-Spermien haben manchmal sogar auch Kinder zum Fressen gerne. Nur so als Anregung, dann müsste man sich auch keine Gedanken von wegen Futtergeneration machen Wink

Ich muss schon sagen: Mein Code scheint in deinen Händen gut aufgehoben zu sein, bommelid.
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

BeitragDi, Jan 20, 2004 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@CodeMaster: Mir gefällt Deine Denkweise! Twisted Evil

Jetzt fehlt mir nur noch die Zeit, das umzusetzen.
Aber ich hoffe stark auf andere Coder aus dem Forum, da ich die Sache wirklich super interessant finde.

Egal. Hier mal ein paar Gedanken zum Projekt:
1.) Wie lange sollen die Organismen eigentlich max. ohne Nahrung auskommen können? Sind 10s ok?

2.) 4s vor dem Hungertod sollten die Org. alles stehen und liegen lassen und die nächste Futterquelle aufsuchen (oder wenigstens den Versuch starten). Oder ist das doof?

3.) Soll der Hungerstatus irgendwie sichtbar sein?

4.) Für wieviel Portionen soll ein toter Organismus reichen? Shocked

5.) Verwesen die Reste irgendwann, wenn keiner sie frisst?

6.) Gibt es trotzdem noch andere Nahrungsquellen (mit weniger Energie weil keine Proteine)?

7.) Sind Jungorganismen (vor der Geschlechtsreife) als Nahrung ok? Twisted Evil

Fragen über Fragen

Gruß
bommelid
 

bommelid

BeitragMi, Jan 21, 2004 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hab' wieder ein wenig gebastelt. Tote Organismen verwandeln sich in Futterquellen. Das hat aber noch keine sonstigen Auswirkungen. Gefressen wird noch nicht und auch nichts angezeigt (weil Const isFood = False).
Ausserdem habe ich eine Lebenserwartung für jeden Organismus implementiert. Das wird per Zufall ermittelt über die Lifetime und eine max. Abweichung (Lifetime + Rnd(-Lifetimediffer,Lifetimediffer).
Die Lebenserwartung wird ausserdem vererbt. Für den Nachwuchs wird jeweils der Durchschnitt der Lebenserwartungen der Eltern gebildet und natürlich auch wieder die Abweichung per Zufall bestimmt.
Wie erwartet steigt die durchschnittliche Lebenserwartung im Laufe der Zeit an (jedenfalls in meinen Tests).
Damit die Statistikanzeige etwas besser zu sehen ist, habe ich den Lebensraum der Organismen etwas beschränkt.

Gibt es in BB die Möglichkeit ein zweites Fenster zu öffnen und die statistischen Angaben dort anzuzeigen?

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

AppTitle "Schwar-Simulation 2"

Const isFood = False
Const StartingPop = 30
Const Lifetime = 30
Const Lifetimediffer# = 2
Const PotentAge = 6
Const ImpotentPeriod = 6
Const NoPleasurePeriod = 2
Const ShowRelationships = True
Const ShowBirthplaces = False
Const twinprob# = 0.012
Const tripletprob# = 0.00014
Const satisfiedtime = 5

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#

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#
End Type

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

CreateSwarm(StartingPop)

While Not KeyDown(1)
 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#)
 Temp2.Birthplace = New Birthplace
 Temp2\x# = x#
 Temp2\y# = y#
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
         multibirth# = Rnd(0, 1)
       CreateOrganism(Temp\x#,Temp\y#,(Temp\lifeexpectancy#+Partner\lifeexpectancy#)/2)
       If multibirth# <= twinprob# Then
        births = births + 1
        twins = twins + 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
        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,(256-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()
 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)
  Color 0,0,clr
  If Temp\gender% = 1 Then Color clr,0,0
  DrawOrganism(Temp\x#,Temp\y#,Temp\dir#,age(Temp\birthtime)*10/(Lifetime*1000)+5,Temp\movement,Temp\gender%)
 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
 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 " 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


Gruß
bommelid

BigSnake

BeitragMi, Jan 21, 2004 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wäre auch interessant zu wissen, wie oft sich ein Organismus durchschnittlich paart bevor er stirbt.

wunderkind

BeitragMi, Jan 21, 2004 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne den Sourcecode gelesen zu haben:

Nach etwa zehn Minuten waren im Schnitt 180 lebend, eine Minute später (ein wenig die Maus bewegt), alle tot. Als die 180 lebten war's arg ruckelig.

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