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

HahninatorBetreff: Problem bei Jäger-Pflanzen-Beute-Simulation (gelöst) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
![]() |
derAtomkeksehemals "Sethus" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hat sich geklärt:
https://www.blitzforum.de/foru...hp?t=23115 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group