Problem bei Jäger-Pflanzen-Beute-Simulation (gelöst)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Hahninator

Betreff: Problem bei Jäger-Pflanzen-Beute-Simulation (gelöst)

BeitragMi, Apr 04, 2007 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich hab ein kleines Problem mit meinem Programm.
Und zwar sollten sich die Pflanzenfresser (Sammler) richtung Pflanzen bewegen, wenn diese in der nähe sind.
Aber sie bewegen sich nur nach links oben. Falls in der Umgebung (3x3 Felder) Pflanzen befinden

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

Dim Feld(200,150,19)
Global BEW = 0

Function Bewegen_Sammler(X,Y,Q,U)
 If Q + X < 200 And  Q + X > 0 And U + Y < 150 And U + Y > 0 Then 
  Feld(Q + X, U + Y,0) = 2
  Feld(Q + X, U + Y,1) = Feld(Q,U,1)
  Feld(Q + X, U + Y,2) = Feld(Q,U,2)
  Feld(Q + X, U + Y,3) = Feld(Q,U,3)
  Feld(Q + X, U + Y,4) = Feld(Q,U,4) + Rand(200, 300)
  If Feld(Q + X, U + Y,4) > 500 Then Feld(Q + X, U + Y,4) = 500
  Feld(Q + X, U + Y,5) = Feld(Q,U,5)
  Feld(Q + X, U + Y,6) = Feld(Q,U,6)
  Feld(Q + X, U + Y,7) = Feld(Q,U,7)
  Feld(Q + X, U + Y,8) = Feld(Q,U,8)
  Feld(Q + X, U + Y,9) = Feld(Q,U,9)
  Feld(Q + X, U + Y,10) = Feld(Q,U,10)
  Feld(Q + X, U + Y,11) = Feld(Q,U,11)
  Feld(Q + X, U + Y,12) = Feld(Q,U,12)
  Feld(Q + X, U + Y,13) = Feld(Q,U,13)
  Feld(Q + X, U + Y,14) = Feld(Q,U,14)
  Feld(Q + X, U + Y,15) = Feld(Q,U,15)
  Feld(Q + X, U + Y,16) = Feld(Q,U,16) + 5
  BEW = 1
  Feld(Q, U,0)  = 0
 EndIf
End Function

Repeat
 A = GetKey()
 If A > 47 And A < 58 Then
  Anzahl_Pflanze = Anzahl_Pflanze + Chr$(A)
  If Anzahl_Pflanze > 10000 Then Anzahl_Pflanze = 9999
 EndIf 
 If A = 8 Then Anzahl_Pflanze = Anzahl_Pflanze / 10
 Text 0,0,"Wie viele Pflanzen: " + Anzahl_Pflanze
 Flip
 Cls
Until KeyHit(28)

Repeat
 A = GetKey()
 If A > 47 And A < 58 Then
  Anzahl_Sammler = Anzahl_Sammler + Chr$(A)
  If Anzahl_Sammler > 1000 Then Anzahl_Sammler = 999
 EndIf 
 If A = 8 Then Anzahl_Sammler = Anzahl_Sammler / 10
 Text 0,0,"Wie viele Pflanzenfresser: " + Anzahl_Sammler
 Flip
 Cls
Until KeyHit(28)

Repeat
 A = GetKey()
 If A > 47 And A < 58 Then
  Anzahl_Jaeger = Anzahl_Jaeger + Chr$(A)
  If Anzahl_Jaeger > 1000 Then Anzahl_Jaeger = 999
 EndIf 
 If A = 8 Then Anzahl_Jaeger = Anzahl_Jaeger / 10
 Text 0,0,"Wie viele Fleischfresser: " + Anzahl_Jaeger
 Flip
 Cls
Until KeyHit(28)








; Pflanze ihren Platz geben
For I = 1 To Anzahl_Pflanze
 .marke
 X = Rand(200)
 Y = Rand(150)
 If Feld(X,Y,0) > 0 Then Goto Marke
 If Feld(X,Y,0) = 0 Then ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,0) = 1
  Feld(X,Y,1) = Rand(5000,10000) ; Lebensdauer
  Feld(X,Y,2) = Rand(500,750)   ;reife
  Feld(X,Y,3) = Rand(100,250)  ;Teilungsdauer ( nach wielanger Zeit teilt es sich
  Feld(X,Y,11) = Feld(X,Y,1)   ;Die Lebensdauer die Übertragen wird
  Feld(X,Y,12) = Feld(X,Y,2)   ; Die Reife die Übertragen wird
  Feld(X,Y,13) = Feld(X,Y,3)   ; Die Teilungsdauer die Übertragen wird
 EndIf
Next

; die Pflanzenfresser ihren Platz geben
For I = 1 To Anzahl_Sammler
 .Marke2
 X = Rand(200)
 Y = Rand(150)
 If Feld(X,Y,0) > 0 Then Goto Marke2
 If Feld(X,Y,0) = 0 Then ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,0) = 2 ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,1) = Rand(2500,5000) ; Lebensdauer
  Feld(X,Y,2) = Rand(750,1500)   ;reife
  Feld(X,Y,3) = Rand(500,1000)   ;Teilungsdauer ( nach wielanger Zeit teilt es sich)
  Feld(X,Y,4) = Rand(200,300)   ;bis sie verhungert sind
  Feld(X,Y,5) = Rand(450,600)   ;wann sie kacken und ein Pflanze wächst draus
  Feld(X,Y,11) = Feld(X,Y,1)   ;Die Lebensdauer die Übertragen wird
  Feld(X,Y,12) = Feld(X,Y,2)   ; Die Reife die Übertragen wird
  Feld(X,Y,13) = Feld(X,Y,3)   ; Die Teilungsdauer die Übertragen wird
  Feld(X,Y,14) = Feld(X,Y,4)  ;bis sie verhungert sind wird genetisch festgelegt
  Feld(X,Y,15) = Feld(X,Y,5)  ;bis sie kacken müssen in die DNA
 EndIf
Next

For I = 1 To Anzahl_Jaeger
 .Marke3
 X = Rand(200)
 Y = Rand(150)
 If Feld(X,Y,0) > 0 Then Goto Marke3
 If Feld(X,Y,0) = 0 Then ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,0) = 3 ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,1) = Rand(2000,4000) ; Lebensdauer
  Feld(X,Y,2) = Rand(750,1000)   ;reife
  Feld(X,Y,3) = Rand(500,900)   ;Teilungsdauer ( nach wielanger Zeit teilt es sich)
  Feld(X,Y,4) = Rand(300,400)   ;bis sie verhungert sind
  Feld(X,Y,5) = Rand(350,500)   ;wann sie kacken und ein Pflanze wächst draus
 EndIf
Next



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Hauptschleife;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Repeat
Schritte = Schritte + 1
For I = 1 To 200
 For J = 1 To 150
  If Feld(I,J,0) = 1 Then
; Zeichnen der Pflanze
   Color 0,255,0
   Rect I * 4, J * 4, 3, 3
; Lebensabzug
   Feld(I,J,1) = Feld(I,J,1) - 1
   If Feld(I,J,1) = 0 Then Feld(I,J,0) = 0 ; Falls sie kein Leben mehr hat, wird das Feld frei
; Reife + Teilung
   If Feld(I,J,2) > 0 Then Feld(I,J,2) = Feld(I,J,2) - 1 ; wird Reifer
   If Feld(I,J,2) = 0 Then ; Falls es Reif ist
    If Feld(I,J,3) > 0 Then Feld(I,J,3) = Feld(I,J,3) - 1 ; Teilungsdauer wird kleiner
    If Feld(I,J,3) = 0 Then ; Wird geteilt
     X = Rand(-1,1) ; Die koordinaten
     Y = Rand(-1,1) ; Die Koordinaten
     If X + I < 200 And X + I => 1 And Y + J => 1 And Y + J < 150  Then ;anfrage, Damit es nicht über den Rand hinaus macht
      If Feld(I + X,J + Y,0) = 0 Then ; Falls der neue Platz frei ist
       Feld(I + X,J + Y, 0) = 1 ;Eine Pflanze entsteht
       Feld(I + X,J + Y, 1) = Feld(I,J,11) + Feld(I + X,J + Y,6)  ; Wird auf das neue Leben Übertragen
       Feld(I + X,J + Y, 2) = Feld(I,J,12) + Feld(I + X, J + Y,7) ; Die Reife wird übertragen
       Feld(I + X,J + Y, 3) = Feld(I,J,13) + Feld(I + X, J + Y,8) ; Die neue Teilungsdauer wird übertragen
       Feld(I + X,J + Y, 6) = Feld(I,J,6) + Rand(-10,10) ; Die Genetische Lebensdauer wird bestimmt
       Feld(I + X,J + Y, 7) = Feld(I,J,7) + Rand(-5,5)   ; Wann sie Reif ist
       Feld(I + X,J + Y, 8) = Feld(I,J,8) + Rand(-2,2) ; Die Neue Teilungsdauer wird bestimmt
       Feld(I + X,J + Y,11) = Feld(I + X,J + Y,1)
       Feld(I + X,J + Y,12) = Feld(I + X,J + Y,2)
       Feld(I + X,J + Y,13) = feld(I + X,J + Y,3)
      EndIf
      Feld(I,J,3) = Feld(I,J,13)
     EndIf
    EndIf
   EndIf
  EndIf
; Der Sammler

  If Feld(I,J,0) = 2 Then

   Color 255,255,255
   Rect I * 4, J * 4, 3, 3
; Lebensabzug
   Feld(I,J,1) = Feld(I,J,1) - 1
   If Feld(I,J,1) = 0 Then Feld(I,J,0) = 0 ; Falls sie kein Leben mehr hat, wird das Feld frei 
; Nahrungsentzug
   Feld(I,J,4) = Feld(I,J,4) - 1
   If Feld(I,J,4) < 0 Then Feld(I,J,0) = 0 ; Falls die Nahrung 0 ist verhungern sie
   If Feld(I,J,2) > 0 Then Feld(I,J,2) = Feld(I,J,2) - 1 ; wird Reifer
   If Feld(I,J,2) = 0 Then ; Falls es Reif ist
 
; Die Teilung
    If Feld(I,J,3) > 0 Then Feld(I,J,3) = Feld(I,J,3) - 1 ; Teilungsdauer wird kleiner
     If Feld(I,J,3) = 0 Then ; Wird geteilt
      X = Rand(-1,1) ; Die koordinaten
      Y = Rand(-1,1) ; Die Koordinaten
      If X + I < 200 And X + I => 1 And Y + J => 1 And Y + J < 150  Then ;anfrage, Damit es nicht über den Rand hinaus macht
       If Feld(I + X,J + Y,0) = 0 Then ; Falls der neue Platz frei ist
        Feld(I + X,J + Y, 0) = 2 ;Eine Sammler entsteht
        Feld(I + X,J + Y, 1) = Feld(I,J,11) + Feld(I + X, J + Y,6)  ; Wird auf das neue Leben Übertragen
        Feld(I + X,J + Y, 2) = Feld(I,J,12) + Feld(I + X, J + Y,7) ; Die Reife wird übertragen
        Feld(I + X,J + Y, 3) = Feld(I,J,13) + Feld(I + X, J + Y,8) ; Die neue Teilungsdauer wird übertragen
        Feld(I + X,J + Y, 4) = Feld(I,J,14) + Feld(I + X, J + Y,9) ; Die Verhungerung wird übertragen
        Feld(I + X,J + Y, 5) = Feld(I,J,15) + Feld(I + X, J + Y,10)
        Feld(I + X,J + Y, 6) = Feld(I,J, 6) + Rand(-10,10) ; Die Genetische Lebensdauer wird bestimmt
        Feld(I + X,J + Y, 7) = Feld(I,J, 7) + Rand(-5,5)   ; Wann sie Reif ist
        Feld(I + X,J + Y, 8) = Feld(I,J, 8) + Rand(-2,2) ; Die Neue Teilungsdauer wird bestimmt
        Feld(I + X,J + Y, 9) = Feld(I,J, 9) + Rand(-1,1) ; Es wird bestimmt wie lange es dauert bis sie verhungert sind
        Feld(I + X,J + Y,10) = Feld(I,J,10) + Rand(-1,1) ; Es wird bestimmt, wie lange es dauert, bis sie kaken müssen
        Feld(I + X,J + Y,11) = Feld(I + X,J + Y,1)
        Feld(I + X,J + Y,12) = Feld(I + X,J + Y,2)
        Feld(I + X,J + Y,13) = feld(I + X,J + Y,3)
        Feld(I + X,J + Y,14) = feld(I + X,J + Y,4)
        Feld(I + X,J + Y,14) = feld(I + X,J + Y,5)
        FEld(I + X,J + Y,16) = feld(I,J,16)
       EndIf
       Feld(I,J,3) = Feld(I,J,13)
      EndIf
     EndIf
    EndIf



; Die Bewegung
   
    If Feld(I,J,4) < 301 And feld(I,J,4) > 150 Then
     For D = -1 To 1
      For T = -1 To 1
       If D + I < 200 And D + I => 1 And T + J => 1 And T + J < 150 Then
        If Feld(I + D,J + T ,0) = 1 Then
         Bewegen_sammler(D,T,I,J)
        EndIf
       EndIf
      Next
     Next
    EndIf

    If BEW = 0 Or Feld(I,J,4) > 300 Then
     Richtung = Rand(1,8)

     If Richtung = 1 Then X = -1: Y = -1
     If Richtung = 2 Then X = -1: Y = 0
     If Richtung = 3 Then X = -1: Y = 1
     If Richtung = 4 Then X = 0: Y = -1
     If Richtung = 5 Then X = 0: Y = 1
     If Richtung = 6 Then X = 1: Y = -1
     If Richtung = 7 Then X = 1: Y = 0
     If Richtung = 8 Then X = 1: Y = 1
    EndIf
 

    If FEld(I,J,4) < 151 Then
     If Feld(I,J,19) = 0 Then
 
     
 
      If 3 + I < 200 And I - 3 => 1 And  J - 3 => 1 And J + 3 < 150 Then ;anfrage, Damit es nicht über den Rand hinaus macht
       For W = -3 To 3
        For E = -3 To 3
         If Feld(I + W,J + E,0) = 1 Then
          Feld(I,J,17) = I + W
          Feld(I,J,18) = J + E
          Feld(I + W, J + E, 17) = I
          Feld(I + W, J + E, 18) = J
          Was_weiss_ich = 1
          feld(I,J,19) = 1
          Exit
         EndIf
        Next
        If Was_weiss_ich = 1 Then Exit
       Next
      EndIf
     EndIf
     Bewegung = 1
     If Was_Weiss_ich = 0 Then
      Richtung = Rand(1,8)
      If Richtung = 1 Then X = -1: Y = -1
      If Richtung = 2 Then X = -1: Y = 0
      If Richtung = 3 Then X = -1: Y = 1
      If Richtung = 4 Then X = 0: Y = -1
      If Richtung = 5 Then X = 0: Y = 1
      If Richtung = 6 Then X = 1: Y = -1
      If Richtung = 7 Then X = 1: Y = 0
      If Richtung = 8 Then X = 1: Y = 1
      Bewegung = 0
     EndIf
; Die Bewegung erteilen

     If Feld(I,J,17) < I And Feld(I,J,18) < J And Bewegung = 1 Then X = -1 : Y = -1 : Bewegung = 0
     If Feld(I,J,17) = I And Feld(I,J,18) < J And Bewegung = 1 Then X =  0 : Y = -1 : Bewegung = 0
     If Feld(I,J,17) > I And Feld(I,J,18) < J And Bewegung = 1 Then X =  1 : Y = -1 : Bewegung = 0
     If Feld(I,J,17) < I And Feld(I,J,18) = J And Bewegung = 1 Then X = -1 : Y = 0  : Bewegung = 0
     If Feld(I,J,17) < I And Feld(I,J,18) > J And Bewegung = 1 Then X = -1 : Y = 1  : Bewegung = 0
     If Feld(I,J,17) > I And Feld(I,J,18) = J And Bewegung = 1 Then X =  1 : Y = 0  : Bewegung = 0
     If Feld(I,J,17) > I And Feld(I,J,18) > J And Bewegung = 1 Then X =  1 : Y = 1  : Bewegung = 0
     If Feld(I,J,17) = I And Feld(I,J,18) > J And Bewegung = 1 Then X =  0 : Y = 1  : Bewegung = 0
     Bewegung = 0
    EndIf


    If X + I < 200 And X + I => 1 And Y + J => 1 And Y + J < 150  Then ;anfrage, Damit es nicht über den Rand hinaus macht
      If Feld(I + X, J + Y,0) = 0 And Feld(I,J,16) < Schritte Then ; Falls der neue Platz frei ist
       Feld(I + X, J + Y,0) = 2
       Feld(I + X, J + Y,1) = Feld(I, J, 1)
       Feld(I + X, J + Y,2) = Feld(I, J, 2)
       Feld(I + X, J + Y,3) = Feld(I, J, 3)
       Feld(I + X, J + Y,4) = Feld(I, J, 4)
       Feld(I + X, J + Y,5) = Feld(I, J, 5)
       Feld(I + X, J + Y,6) = Feld(I, J, 6)
       Feld(I + X, J + Y,7) = Feld(I, J, 7)
       Feld(I + X, J + Y,8) = Feld(I, J, 8)
       Feld(I + X, J + Y,9) = Feld(I, J, 9)
       Feld(I + X, J + Y,10) = Feld(I, J, 10)
       Feld(I + X, J + Y,11) = Feld(I, J, 11)
       Feld(I + X, J + Y,12) = Feld(I, J, 12)
       Feld(I + X, J + Y,13) = Feld(I, J, 13)
       Feld(I + X, J + Y,14) = Feld(I, J, 14)
       Feld(I + X, J + Y,15) = Feld(I, J, 15)
       Feld(I, J, 16) = feld(I, J, 16) + 5
       Feld(I + X, J + Y,16) = Feld(I, J, 16)
       Feld(I + X, J + Y,17) = Feld(I, J, 17)
       Feld(I + X, J + Y,18) = Feld(I, J, 18)
       Feld(I,J,0) = 0
      EndIf
     EndIf 

   Bew = 0
  EndIf

; Der Jäger
 Next
Next

 Flip
 Cls
Until KeyHit(1)
  • Zuletzt bearbeitet von Hahninator am Mo, Apr 09, 2007 21:40, insgesamt einmal bearbeitet

derAtomkeks

ehemals "Sethus"

BeitragFr, Apr 06, 2007 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Wenn ich das richtig verstehe bezieht sich dein Problem auf die erste Funktion ganz oben.
Könntest du bitte noch etwas erklären, was zum Beispiel Q und U sind, was die 17 Felder in der 3. Dimension beinhalten usw., dann könnte man etwas besser nach Fehlern suchen.

Ich rate mal einfach was die Parameter zu bedeuten haben:
Wenn Q die X und U die Y Position der Pflanze sind, dann hast du schon in der If-Abfrage am Anfang, die wahrscheinlich die Entfernung überprüfen soll, einen Fehler. Du musst Die Differenz überprüfen, nicht die Summe der Koordinaten. Denn wenn du zB. einen Sammler auf Position 150,100 und eine Pflanze auf Position 151,100 hast, sind diese nur 1 Feld voneinander entfernt, aber deine Abfrage würde das nicht durchgehen lassen, weil 150 + 151 = 301 ist -> größer als 200.
Bei der Bewegung musst du auch den Sammler nur um einen Teil der Differenz der Koordinaten bewegen, nicht um die Summe.

Wenn das totaler Blödsinn sein sollte, was ich da geschrieben habe, dann entschuldige ich mich schon im Vorraus.

MfG
Sethus
 

Hahninator

BeitragMo, Apr 09, 2007 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat sich geklärt:
https://www.blitzforum.de/foru...hp?t=23115

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group