(Ich will dies und das tun...)Evolutionssimulation

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

MikeDee

Betreff: (Ich will dies und das tun...)Evolutionssimulation

BeitragDo, Okt 16, 2008 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollt schon länger eine Evolutionssimulation machen, aber ich komm mit dem programmieren nicht wirklich schnell vorran und bevor die Idee weg ist Poste ich sie. (und vieleicht hat jemand Lust es zu machen^^)
was noch nicht fertig gedacht ist, ist die Pflanze, mit der finde ich keine zufriedenstellende Lösung
Die Simulation startet mit einer Einheit und mehreren Pflanzen.
Die Einheit(Tierisch):
Jede Einheit hat drei Eigenschaften, Nahrung, Geschwindigkeit, Leben. Und eine Spezialeigenschaft, Energie.
Die Eigenschaften haben einen Wert, der bei 1 anfängt und nach oben hin offen ist. Die Spezialeigenschaft, Energie, hat zwei Werte: max-E und aktuelle-E.
Die max-E ist die Summe der drei Eigenschaften, wodurch der niedrigste Wert bei drei liegt. Die aktuelle-E berechnet sich aus verschiedenen Faktoren, die später erklärt werden.
Die Eigenschaften:
Geschwindigkeit: Bestimmt wie weit die Einheit pro Runde kommt.
1 Geschwindigkeit = 1 Schritt, Raster, cm, Pixel oder ähnliches
Nahrung: Bestimmt ob die Einheit Fleisch- oder Pflanzenfresser ist.
Nahrung < 50 = Pflanzenfresser Nahrung > 50 = Fleischfresser. Man könnte aber auch eine Grenze auf 10 setzen und bei 5 ist der Übergang oder den Wert als Prozentzahl machen, 1 = mit 1% Wahrscheinlichkeit frisst es Fleisch, 73 = mit 73% Wahrscheinlichkeit frisst es Fleisch, usw. Oder man setzt eine Grenze auf 15, bis 5 frisst es Pflanzen, von 6 bis 10 frisst es Pflanzenfresser und von 11 bis 15 frisst es Fleischfresser. Also 100% ist es noch nicht geklärt.
Leben: Rein Theoretisch hätte die Geschwindigkeit oder ein nach oben offenes Nahrung den gleichen Effekt, Praktisch wollte ich aber nicht das immer das schnellste oder ein Fleischfresser besser dran ist als die anderen.
Energie: Wenn die Einheit etwas frisst steigt die aktuelle-E um eins, wenn sie „angebissen“ wird oder keine Nahrung findet sinkt die aktuelle-E um eins. Wenn die aktuelle-E bei 0 ist stirbt die Einheit, wenn die aktuelle-E gleich der max-E ist teilt sich die Einheit. Bei der neuen Einheit, aus der Teilung ist ein zufälliger Wert höher bzw. niedriger als beim Original.
Berechnung der aktuellen Energie: Bei der Teilung bekommt die Original Einheit seine alte aktuelle Energie, die neue Einheit bekommt den Energie Überschuss.
(Alte Einheit 1/3, neue Einheit 2/4. Alte Einheit 2/4 neue Einheit 2/5 oder 2/3)
(aktuelle-E2/4max-E)
Der Simulationsablauf:
Die Simulation läuft in Runden ab, welches grob gesagt in 4 Schritten abläuft: Umgebung kontrollieren, Bewegung, Energie berechnen, Aktion
Runden Beispiel:
(Als Beispiel wird eine Einfach Einheit mit 1/3 Energie genommen.
Runde 1
Schritt 1: Die Einheit kontrolliert die Umgebung auf Nahrung und Feinde und sucht sich eine Laufrichtung aus.
Schritt 2a Einheit bewegt sich zu einer Nahrungsquelle.
Schritt 2b Einheit flieht vor einem Fleischfresser und wird erwischt.
Schritt 2c Einheit flieht vor einem Fleischfresser und wird nicht erwischt.
Schritt 2d Einheit findet nichts und geht in eine zufällige Richtung.
Schritt 3a Einheit bekommt einen Energiepunkt (2/3)
Schritt 3b Einheit verliert einen Energiepunkt (0/3)
Schritt 3c Einheit verliert einen Energiepunkt (0/3)
Schritt 3d Einheit verliert einen Energiepunkt (0/3)
Schritt 4a Einheit macht die nächste Runde
Schritt 4b Einheit stirbt
Schritt 4c Einheit stirbt
Schritt 4d Einheit stirbt
Schritt 1.1 Die Einheit (wenn sie noch lebt^^) kontrolliert die Umgebung auf Nahrung und Feinde und sucht sich eine Laufrichtung aus.

Schritt 2.1a wie 2a - 3a (3/3)
Schritt 2.1b wie 2b - 3b (1/3)
Schritt 2.1c wie 2c – 3c (1/3)
Schritt 2.1d wie 2d – 3d (1/3)
Schritt 4.1a Einheit teilt sich, die Energie der alten Einheit geht wieder auf 1/3, bei der neuen Einheit steigt ein Wert und die Energie geht auf 2/4
(neue Einheit(aktuelle-E)=alte Einheit(max-E – aktuelle-E))
Schritt 4.1b Einheit macht die nächste Runde
Schritt 4.1c Einheit macht die nächste Runde
Schritt 4.1d Einheit macht die nächste Runde
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

Skabus

BeitragDo, Okt 16, 2008 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm netter Ansatz, hab ebenfalls bereits mehre Konzepte zu diesem Thema ausgearbeitet.
Schwachpunkt der ganzen Sache ist aber die Frage welchen Sinn man letzlich aus dieser Konzeptierung ableiten soll....

Prinzipiell ist Evolution das weitergeben von gemachter Erfahrung,genetische Mutation und Verkümmerung bzw. Ausbildung neuer Körperextreme oder Organen, bzw. Umbildung und Erweiterung von Körperextremen zur Anpassung an die Umgebung.

Wenn ich dein Beispiel richtig interpretgiert habe, würde bei fortlaufender Evolution keinesfalls eine wirklich effektive Evolution sondern eine rollenspielähnliche Auswertung bereits vorhandener Werte vollzogen werden.Sicher ist das nicht schlecht, daher aber meine Bedenken über den Sinn der ganzen Sache.

Ich denke es muss zumindest zu einer gewissen sinngebenden Evolution führen.Das drumherum finde ich persönlich sinngebend, nur halt die Evolution selbst macht für mich keinen Sinn...Ich hatte einen imo sinnvolleren Ansatz mal so formuliert:

[...](Anmerkung: Aktionen sollen übrigens per Belohnungs- und Bestrafungspunkte(die Glückshormone simulieren sollen) ausgewertet und katalogiert werden.)

Bei der Fortpflanzung bekommt das entstandene Kind die Erinnerungen von Mutter und Vater übergeben.Überschneidet sich eine Erfahrung von Mutter und Vater(weil sie identische Situationen beschreibt) werden die dafür erhaltenen Belohnungs und Bestrafungspunkte zusammenaddiert.So kann Erfahrung durch Vererbung verbessert werden.
Nehmen wir an, beide Elternteile haben gemerkt, dass es mehr Belohnungspunkte gibt wenn man
bei großem Hunger isst.(Die wohl am häufigsten gemachte Erfahrung) .Das Kind wird somit
von anfang an eher den Drang haben bei großem Hunger zu essen als andere Dinge zu machen.

[...]

Der Sinn dabei ist, durch Evolution die Anpassung der Einheit zu verbessern.Dabei gehe ich davon aus, das Instinkt ein Resultat aus genetischer Information ist, die direkt oder indirekt dem Erben übergeben
wird.Der so ausgestattete Erbe hat einen deutlichen Vorteil gegenüber der Elterngeneration.
Über viele Generationen hinweg erweitert sich dadurch Wissen und Anpassungsfähigkeit der Einheit.


Das vielleicht nur mal so als kleine Anregung^^

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

MikeDee

BeitragDo, Okt 16, 2008 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir halt gedacht das es diese Energiepunkte gibt, wenn es frisst bekommt es welche, wenn nicht verliert es welche. (max Energie = teilung und 0 Energie = tot)
Dadurch können sich individuen die Nahrung finden sich vermehren und welche die keine Finden Sterben

Ausserdem habe ich mir auch gedacht das sich kleine Individuen 1/3 Energie bei genug Nahrung zwar schnell und oft vermehren, aber bei Nahrungsknappheit aussterben.
Größere Individuen 30/50 brauchen zwar länger sich zu vermehren, überleben aber auch besser eine Nahrungsknappheit, wodurch sie unter umständen bis zum nächsten Nahrungsüberfluss überleben.

und 3. wollte ich ein möglichst einfaches System (der Text ist zwar lang, aber trotzdem ist das Konzept recht einfach)

mein nächsten Post kann ich warscheinlich erst nächsten Do. machen

cu
MikeDee
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

Skabus

BeitragFr, Okt 17, 2008 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm keine schlechte Idee!Hatte ich gar net bedacht....^^"


Allerdings würde sich die Evolution ja dann auf diese Tatsache beschränken oder?Sollte man zum Beispiel
andere Lebewesen ins Ökosystem bringen, z.B. Fressfeinde oder sogar agressive Lebensformen die deine
Einheit angreifen würden dann nicht erkannt und instinktiell, gemieden oder bekämpft werden oder?



MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

MikeDee

BeitragFr, Okt 17, 2008 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz verstehe ich jetzt den Letzten satz nicht...
aber ich glaube das sich Pflanzenfresser-Fleischfresser schonoch einpendeln, zumal es ja auch den Nahrungswert gibt, und wenn der sich als erfolgreich bewärt wird es Fleischfresser geben, wenn nicht, dann eben nicht^^

p.s. ich weiß, es ist kein Do.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

Skabus

BeitragFr, Okt 17, 2008 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
MikeDee hat Folgendes geschrieben:
So ganz verstehe ich jetzt den Letzten satz nicht...
aber ich glaube das sich Pflanzenfresser-Fleischfresser schonoch einpendeln, zumal es ja auch den Nahrungswert gibt, und wenn der sich als erfolgreich bewärt wird es Fleischfresser geben, wenn nicht, dann eben nicht^^

p.s. ich weiß, es ist kein Do.


Naja ich hatte mir dabei gedacht, dass es irgendwie für die Einheit die Möglichkeit geben muss, dass sie auf
Lebensformen und Einwirkungen in der Umgebung reagieren muss und lernen muss welche Gefahren es meiden und welche Feinde es besiegen kann und vor welchem er lieber wegrennen sollte....

Tiere wissen im Vergleich zum Menschen genau was sie essen können und was nicht, sie wissen welche Tierrasse Feind und wer Freund ist und welche Wesen es gewachsen ist und bei welchem es um sein Leben rennen muss...

Evtl. versteh ich nur deinen Ansatz nicht ganz XD
Ich dachte mir, dass durch die übergebene Gene diese Informationen an den Erben weitergegeben wird.

Haben wir z.B. einen Fleischfresser der die Einheit bedroht in der Nähe merkt die Elterngeneration, dass dieser Fleischfresser eine Bedrohung ist(was sie durch die Erkenntnis gewonnen hat, dass sie durch ihre Anwesenheit Energie verloren hat) und gibt diese Information an die nächste Generation weiter.

Diese macht dann evtl. ähnliche Erfahrungen und gibt beide Erfahrungen an seine Kinder weiter.
Am Ende entsteht dann eine instinktgesteuerte Abneigung gegen oben genannten Fleischfresser, was
die Einheit dann ab einem bestimmten Zeitpunkt dazu bringt den Fleischfresser immer zu meiden.

Ich verfolge dabei den Ansatz eines lernfähigen Individuums welches das Ziel verfolgt sich so gut wie möglich in die Umwelt einzufügen und zu überleben.

Evtl. unterscheiden sich nur unsere Wirkungsabsichten, in dieser Sache...

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

MikeDee

BeitragFr, Okt 17, 2008 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
achso, ja des hab ich mir ganz einfach ausgedacht. Fleischfresser hab ja einfach einfach einen höheren Nahrungswert und alles was einen höheren Wert (z.b. um 5 höher als der eigene) hat ist ein Feind, alles was einen Niedrigeren Wert (z.b. um 5 niedriger als der eigene) hat ist was zum essen (ausser es ist Pflanzenfresser^^).

Der Fleischfresser kann sich also nur damit Helfen, das es langsamere Tiere findet als es selbst ist.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

DerHase

BeitragFr, Okt 17, 2008 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Conways Spiel des Lebens
Play Satyr!

DAK

BeitragFr, Okt 17, 2008 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke nicht, dass das Game of Life wirklich das is, was mike und skabus wollen Wink

Ich hab was in die richtung (evolutionssimulation) programmiert. ist zwar weniger ki-lastig (keine vererbung von was ist feind, was ist freund) hat dafür aber evolutuon basierend auf einem genom.

das ganze spielt auf Zellebene -> es gibt tierische Zellen / Pflanzenzellen / Viren

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

Type cell
   Field nr, x#, y#, pic, health#, maxhealth, genom$, nutrition, speed#, photosynth, breedtime, breed#, lifetime, lifespan, kill#, tarnr, startrace
   Field vircommand, virgenom$[10], infected, activatetime, isfood, generation
End Type

Dim startgenom$(5)
Dim stats(5)
Dim stats2#(5)
Dim seq_pos$(4,1)
Dim current_cell_pic(4,1)
Dim chars$(15)
Dim saves$(10)
Dim saverace(10)
Dim savepics(10)
For i = 0 To 15
   chars$(i) = hex2(i)
Next

Global maxcells = 200
Global mh1

Const health$      ="001"
Const nutrition$   ="002"
Const speed$      ="003"
Const c_r$         ="004"   ;Farbe
Const c_g$         ="005"   ;Farbe
Const c_b$         ="006"   ;Farbe
seq_pos$(1,0)      ="007"
seq_pos$(2,0)      ="008"
seq_pos$(3,0)      ="009"
seq_pos$(4,0)      ="00A"
seq_pos$(1,1)      ="00B"
seq_pos$(2,1)      ="00C"
seq_pos$(3,1)      ="00D"
seq_pos$(4,1)      ="00E"
Const virgenom$      ="F"
Const breedtime$   ="010"
Const lifespan$      ="011"
Const photosynth$   ="012"
Const vircommand$   ="013"
Const immune$      ="123"

Global cells=0

startgenom$(5) = "0013FF0026660030200040FF00500000600000700100801400901400B00100C00100D01401300604FFFF010001011600012015000000000000000000000000000000"
startgenom$(4) = "0013FF0026660030200040FF0050FF00600000700100801400901400B00100C00100D01401300604F001010001011600012015000000000000000000000000000000"
startgenom$(3) = "0013FF0026660030200040FF0050FF00600000700100801400901400B00100C00100D01401300404FFFF02F3FF06F3FF000000000000000000000000000000000000"
startgenom$(2) = "0010280026660030200040FF0050FF00600000700100801400901400B00100C00100D014013001000000000000000000000000000000000000000000000000000000"
startgenom$(1) = "0010600020010030200040FF0050FF00600000700100801400901400A00100B00100C00100D01400E0140100C8011600012006000000000000000000000000000000"
startgenom$(0) = "001050002FFF0030200040FF00500000600000700100801400900100A01400B00100C00100D01400E0140100C8011600012006000000000000000000000000000000"

For i = 0 To 5
   savepics(i) = create_save_pic(startgenom$(i))
   saves(i+1) = startgenom(i)
   saverace(i+1) = i
Next

refreshcells()

light = 1
Global foodnr = -1
Global gamespeed = 3

While Not KeyHit(1)
   Cls
   mh1 = MouseHit(1)
   If KeyHit(57) Then refreshcells()
   If KeyHit(28) Then light = 1-light
   
   If KeyHit(60) Then dfood = 1-dfood
   If KeyHit(61) Then dlight = 1-dlight
   If dlight Then dltimer = dltimer + 1*gamespeed
   If dltimer > 300 Then light = 1-light:dltimer = 0
   If dfood Then dftimer = dftimer + 1*gamespeed
   If dftimer > 200 Then dftimer = 0:spawn_food()
   
   If light Then ClsColor 50, 50, 50
   If light=0 Then ClsColor 0,0,0
   For c.cell = Each cell
      If fast=0 Or (fast=1 And flipframe=1) Then DrawImage c\pic, c\x, c\y
      If c\isfood = 0 Then
         If c\nutrition = 1 Then
            dir = Rand(360)
            distmax = 200
            tarnr = 0
            tarx = 0
            tary = 0
            found = 0
            For t.cell = Each cell
               If t\nutrition = 0 And t\nutrition <> 3 Then
                  found = found + 1
                  If dist(t\x, t\y, c\x, c\y) < distmax Then
                     distmax=dist(t\x, t\y, c\x, c\y)
                     tarnr=t\nr
                     tarx = t\x
                     tary = t\y
                  EndIf
               EndIf
               If found >= stats(4) Then Exit
            Next
            If tarnr <> 0 Then
               dir = ATan2(tary-c\y, tarx-c\x)+180
            EndIf
            c\health = c\health - 1*c\speed/32*gamespeed
            If light Then
               If c\health<c\maxhealth Then c\health# = c\health# + c\photosynth/2*gamespeed
               c\breed = c\breed + .9*gamespeed
            EndIf
         ElseIf c\nutrition = 0
            c\health = c\health-.01*c\speed/32*gamespeed
            If c\health > c\maxhealth/2 Then c\breed=c\breed+1.8*gamespeed
            ok = 0
            For t.cell = Each cell
               If t\nr = c\tarnr Then ok = 1
            Next
            ok=0
            If ok = 0 Then
               tardist = 10000
               c\tarnr = 0
               For t.cell = Each cell
                  If t\nutrition <> 0 And t\nutrition <> 2 Then
                     If tardist > dist(t\x, t\y, c\x, c\y) Then tardist = dist(t\x, t\y, c\x, c\y):c\tarnr = t\nr
                  EndIf
               Next
            EndIf
            For t.cell = Each cell
               If t\nr = c\tarnr Then
                  dir = ATan2(t\y-c\y, t\x-c\x)
                  If dist(t\x, t\y, c\x, c\y) < 20 And c\health<c\maxhealth-20 Then c\health=c\health+t\health:t\health=0:t\kill=2
               EndIf
            Next
            If c\tarnr = 0 Then dir = Rand(360)
            If c\health > c\maxhealth-20 Then dir = Rand(360)
         ElseIf c\nutrition = 2
            ok = 0
            For t.cell = Each cell
               If t\nr = c\tarnr Then ok = 1
            Next
            ok=0
            If ok = 0 Then
               tardist = 10000
               c\tarnr = 0
               For t.cell = Each cell
                  If t\nutrition <> 2 And t\infected=0 Then
                     If tardist > dist(t\x, t\y, c\x, c\y) Then tardist = dist(t\x, t\y, c\x, c\y):c\tarnr = t\nr
                  EndIf
               Next
            EndIf
            For t.cell = Each cell
               If t\nr = c\tarnr Then
                  dir = ATan2(t\y-c\y, t\x-c\x)
                  If dist(t\x, t\y, c\x, c\y) < 20 Then
                     For i = 1 To Len(t\genom$)/4
                        If readblock$(t\genom$, i) = immune$ Then c\health = 0
                     Next
                     If c\health = 0 Then
                        For i = 1 To Len(c\genom$)/4
                           If readblock$(c\genom$, i) = immune$ Then c\health = c\maxhealth
                        Next
                     EndIf
                     If c\health*2>t\health Or (t\nutrition=1 And c\health*4>t\health) Then
                        c\kill = 2
                        execute = c\vircommand
                        execute = execute Mod 4
                        If execute = 2 Then
                           t\genom$ = c\genom$
                           For i = 1 To Len(t\genom$)/4
                              If readblock$(t\genom$, i) = vircommand$ Then
                                 t\genom$ = replace_block$(t\genom$, i+1, "022")
                                 t\vircommand = 34
                                 t\startrace = c\startrace
                                 c\health=0
                              EndIf
                           Next
                        EndIf
                        If execute = 1 Then
                           t\genom$ = c\genom$
                           For i = 1 To Len(t\genom$)/4
                              If readblock$(t\genom$, i) = vircommand$ Then
                                 t\genom$ = replace_block$(t\genom$, i+1, "011")
                                 t\vircommand = 17
                                 t\startrace = c\startrace
                                 c\health=0
                              EndIf
                           Next
                        EndIf
                        execute = c\vircommand
                        execute = execute Mod 8
                        If execute/4 >= 1 Then
                           blocks = Len(t\genom$)/3
                           For i = 1 To blocks Step 2
                              rb$ = readblock$(c\genom$, i)
                              If Right(rb$, 1) = virgenom$ Then
                                 t\genom = replace_block$(t\genom$, unhex(Left(rb$, 2)), readblock$(c\genom$, i+1))
                              EndIf
                           Next
                        EndIf
                        t\infected=1
                     Else
                        t\health = t\health - c\health
                        c\health = -1
                     EndIf
                  EndIf
               EndIf
            Next
            If c\tarnr = 0 Then dir = Rand(360)
         Else
            dir = Rand(360)
            c\health = c\health - 1*c\speed/32
         EndIf
         If c\health > c\maxhealth Then c\health = c\maxhealth
         If c\breed > c\breedtime Then
            c\health = c\maxhealth/3
            c\breed = 0
            new_cell(c\genom$, c\x+Rand(-10,10), c\y+Rand(-10,10), c\startrace, c\generation)
         EndIf
         If c\infected Then
            execute = c\vircommand Mod 64
            If execute/32>=1 Then
               c\health = c\health - 19
               new_cell(c\genom$, c\x+Rand(-10,10), c\y+Rand(-10,10), 2, c\generation)
            Else
               execute = execute Mod 32
               If execute/16>=1 Then
                  If c\health > 150 Then new_cell(c\genom$, c\x+Rand(-10,10), c\y+Rand(-10,10), 2, c\generation):c\health = c\health-100
               EndIf
            EndIf
         EndIf
         c\x = c\x + (Cos(dir)*c\speed/100)*gamespeed
         c\y = c\y + (Sin(dir)*c\speed/100)*gamespeed
         c\lifetime = c\lifetime+1*gamespeed
         h = ImageHeight(c\pic)/2
         If c\x > 800 Then c\x = 800
         If c\y > 600 Then c\y = 600
         If c\x < 0 Then c\x = 0
         If c\y < 80+h Then c\y = 80+h
         If c\nutrition <> 2 Then
            If c\lifetime > c\lifespan Then c\kill=c\kill+.1*gamespeed
            If c\health < 20 Then c\kill=c\kill+2
         Else
            If c\health <0 Then c\kill = 2
         EndIf
      EndIf
      If c\health <0 Then c\kill = 2
      If c\kill>1 Then FreeImage(c\pic):Delete c.cell
   Next
   rechoose = rechoose - 1
   If rechoose = 1 Then key=usekey:ext=0:Goto chooseagain
   For key = 1 To 10
      If KeyHit(key+1) Then
         If KeyDown(29) Or KeyDown(157) Then
            ext = 0
            While Not MouseHit(2)
               .chooseagain
               If savepics(key) Then FreeImage savepics(key)
               savepics(key) = create_save_pic(saves$(key))
               mh1 = MouseHit(1)
               Color 255, 255, 255
               part1g$ = ""
               part2g$ = ""
               For i = 1 To 22
                  part1g$ = part1g$+" "+readblock(saves$(key), i)
               Next
               part1g$ = Right(part1g$, Len(part1g$)-1)
               For i = 23 To 44
                  part2g$ = part2g$+" "+readblock(saves$(key), i)
               Next
               part2g$ = Right(part2g$, Len(part2g$)-1)
               For i = 2 To 20 Step 2
                  Line 94+32*i, 40, 94+32*i, 55
               Next
               For i = 2 To 20 Step 2
                  Line 94+32*i, 55, 94+32*i, 70
               Next
               Text 34, 40, " Genom: "+part1g$
               Text 34, 55, "        "+part2g$
               part1o$ = ""
               part2o$ = ""
               For i = 1 To 22
                  part1o$ = part1o$+" "+readblock(startgenom$(saverace(key)), i)
               Next
               part1o$ = Right(part1o$, Len(part1o$)-1)
               For i = 23 To 44
                  part2o$ = part2o$+" "+readblock(startgenom$(saverace(key)), i)
               Next
               part2o$ = Right(part2o$, Len(part2o$)-1)
               For i = 2 To 20 Step 2
                  Line 94+32*i, 10, 94+32*i, 25
               Next
               For i = 2 To 20 Step 2
                  Line 94+32*i, 25, 94+32*i, 39
               Next
               Text 10, 10, "Startgenom:"+part1o$
               Text 10, 25, "           "+part2o$
               Text 10, 70, "Mutationen: "+count_mutations(saves$(key), startgenom$(saverace(key)))
               Line 99, 39, 793, 39
               Line 0, 70, 800, 70
               Color 0, 255, 0
               Text 10, 10, "           "+compare$(part1o$, part1g$)
               Text 10, 25, "           "+compare$(part2o$, part2g$)
               Color 255, 0, 0
               Text 10, 40, "           "+compare$(part1g$, part1o$)
               Text 10, 55, "           "+compare$(part2g$, part2o$)
               DrawImage savepics(key), 20, 50
               If mh1=1 Then
                  If MouseY()>40 And MouseY()<70 Then
                     If MouseX()>98 And MouseX()<98+(Len(part1g$)*8) Then
                        For i = 1 To Len(part1g$)
                           If MouseX()>98+i*8 Then xpos = i
                        Next
                        xpos2# = xpos
                        xpos2# = xpos2#/4
                        xpos = Floor(xpos2#)+1
                        If MouseY()<55 Then
                           saves$(key) = modify_block(no_spaces(saves$(key)), xpos)
                        Else
                           saves$(key) = modify_block(no_spaces(saves$(key)), 22+xpos)
                        EndIf
                        usekey = key
                        rechoose = 3
                        ext = 1
                     EndIf
                  EndIf
               EndIf
               If ext Then Exit
               If KeyHit(1) Then End
               Flip
            Wend
         Else
            new_cell(saves(key), MouseX(), MouseY(), saverace(key))
         EndIf
      EndIf
   Next
   If MouseHit(2) Then
      chosen = 0
      For c.cell = Each cell
         h = ImageHeight(c\pic)/2
         w = ImageWidth(c\pic)/2
         If MouseX() > c\x-w And MouseX() < c\x+w Then
            If MouseY() > c\y-h And MouseY() < c\y+h Then
               FreeImage(c\pic)
               Delete c.cell
               chosen = 1
            EndIf
         EndIf
         If chosen Then Exit
      Next
      FlushMouse
   EndIf
   If mh1 Or statsin Then
      If fast=0 Or (fast=1 And flipframe=1) Then
         chosen = 0
         For c.cell = Each cell
            h = ImageHeight(c\pic)/2
            w = ImageWidth(c\pic)/2
            If MouseX() > c\x-w And MouseX() < c\x+w Then
               If MouseY() > c\y-h And MouseY() < c\y+h Then
                  If c\genom<>"" Then chosen = c\nr
               EndIf
            EndIf
            If chosen Then Exit
         Next
         If chosen Then
            While Not MouseHit(2)
               For c.cell = Each cell
                  If chosen = c\nr Then
                     Color 255, 255, 255
                     part1g$ = ""
                     part2g$ = ""
                     For i = 1 To 22
                        part1g$ = part1g$+" "+readblock(c\genom$, i)
                     Next
                     part1g$ = Right(part1g$, Len(part1g$)-1)
                     For i = 23 To 44
                        part2g$ = part2g$+" "+readblock(c\genom$, i)
                     Next
                     part2g$ = Right(part2g$, Len(part2g$)-1)
                     For i = 2 To 20 Step 2
                        Line 94+32*i, 40, 94+32*i, 55
                     Next
                     For i = 2 To 20 Step 2
                        Line 94+32*i, 55, 94+32*i, 70
                     Next
                     Text 34, 40, " Genom: "+part1g$
                     Text 34, 55, "        "+part2g$
                     part1o$ = ""
                     part2o$ = ""
                     For i = 1 To 22
                        part1o$ = part1o$+" "+readblock(startgenom$(c\startrace), i)
                     Next
                     part1o$ = Right(part1o$, Len(part1o$)-1)
                     For i = 23 To 44
                        part2o$ = part2o$+" "+readblock(startgenom$(c\startrace), i)
                     Next
                     part2o$ = Right(part2o$, Len(part2o$)-1)
                     For i = 2 To 20 Step 2
                        Line 94+32*i, 10, 94+32*i, 25
                     Next
                     For i = 2 To 20 Step 2
                        Line 94+32*i, 25, 94+32*i, 39
                     Next
                     Text 10, 10, "Startgenom:"+part1o$
                     Text 10, 25, "           "+part2o$
                     Text 10, 70, "Mutationen: "+count_mutations(c\genom$, startgenom$(c\startrace))
                     Line 99, 39, 793, 39
                     Line 0, 70, 800, 70
                     Color 0, 255, 0
                     Text 10, 10, "           "+compare$(part1o$, part1g$)
                     Text 10, 25, "           "+compare$(part2o$, part2g$)
                     Color 255, 0, 0
                     Text 10, 40, "           "+compare$(part1g$, part1o$)
                     Text 10, 55, "           "+compare$(part2g$, part2o$)
                     DrawImage c\pic, 20, 50
                     For i = 1 To 10
                        If KeyHit(i+1) Then saves$(i)=c\genom$:saverace(i)=c\startrace
                     Next
                     Delay 100
                     Color 255, 255, 0
                     If KeyHit(1) Then End
                     Flip
                  EndIf
               Next
            Wend
         EndIf
         If statsin=1 Then fast=1
         statsin=0
      Else
         statsin=1
      EndIf
   EndIf
   If fast=0 Or (fast=1 And flipframe=1) Then
      cell_stats()
      Color 255, 255, 255
      Text 10, 10, "Zellen:         "+(stats(1)+stats(5))+"/"+maxcells
      Text 10, 25, "Beste HP:       "+stats2(1)
      Text 10, 40, "Beste MaxHP:    "+stats(2)
      Text 10, 55, "Max Mutationen: "+stats(3)
      Text 220, 25, "tier. Zellen:   "+stats(4)
      Text 220, 40, "pflanzl. Zellen:"+(stats(1)-stats(4))
      Text 220, 55, "Viren:          "+stats(5)
      Text 430, 10, "Max Generation: "+stats(6)
      Text 430, 25, "Geschwindigkeit:"+gamespeed
      If fast Then Text 760, 10, ">>"
      Line 0, 70, 800, 70
      For i = 1 To 10
         If saves(i) <> "" Then
            Rect 200+i*20, -1, 11, 21, 0
            Text 201+i*20, 3, i
         EndIf
      Next
      If mh1 Then
         If MouseY()>10 And MouseY()<20
            If MouseX()>144+Len(Str(stats(1)))*8 And MouseX()<144+Len(Str(stats(1)))*8+Len(Str(maxcells))*8
               maxcells=input2("Maximale Zellenanzahl:")
            EndIf
         EndIf
      EndIf
      Color 255, 255, 0
   EndIf
   flipframe = 1-flipframe
   If fast=0 Then Flip
   If flipframe=0 And fast=1 Then Flip
   ;If KeyHit(32) Then fast = 1-fast
   If KeyHit(32) Then gamespeed = gamespeed+1
   If KeyHit(31) Then gamespeed = gamespeed-1
   If statsin Then fast=0
   If KeyHit(59) Then
      For c.cell = Each cell
         FreeImage c\pic
         Delete c.cell
      Next
   EndIf
   Delay 3
Wend
End

Function input2$(capt$="", opt=0, minlen=0, maxlen=0) ;opt=0: alles, opt=1: int, minlen/maxlen: länge des inputs, 0 für unbegrenzt
   FlushKeys
   Color 128, 128, 128
   Rect 250, 200, 300, 200
   Color 0, 0, 0
   Text 400, 250, capt$, 1, 1
   Color 0, 0, 0
   Rect 300, 300, 200, 16
   Color 255, 255, 255
   Locate 302, 302
   While done=0
      done = 0
      out$ = Input()
      If Len(out$)<minlen Or (Len(out$)>maxlen And maxlen<>0) Then
         new_block$ = ""
         Color 0, 0, 0
         Text 400, 330, "Falsche Länge.", 1, 1
         If minlen = 0 Then
            Text 400, 345, "(höchstens bis "+maxlen+" Zeichen)", 1, 1
         EndIf
         If maxlen = 0
            Text 400, 345, "(mindestens "+minlen+" Zeichen)", 1, 1
         EndIf
         If minlen<>0 And maxlen<>0 Then
            Text 400, 345, "(nur "+minlen+" bis "+maxlen+" Zeichen erlaubt)", 1, 1
         EndIf
         Color 0, 0, 0
         Rect 300, 300, 200, 16
         Color 255, 255, 255
         Locate 302, 302
      ElseIf opt =1 Then
         out2 = out$
         If Str(out2) = out$ Then
            done = 1
         Else
            new_block$ = ""
            Color 0, 0, 0
            Text 400, 330, "Falsche Zeichen.", 1, 1
            Text 400, 345, "(nur Ziffern erlaubt)", 1, 1
            Color 0, 0, 0
            Rect 300, 300, 200, 16
            Color 255, 255, 255
            Locate 302, 302
         EndIf
      Else
         done = 1
      EndIf
   Wend
   FlushKeys
   FlushMouse
   Return out$
End Function

Function modify_block$(genom$, nr)
   FlushKeys
   block$ = readblock$(genom$, nr)
   Color 128, 128, 128
   Rect 250, 200, 300, 200
   Color 0, 0, 0
   Text 400, 250, block$, 1, 1
   Color 0, 0, 0
   Rect 300, 300, 200, 16
   Color 255, 255, 255
   Locate 302, 302
   While Len(new_block$)<>3
      new_block$ = Upper(Input())
      ok = 0
      new_block$ = LSet(new_block$, 3)
      new_block$ = Replace(new_block$, " ", "0")
      For x = 1 To 3
         For y = 0 To 15
            ok = ok+(chars$(y)=Mid(new_block$, x, 1))
         Next
      Next
      If ok<>3 Then
         new_block$ = ""
         Color 0, 0, 0
         Text 400, 330, "Falsche Zeichen", 1, 1
         Text 400, 345, "(nur Hexadezimalzahlen erlaubt)", 1, 1
         Color 0, 0, 0
         Rect 300, 300, 200, 16
         Color 255, 255, 255
         Locate 302, 302
      EndIf
   Wend
   times = Len(genom$)/3
   For i = 1 To times
      If nr<>i Then
         out$ = out$ + readblock$(genom$, i)
      Else
         out$ = out$ + new_block
      EndIf
   Next
   FlushKeys
   FlushMouse
   Return out$
End Function

Function replace_block$(genom$, nr, repl$)
   times = Len(genom$)/3
   For i = 1 To times
      If nr<>i Then
         out$ = out$ + readblock$(genom$, i)
      Else
         out$ = out$ + repl$
      EndIf
   Next
   Return out$
End Function

Function no_spaces$(in$)
   Return Replace(in$, " ", "")
End Function

Function compare$(genom1$, genom2$)
   length = Len(genom1$)
   If length<Len(genom2$) Then
      length=Len(genom2):genom1$=LSet(genom1$, length)
   Else
      genom2$=LSet(genom2$, length)
   EndIf
   For i = 1 To length
      comp1$ = Mid(genom1$, i, 1)
      comp2$ = Mid(genom2$, i, 1)
      If comp1$ = comp2$ Then
         out$=out$+" "
      Else
         out$=out$+comp1$
      EndIf
   Next
   Return out
End Function

Function count_mutations(genom1$, genom2$)
   length = Len(genom1$)
   If length<Len(genom2$) Then
      length=Len(genom2):genom1$=LSet(genom1$, length)
   Else
      genom2$=LSet(genom2$, length)
   EndIf
   For i = 1 To length
      comp1$ = Mid(genom1$, i, 1)
      comp2$ = Mid(genom2$, i, 1)
      If comp1$ <> comp2$ Then
         mutations = mutations+1
      EndIf
   Next
   Return mutations
End Function

Function cell_stats()
   Dim stats(6)
   Dim stats2(6)
   For c.cell = Each cell
      If c\isfood = 0 Then
         If c\nutrition <> 2 Then
            stats(1)=stats(1)+1
         Else
            stats(5)=stats(5)+1
         EndIf
         If c\health>stats2(1) Then stats2(1)=c\health
         If c\maxhealth>stats(2) Then stats(2)=c\maxhealth
         mutations = count_mutations(c\genom$, startgenom$(c\startrace))
         If mutations>stats(3) Then stats(3)=mutations
         If c\nutrition=0 Then stats(4) = stats(4) + 1
         If c\generation>stats(6) Then stats(6)=c\generation
      EndIf
   Next
End Function

Function dist(x1, y1, x2, y2)
   distance = (x1-x2)^2+(y1-y2)^2
   distance = distance^.5
   Return distance
End Function

Function refreshcells()
   For c.cell = Each cell
      FreeImage(c\pic)
      Delete c.cell
   Next
   For x = 200 To 600 Step 100
      For y = 100 To 500 Step 100
         If Rand(1,10) = 10 Then
            new_cell(startgenom$(0), x, y, 0)
         ElseIf Rand(1,20) = 1 Then
            new_cell(startgenom$(2), x, y, 2)
         Else
            new_cell(startgenom$(1), x, y, 1)
         EndIf
      Next
   Next
End Function

Function hex2$(in)
   out$ = Hex(in)
   For i = 1 To 8
      If Left(out$, 1) = "0" Then out$ = Right(out$, Len(out$)-1)
   Next
   If out$="" Then out$="0"
   Return out$
End Function

Function spawn_food()
   c.cell = New cell
   c\nr = -foodnr
   foodnr = foodnr-1
   c\x = Rand(0, 800)
   c\y = Rand(0, 800)
   c\pic = CreateImage(20, 20)
   Color 255, 255, 255
   SetBuffer ImageBuffer(c\pic)
   Oval 0, 0, 20, 20, 1
   MidHandle c\pic
   SetBuffer BackBuffer()
   c\health = 5000
   c\maxhealth = 5000
   c\nutrition = 1
   c\speed = 0
   c\lifespan = 100000
   c\infected = 1
   c\photosynth = 1
   c\breedtime = 1000000
   c\isfood = 1
   h = ImageHeight(c\pic)/2
   If c\x > 800 Then c\x = 800
   If c\y > 600 Then c\y = 600
   If c\x < 0 Then c\x = 0
   If c\y < 80+h Then c\y = 80+h
End Function

Function new_cell(genom$, x, y, race=100, generation=-1)
   If stats(1)+stats(5)<maxcells Then
      stats(1) = stats(1) +1
      mutate_rate = Rand(-12, 3)
      cells = cells+1
      genom$ = mutate$(genom$, mutate_rate)
      c.cell = New cell
      c\nr = cells
      c\x = x
      c\y = y
      c\genom$ = genom$
      nut = 0
      vgenom = 0
      blocks = Len(genom$)/3
      Dim current_cell_pic(4,1)
      For i = 1 To blocks Step 2
         b$ = readblock$(genom$, i)
         If Left(b$,1) = "0" Then
            If b$ = health$ Then
               c\health$ = unhex(readblock(genom$, i+1)) Mod 1024
               c\maxhealth$ = c\health*3
            EndIf
            If b$ = nutrition$ Then
               c\nutrition = unhex(readblock(genom$, i+1))
               nut = 1
               virnut = 0
               For v = 1 To 3
                  virnut = virnut+(Mid(readblock(genom$,i+1), v,1) = "6")
               Next
               If c\nutrition > 2047 Then
                  c\nutrition = 0
               Else
                  c\nutrition = 1
               EndIf
               If virnut>1 Then c\nutrition = 2
            EndIf
            If b$ = speed$ Then
               c\speed$ = unhex(readblock(genom$, i+1)) Mod 512
            EndIf
            If b$ = c_r$ Then
               rc = unhex(readblock(genom$, i+1)) Mod 256
            EndIf
            If b$ = c_g$ Then
               gc = unhex(readblock(genom$, i+1)) Mod 256
            EndIf
            If b$ = c_b$ Then
               bc = unhex(readblock(genom$, i+1)) Mod 256
            EndIf
            For d=1 To 4
               For v=0 To 1
                  If b = seq_pos$(d,v) Then
                     current_cell_pic(d, v) = unhex(readblock(genom$, i+1)) Mod 64
                  End If
               Next
            Next
            If b$ = photosynth$ Then
               c\photosynth = unhex(readblock(genom$, i+1)) Mod 16
            EndIf
            If b$ = breedtime$ Then
               c\breedtime = 300+unhex(readblock(genom$, i+1)) Mod 256
            EndIf
            If b$ = lifespan$ Then
               c\lifespan = unhex(readblock(genom$, i+1))
            EndIf
            If b$ = vircommand$ Then
               c\vircommand = unhex(readblock(genom$, i+1))
            EndIf
            If b$ = virgenom$ Then
               c\virgenom$[vgenom] = unhex(readblock(genom$, i+1))
               vgenom=vgenom+1
            EndIf
         End If
      Next
      If c\nutrition = 1 Then c\speed = c\speed/2
      If nut = 0 Then c\nutrition = 3
      If race = 100 Then
         c\startrace = c\nutrition
      Else
         c\startrace = race
      EndIf
      size = 0
      For v = 0 To 1
         For i = 0 To 4
            size = size+current_cell_pic(i, v)
         Next
         If size = 0 Then current_cell_pic(1, v)=1
      Next
      If c\breedtime = 0 And c\nutrition <> 2 Then Delete c.cell:Return
      If c\nutrition = 2 Then
         c\activatetime = Rand(1, 50000)
         c\pic = create_vir_pic(rc, gc, bc)
      Else
         c\pic = create_cell_pic(rc, gc, bc)
      EndIf
      c\generation = generation+1
   EndIf
End Function

Function create_save_pic(genom$)
   c.cell = New cell
   c\nr = cells
   c\x = x
   c\y = y
   c\genom$ = genom$
   nut = 0
   vgenom = 0
   blocks = Len(genom$)/3
   Dim current_cell_pic(4,1)
   For i = 1 To blocks Step 2
      b$ = readblock$(genom$, i)
      If Left(b$,1) = "0" Then
         If b$ = health$ Then
            c\health$ = unhex(readblock(genom$, i+1)) Mod 1024
            c\maxhealth$ = c\health*3
         EndIf
         If b$ = nutrition$ Then
            c\nutrition = unhex(readblock(genom$, i+1))
            nut = 1
            virnut = 0
            For v = 1 To 3
               virnut = virnut+(Mid(readblock(genom$,i+1), v,1) = "6")
            Next
            If c\nutrition > 2047 Then
               c\nutrition = 0
            Else
               c\nutrition = 1
            EndIf
            If virnut>1 Then c\nutrition = 2
         EndIf
         If b$ = speed$ Then
            c\speed$ = unhex(readblock(genom$, i+1)) Mod 512
         EndIf
         If b$ = c_r$ Then
            rc = unhex(readblock(genom$, i+1)) Mod 256
         EndIf
         If b$ = c_g$ Then
            gc = unhex(readblock(genom$, i+1)) Mod 256
         EndIf
         If b$ = c_b$ Then
            bc = unhex(readblock(genom$, i+1)) Mod 256
         EndIf
         For d=1 To 4
            For v=0 To 1
               If b = seq_pos$(d,v) Then
                  current_cell_pic(d, v) = unhex(readblock(genom$, i+1)) Mod 64
               End If
            Next
         Next
         If b$ = photosynth$ Then
            c\photosynth = unhex(readblock(genom$, i+1)) Mod 16
         EndIf
         If b$ = breedtime$ Then
            c\breedtime = 300+unhex(readblock(genom$, i+1)) Mod 256
         EndIf
         If b$ = lifespan$ Then
            c\lifespan = unhex(readblock(genom$, i+1))
         EndIf
         If b$ = vircommand$ Then
            c\vircommand = unhex(readblock(genom$, i+1))
         EndIf
         If b$ = virgenom$ Then
            c\virgenom$[vgenom] = unhex(readblock(genom$, i+1))
            vgenom=vgenom+1
         EndIf
      End If
   Next
   If c\nutrition = 1 Then c\speed = c\speed/2
   If nut = 0 Then c\nutrition = 3
   If race = 100 Then
      c\startrace = c\nutrition
   Else
      c\startrace = race
   EndIf
   size = 0
   For v = 0 To 1
      For i = 0 To 4
         size = size+current_cell_pic(i, v)
      Next
      If size = 0 Then current_cell_pic(1, v)=1
   Next
   If c\breedtime = 0 And c\nutrition <> 2 Then Delete c.cell:Return
   If c\nutrition = 2 Then
      c\activatetime = Rand(1, 50000)
      c\pic = create_vir_pic(rc, gc, bc)
   Else
      c\pic = create_cell_pic(rc, gc, bc)
   EndIf
   sp = c\pic
   Delete c.cell
   Return sp
End Function

Function create_cell_pic(r, g, b)
   If r = 0 Then r = 20
   If g = 0 Then g = 20
   If b = 0 Then b = 20
   Color r, g, b
   While xmax+ymax < 40
      ct = ct+1
      xmax = 0
      ymax = 0
      For i = 1 To 4
         If current_cell_pic(i,1) > xmax Then xmax = current_cell_pic(i,1)
         If current_cell_pic(i,0) > ymax Then ymax = current_cell_pic(i,0)
      Next
      If xmax+ymax < 40 Then
         For i = 1 To 4
            current_cell_pic(i,0) = current_cell_pic(i,0)*2
            current_cell_pic(i,1) = current_cell_pic(i,1)*2
         Next
      EndIf
      If xmax = 0 Then
         For i = 1 To 4
            current_cell_pic(i,0) = 1
         Next
      EndIf
      If ymax = 0 Then
         For i = 1 To 4
            current_cell_pic(i,1) = 1
         Next
      EndIf
      If ct = 100 Then Exit
   Wend
   pic = CreateImage(ymax+1, xmax+1)
   SetBuffer ImageBuffer(pic)
   For i = 1 To 4
      nx = i+1
      If nx>4 Then nx = 1
      Line current_cell_pic(i, 0), current_cell_pic(i, 1), current_cell_pic(nx, 0), current_cell_pic(nx, 1)
   Next
   SetBuffer BackBuffer()
   MidHandle pic
   Return pic
End Function

Function create_vir_pic(r, g, b)
   If r = 0 Then r = 20
   If g = 0 Then g = 20
   If b = 0 Then b = 20
   Color r, g, b
   xmax = 0
   ymax = 0
   For i = 1 To 3
      For v = 0 To 1
         current_cell_pic(i,v) = current_cell_pic(i,v)/4
      Next
   Next
   For i = 1 To 3
      If current_cell_pic(i,0) > xmax Then xmax = current_cell_pic(i,1)
      If current_cell_pic(i,1) > ymax Then ymax = current_cell_pic(i,0)
   Next
   pic = CreateImage(ymax+1, xmax+1)
   SetBuffer ImageBuffer(pic)
   For i = 1 To 3
      nx = i+1
      If nx>3 Then nx = 1
      Line current_cell_pic(i, 0), current_cell_pic(i, 1), current_cell_pic(nx, 0), current_cell_pic(nx, 1)
   Next
   SetBuffer BackBuffer()
   MidHandle pic
   Return pic
End Function

Function mutate$(genom$, rate)
   If rate>0 Then
      For i = 1 To rate
         If Rand(1,8) = 8 Then
            sp = Rand(1, Len(genom$)-1)
            genom$ = cutout_sequence$(genom$, sp, sp)
         Else
            sp = Rand(1, Len(genom$)-1)
            genom$ = replace_sequence$(genom$, sp, sp)
         EndIf
      Next
   EndIf
   Return genom$
End Function

Function readblock$(genom$, block)
   Return Mid(genom$, block*3-2, 3)
End Function

Function replace_sequence$(genom$, start, ende)
   genom_end$ = Right(genom$, Len(genom)-ende)
   genom$ = Left(genom$, start-1)
   If ende-start+1>0 Then
   For i = 1 To ende-start+1
      genom$ = genom$+chars$(Rand(0,15))
   Next
   EndIf
   genom$ = genom$+genom_end$
   Return genom$
End Function

Function cutout_sequence$(genom$, start, ende)
   genom_end$ = Right(genom$, Len(genom)-ende)
   genom$ = Left(genom$, start-1)+genom_end$
   For i = 1 To ende-start+1
      genom$ = genom$+"0"
   Next
   Return genom$
End Function

Function unhex(in$)
   For i = 1 To Len(in$)
      out = out+unhex_1(in$, i)*16^(Len(in$)-i)
   Next
   Return out
End Function

Function unhex_1(in$, pos)
   in$ = Mid(in$, pos, 1)
   For i = 0 To 15
      If chars$(i) = in$ Then Return i
   Next
End Function


Steuerung:
F1: Killt alles
F2: spawnt periodisch futter. gut um evolution bei tierischen zellen zu beobachten.
F3: schaltet periodisch das licht an/aus. gut um evolution bei pflanzenzellen zu beobachten.

1-9: spawnt die auf der jeweiligen taste gespeicherte zelle
linksklick: wählt eine zelle aus und zeigt ihr genom an
1-9 während eine zelle ausgewählt ist: speichert die ausgewählte zelle auf der jeweiligen taste
strg+1-9: zeigt das genom der auf der jeweiligen taste gespeicherten zelle an. klick auf einen genomteil um diesen zu modifizieren. die bedeutungen der jeweiligen genomsegmente kann ich auf wunsch posten.
rechtsklick auf eine zelle: löscht diese
Leer: spawnt 25 zellen
Gewinner der 6. und der 68. BlitzCodeCompo

maximilian

BeitragFr, Okt 17, 2008 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich denke nicht, dass das Game of Life wirklich das is, was mike und skabus wollen Wink


Aber genau sowas sollten sie machen. Evolution ist sehr "lowlevel". Am besten wäre es, ein einfaches Teilsystem zu entwickeln, in dem es Dinge geben kann, ähnlich wie unsere bekannte DNA.

Mit dem Ansatz wie oben beschrieben kann man sich richtigen Evolutionsprozessen nichtmal annähren.
Variety is the spice of life. One day ignore people, next day annoy them.

Skabus

BeitragMo, Okt 20, 2008 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
LordChaos hat Folgendes geschrieben:
Zitat:
Ich denke nicht, dass das Game of Life wirklich das is, was mike und skabus wollen Wink


Aber genau sowas sollten sie machen. Evolution ist sehr "lowlevel". Am besten wäre es, ein einfaches Teilsystem zu entwickeln, in dem es Dinge geben kann, ähnlich wie unsere bekannte DNA.

Mit dem Ansatz wie oben beschrieben kann man sich richtigen Evolutionsprozessen nichtmal annähren.


Etwas genauer vielleicht?

Weenn du sachkundige Ahnung von diesem Thema hast wäre ich dir sehr verbunden wenn du uns mit deinem Wissen beehren würdest...

Ansonsten ist die Aussage ziemlich für den Garten...


MfG Ska

@DAK: Sehr interessante Arbeit, vielen Dank^^
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

MikeDee

BeitragDi, Okt 21, 2008 9:47
Antworten mit Zitat
Benutzer-Profile anzeigen
LordChaos hat Folgendes geschrieben:
Zitat:
Ich denke nicht, dass das Game of Life wirklich das is, was mike und skabus wollen Wink


Aber genau sowas sollten sie machen. Evolution ist sehr "lowlevel". Am besten wäre es, ein einfaches Teilsystem zu entwickeln, in dem es Dinge geben kann, ähnlich wie unsere bekannte DNA.

Mit dem Ansatz wie oben beschrieben kann man sich richtigen Evolutionsprozessen nichtmal annähren.


Game of Life ist doch noch weiter von einem "Evolutionsprozess" entfernt, da spielt nichtmal der Zufall eine Rolle und ich sehe auch nicht wo was ähnliches wie eine DNA sein soll. Ausserdem hat GoL die angewohnheit das es endlich ist.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

SpionAtom

BeitragDi, Okt 21, 2008 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit GoL ist endlich?
Ich hab mal den spaßigen Beweis gesehen, dass aus einer endlichen Startmenge an Punkten, unendlich viele Punkte erzeugt werden können. Nämlich mit diesen lustigen Kanonen, die immer wieder Gleiter abschießen.

user posted image
(Wikipedia)
Unten rechts das Gebilde ist der Fresser, den muss man sich wegdenken. Dann würden diese Gleiter unendlich weiterfliegen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

MikeDee

BeitragDi, Okt 21, 2008 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist für mich endlich, wenn es entweder aufhört oder sich die letzten Schritte immer wiederholen. Unendlich hat eben kein Ende, etwas das sich wiederholt hört auf und fängt wieder von neuem an.
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden.

Smily

BeitragDi, Okt 21, 2008 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man davon ausgeht, dass das spielfeld unendlich groß ist, ist die Simulation auch unendlich. Schliesslich verschwinden die Glider nie, aber neue werden ständig erstellt

Man kann auch, in dem man glider geschick kollidieren lässt, neue Gliderkanonen erzeugen. Also wäre ein unendliches wachstum ohne wiederholungen mit dem GoL möglich.

ich hatte da mal spaßenshalber eine kleine simulation in b+ geschrieben.
http://phpprogger.ph.funpic.de/uploads/SDL.zip
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Skabus

BeitragDi, Okt 21, 2008 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
MikeDee hat Folgendes geschrieben:


Game of Life ist doch noch weiter von einem "Evolutionsprozess" entfernt, da spielt nichtmal der Zufall eine Rolle und ich sehe auch nicht wo was ähnliches wie eine DNA sein soll. Ausserdem hat GoL die angewohnheit das es endlich ist.


Mal abgesehen, dass das GoL eine sehr interessante Sache ist, frage ich mich was es tatsächlich mit Systematiken von Evolution zu tun haben soll...

Sicher gibt es einige hochinteressante Ansätze, aber das GoL geht von Regeln aus die nicht naturgebundener Gesetze entspringt.Eher wirkt es, als würde man mehr oder weniger willkürlich
ein paar Regeln definiert haben, die zu wirklich unglaublichen Gebilden und interessantem Verhalten
führt.

Aber im Bezug auf Evolution hat es zwei entscheidene Nachteile:

1.)Es wird davon ausgegangen, dass Zellen immer die exakt gleiche Beschaffenheit hat und als 1:1-Kopie
bei der Wiedergeburt erstellt wird.Frage die daraus resultiert: Ist das Evolution?Sind Zellen immer grundsätzlich eine 1:1-Kopie ihrer Elterngeneration?Ich denke nicht.Sonst gäbe es keine evolutionsbedingten sich spezialisierende Zellen, sondern im Grunde nur DIE eine exakt gleiche Zelle.

2.) Es geht überhaupt nicht auf die Umwelt ein.Die Zellen wirken eher wie Viren die sich auf einem idealen Nährboden bewegt.

Mit ist bewusst, dass der Herr Conway nicht darauf abzielte als er es entwarf, aber der oben genannte Bezug ist mir nicht ganz klar...

Smiley: Ist gut geworden.Perfekt um ein wenig den Sinn und die Wirkungsweise hinter Conways GoL zu verstehen.Danke dafür^^

MFG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

BladeRunner

Moderator

BeitragDi, Okt 21, 2008 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
2.) Es geht überhaupt nicht auf die Umwelt ein.Die Zellen wirken eher wie Viren die sich auf einem idealen Nährboden bewegt.

Ein Virus braucht keinen Nährboden, es hat keinen eigenen Stoffwechsel. Du meinst sicher ein Bakterium.

GoL hat nichts mit Evolution zu tun, denn wie schon festgestellt wurde gibt es keine Veränderung der Kopien. Wenn man das wollte müsste man die Regeln in der Kopie selbst speichern und durch zufällige Mutation oder Rekombination neue Regeln zulassen- was de facto den Eigenschaften der DNA entspräche.

Wenn also zB die Zahl der Nachbarn für Reproduktion und die Zahl für Verhungern im Bakterium gespeichert ist und sich bei Reproduktion ändern kann, so kann man neue Species erschaffen die mit der ursprünglichen in Wettbewerb treten. Dann wird es interessant.
Allerdings ist ein System wie bei GoL recht unausgewogen da es durch seine Simplizität schnell an die Grenzen zu bringen ist. Eine Amöbe die sich durch ihre eigene Anwesenheit reproduzieren kann und die so genügsam mit Futter umgeht dass sie auch nicht verhungert wenn alle Felder um sie besetzt sind wird sich recht früh ausbilden und innerhalb kürzester Zeit alles domninieren.

Von daher wäre es interessant die Rahmenbedingungen zu verkomplizieren, bzw. für jede Variable verbindliche Minima und Maxima festzulegen - eventuell auch in Abhängigkeit voneinander.
So dass zB eine sich rasch reproduzierende Amöbe automatisch mehr Futterbedarf hat als eine weniger rasch expandierende Species. Oder dass eine Amöbe nur dann reproduzieren kann wenn auch genug Futter in den Feldern um sie frei ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group