 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 22.09.2015, 22:21 Titel: geister marschieren durch die wand bei meinem kleinen test. |
|
|
Hallo Leute,
ich brobier gerade bissl mit GAs rum, dazu hab ich mir
eine kleine "scriptsprache" ausgedacht die jedes individium
als genom besitzt. nun male ich diese creaturen auf
ein image (die welt) dabei seh ich aber immer wieder mal
"geister" durch die wand rennen, die da in form eines
kreuzes auf dem image steht.
koennte sich evtl jemand erbarmen und ma ueber meinen
zugegeben krausigen code schaun und mir sagen
wo ich da was falsch mache?
http://users.freebasic-portal.de/haubitze/Life.7z
danke im vorraus.
PS: der code is zZ nur im versuchs stadium der soll
ma schoener werden ;D
Edit:hatt sich erledigt, verknuepfte if then abfragen sollte man
immer klammern :/
kann also von einem MOD geloescht werden  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 23.09.2015, 18:56 Titel: |
|
|
Könntest du vielleicht die Groß-/Kleinschreibung bei der inkludierten Datei anpassen? Ich weiß, dass das unter Windows egal ist - unter Linux ist es das nicht.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 24.09.2015, 13:48 Titel: |
|
|
versteh jetzt nich so recht was du meinst, den namen oder irgenwas
in der datei?
salute |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 24.09.2015, 16:19 Titel: |
|
|
Die Datei heißt Life.bi (groß geschrieben), im Quelltext der Life.bas wird aber life.bi (klein geschrieben) eingebunden. In Linux-Systemen sind das zwei verschiedene Dateinamen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 24.09.2015, 20:43 Titel: |
|
|
ach so, ja na klar kann ich das aendern.
salute |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 25.09.2015, 02:51 Titel: |
|
|
also jetzt muss ich doch noch mal wegen den doofen LLs nachfragen :/
ich moechte das jetzt in LLs umschreiben damit die spezies die am meisten frisst sich auch mehr vermehrt (eine art elitismus).
dazu hab ich jetzt eine spezies.bi erstellt.
Code: |
#Ifndef _spezies_bi_
#Define _spezies_bi_
#Include "creatures.bi"
Type spezies_t
As String spezies
first_spezies As spezies_t Ptr
vor_spezies As spezies_t Ptr
nach_spezies As spezies_t Ptr
first_creature As creature_t Ptr
last_creature As creature_t Ptr
As UInteger num_spezies
As UInteger max_spezies
As UInteger num_creatures
As UInteger max_creatures
As String opcodes
Declare Sub init_spezies(max_spezies As UInteger,max_creatures As UInteger,first As spezies_t Ptr)
Declare Sub update_spezies()
Declare sub delete_spezies()
Declare Sub make_spezies(gene As String, max_creatures As UInteger)
Declare sub delete_creature(creature As creature_t ptr)
Declare sub make_creature(gen As String,creature As creature_t Ptr)
Declare Function uni_crossover(c1 As spezies_t ptr, s2 As spezies_t ptr, crossover_rate As Single) As String
End Type
Sub spezies_t.init_spezies(num_max_spezies As UInteger,num_max_creatures As UInteger,first As spezies_t Ptr)
spezies="P"
first_spezies=first
vor_spezies=0
nach_spezies=0
first_creature=0
last_creature=first_creature
num_spezies=1
max_spezies=num_max_spezies
num_creatures=0
max_creatures=num_max_creatures
opcodes="MLREFfBbZ?!A"
make_creature(spezies,first_creature)
make_creature(spezies,first_creature)
End Sub
Sub spezies_t.update_spezies()
If num_creatures=0 Then Exit sub
Dim tmp_creature As creature_t Ptr=first_creature
Dim tmp0_creature As creature_t Ptr
While tmp_creature<>0
tmp0_creature=tmp_creature->vor_creature
Print tmp_creature->energy, tmp_creature
tmp_creature->execute_one_step()
If tmp_creature->energy>15 Then make_creature(spezies,tmp_creature):tmp_creature->energy-=10:'Exit While
If tmp_creature->energy<0 Then delete_creature(tmp_creature):tmp_creature=tmp0_creature
'Print tmp_creature->program
'Print tmp_creature'->id
tmp_creature=tmp_creature->nach_creature
Wend
End Sub
Sub spezies_t.make_spezies(gene As String, max_creatures As UInteger)
If num_spezies<max_spezies Then
nach_spezies=New spezies_t
nach_spezies->vor_spezies=VarPtr(This)
nach_spezies->nach_spezies=0
nach_spezies->first_spezies=vor_spezies->first_spezies
Dim n0 As spezies_t Ptr
Dim s1 As spezies_t Ptr
Dim s2 As spezies_t Ptr
Dim s1num As UInteger=Rnd()*first_spezies->num_spezies
Dim s2num As UInteger=Rnd()*first_spezies->num_spezies
n0=first_spezies
While n0<>0
s1num-=1
n0=n0->nach_spezies
Wend
s1=n0
n0=first_spezies
While n0<>0
s2num-=1
n0=n0->nach_spezies
Wend
s2=n0
nach_spezies->spezies=uni_crossover(s1,s2,0.25)
nach_spezies->first_spezies=first_spezies
make_creature(nach_spezies->spezies,nach_spezies->first_creature)
EndIf
End Sub
Function spezies_t.uni_crossover(s1 As spezies_t ptr, s2 As spezies_t Ptr, crossover_rate As single) As String
Dim tmp_spezies As String
Dim As UInteger max_len=IIf(Len(s1->spezies)>Len(s2->spezies),Len(s1->spezies),Len(s2->spezies))
For i As UInteger=1 To max_len
If Rnd<crossover_rate Then
tmp_spezies+=Mid(s1->spezies,i,1)
Else
tmp_spezies+=Mid(s2->spezies,i,1)
endif
Next
Return tmp_spezies
End Function
Sub spezies_t.make_creature(gen As String,creature As creature_t Ptr)
If num_creatures<max_creatures Then
Dim tmp_creature As creature_t Ptr=New creature_t
If first_creature=0 Then
tmp_creature->program=gen
tmp_creature->vor_creature=0
tmp_creature->nach_creature=0
first_creature=tmp_creature
Else
tmp_creature->program=gen
tmp_creature->vor_creature=creature
tmp_creature->nach_creature=creature->nach_creature
last_creature=tmp_creature
creature->nach_creature=tmp_creature
creature->nach_creature->vor_creature=tmp_creature
EndIf
num_creatures+=1
EndIf
End Sub
sub spezies_t.delete_creature(creature As creature_t ptr)
If creature=0 Then Exit sub
If num_creatures>0 Then
If (creature=first_creature) And (creature->nach_creature=0) Then
'Print"delete0"
Delete creature
creature=0
first_creature=0
first_creature=0
num_creatures-=1
EndIf
If (creature=first_creature) And (creature->nach_creature<>0) Then
'Print "delete1"
Dim tmp0_creature As creature_t Ptr=creature->nach_creature
tmp0_creature->vor_creature=0
Delete first_creature
first_creature=tmp0_creature
num_creatures-=1
Else
Print "delete2"
Dim tmp0_creature As creature_t Ptr=creature
tmp0_creature->vor_creature->nach_creature=creature->nach_creature
tmp0_creature->nach_creature->vor_creature=creature->vor_creature
Delete tmp0_creature
tmp0_creature=0
num_creatures-=1
EndIf
endif
If num_creatures<=0 Then num_creatures=0
End Sub
#endif
|
die creatures.bi hab ich jetzt zu testzwecken mal auf das hier eingekuerzt.
Code: |
#Ifndef _creatures_bi_
#Define _creatures_bi_
#Include "utils.bi"
#include "spezies.bi"
Type creature_t
As creature_t Ptr vor_creature
As creature_t Ptr nach_creature
program As String
energy As Integer
id As UInteger
Declare Constructor()
Declare Destructor()
Declare Sub execute_one_step()
End Type
Constructor creature_t()
vor_creature=0
nach_Creature=0
For i As UInteger=0 To Len(program)
id+=((Asc(Mid(program,i,1))^i)Xor &h77777777)
next
energy=10+Rnd*10
End Constructor
Destructor creature_t()
End Destructor
Sub creature_t.execute_one_step()
energy-=1
end sub
|
und die main.bi sieht so aus.
Code: |
#Include "fbgfx.bi"
Using FB
Randomize Timer,5
ScreenRes 800,600,32
#Include "spezies.bi"
#Include "creatures.bi"
Dim spezies As spezies_t Ptr
spezies=New spezies_t
spezies->init_spezies(64,32,spezies)
Print spezies
Print spezies->first_spezies
Print spezies->first_creature
While Not MultiKey(SC_ESCAPE)
Dim first_spezies As spezies_t Ptr
first_spezies=spezies
cls
While spezies<>0
spezies->update_spezies()
spezies=spezies->nach_spezies
Wend
spezies=first_spezies
Print spezies->num_creatures
ScreenSync
Sleep '250
Wend
screen 0
end
|
nun das erstellen von creaturen wenn sie einen bestimten
energie wert ueberschreiten klappt so weit ich das
getestet hab.
aber wenn sie zu wenig energie hatt soll sie ja geloescht werden und da
scheint was im argen zu sein (siehe die delete_creatures sub in der
spezies.bi).
waere echt nett wenn mir da mal jemand aufn hinterkopp klatschen
koennte um mir auf die spruenge zu helfen
danke im vorraus und salute |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 25.09.2015, 06:07 Titel: |
|
|
okay jetzt hab ich die make_creature und delete_creature soweit geaendert das es teilweise funzt.
nur beim deleten crasht es immer wenn ich das letzte (also das erste und
einzigste) element in der liste loeschen will.
hier nochmal die 2 subs.
Code: |
Sub spezies_t.make_creature(gen As String,creature As creature_t Ptr)
If num_creatures<max_creatures Then
Dim tmp_creature As creature_t Ptr=New creature_t
If first_creature=0 Then
Print "make0"
tmp_creature->program=gen
tmp_creature->vor_creature=0
tmp_creature->nach_creature=0
first_creature=tmp_creature
num_creatures+=1
Sleep
Exit sub
EndIf
If (creature->nach_creature=0) Then
Print "make1"
tmp_creature->program=gen
tmp_creature->vor_creature=creature
tmp_creature->nach_creature=0
creature->nach_creature=tmp_creature
last_creature=tmp_creature
num_creatures+=1
sleep
Exit Sub
EndIf
If (creature->vor_creature=0) Then
Print "make2"
tmp_creature->program=gen
tmp_creature->vor_creature=0
tmp_creature->nach_creature=creature
creature->vor_creature=tmp_creature
first_creature=tmp_creature
num_creatures+=1
sleep
Exit Sub
EndIf
Print "make3"
tmp_creature->program=gen
tmp_creature->vor_creature=creature
tmp_creature->nach_creature=creature->nach_creature
creature->vor_creature=tmp_creature
creature->vor_creature=tmp_creature
first_creature=tmp_creature
num_creatures+=1
sleep
Exit Sub
EndIf
End Sub
sub spezies_t.delete_creature(creature As creature_t ptr)
If creature=0 Then Exit sub
If num_creatures>0 Then
If (creature->vor_creature=0) And (creature->nach_creature=0) Then
Print"delete 0-0"
Delete first_creature
first_creature=0
num_creatures-=1
Exit sub
EndIf
If (creature->vor_creature=0) And (creature->nach_creature<>0) Then
Print"delete 0-1"
Dim tmp1_creature As creature_t Ptr=creature->nach_creature
tmp1_creature->vor_creature=0
Delete creature
creature=0
first_creature=tmp1_creature
num_creatures-=1
Exit sub
EndIf
If (creature->vor_creature<>0) And (creature->nach_creature=0) Then
Print "delete 1-0"
Dim tmp1_creature As creature_t Ptr=creature
Dim tmp0_creature As creature_t Ptr=creature->vor_creature
tmp0_creature->nach_creature=0
'Delete tmp1_creature
Delete creature
creature=0
last_creature=tmp0_creature
num_creatures-=1
Exit Sub
EndIf
If (creature->vor_creature<>0) And (creature->nach_creature<>0) Then
Print "delete 1-1"
Dim tmp1_creature As creature_t Ptr=creature
Dim tmp0_creature As creature_t Ptr=creature->vor_creature
tmp0_creature->nach_creature=creature->nach_creature
tmp0_creature->nach_creature->vor_creature=tmp0_creature
Delete tmp1_creature
tmp1_creature=0
num_creatures-=1
Exit Sub
endif
endif
If num_creatures<=0 Then num_creatures=0
End Sub
|
irgendwie will mir das nich in den copp warum das crasht.
waere echt nett wenn sich das mal wer anschauen kann.
salute |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 29.09.2015, 11:28 Titel: |
|
|
@Haubitze:
bin mir nicht sicher, in deiner make_creature befasst sich der Abschnitt
ab "make3" mit dem Einfügen zwischen zwei bestehenden Objekten.
Interessant dabei ist folgendes:
Code: | first_creature=tmp_creature |
Bedeutet jedes irgendwo zwischen zwei anderen eingefügte Objekt wird gleichzeitig zum Beginn der Liste??? Sollte eigentlich nicht sein.
Das wird einiges an Seiteneffekten hervorrufen.
Vermutlich wird dann first_creature auf ein Objekt zeigen, das du schon gelöscht hast.
edit:
die Verlinkung in make3 sieht merkwürdig aus:
Code: | tmp_creature->program=gen
tmp_creature->vor_creature=creature
tmp_creature->nach_creature=creature->nach_creature
creature->vor_creature=tmp_creature
creature->vor_creature=tmp_creature |
Neues Objekt zwischen... ja wo zwischen eigentlich?
ich vermute creature -> neues Objekt -> ehemals Nachfolger von creature
Code: | tmp_creature->program=gen
tmp_creature->vor_creature=creature
tmp_creature->nach_creature=creature->nach_creature
'da wir jetzt schon in tmp_creature den Vorgänger/Nachfolger definiert haben, benutzen wir sie auch mal gleich:
'sich selbst als Vorgänger im ehemaligen Nachfolger von creature definieren
'oder so ähnlich *hust*
' tmp_creature->nach_creature->vor_creature=tmp_creature
'sich selbst als Nachfolger in creatur definieren
tmp_creature->vor_creature->nach_creature=tmp_creature
'folgendes ginge auch, aber hier ist die Reihenfolge der Zuweisung wichtig
'creature->nach_creature->vor_creature=tmp_creature
'creature->nach_creature=tmp_creature
|
hoffe mal ich hab jetzt kein Mist verbreitet
Mutton |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|