Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

geister marschieren durch die wand bei meinem kleinen test.

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 22.09.2015, 22:21    Titel: geister marschieren durch die wand bei meinem kleinen test. Antworten mit Zitat

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 zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 23.09.2015, 18:56    Titel: Antworten mit Zitat

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. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 24.09.2015, 13:48    Titel: Antworten mit Zitat

versteh jetzt nich so recht was du meinst, den namen oder irgenwas
in der datei?

salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 24.09.2015, 16:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 24.09.2015, 20:43    Titel: Antworten mit Zitat

ach so, ja na klar kann ich das aendern.

salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 25.09.2015, 02:51    Titel: Antworten mit Zitat

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 zwinkern

danke im vorraus und salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 25.09.2015, 06:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 29.09.2015, 11:28    Titel: Antworten mit Zitat

@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 lächeln


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz