  | 
					
						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, 21: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: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 23.09.2015, 17: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, 12: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: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 24.09.2015, 15: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, 19: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, 01: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, 05: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: 571 Wohnort: Jüterbog
  | 
		
			
				 Verfasst am: 29.09.2015, 10: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.
  | 
   
 
     |