Jäger Pflanzenfresser Fleischfresser Simulation

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Hahninator

Betreff: Jäger Pflanzenfresser Fleischfresser Simulation

BeitragMo, Apr 09, 2007 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also hier ist mein erstes Programm.... ich bitte um Kritik was ich noch verbessern muss (auch am Prog stil)
Zur erklärung:

Grün = Pflanzen
Weiß = Pflanzenfresser
Blau = Fleischfresser

Code: [AUSKLAPPEN]

Graphics 800, 600, 24, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()


Dim Feld(200,150,11)
Global X = 0
Global Y = 0
Global Schritte = 0
; Eingabe der Pflanzenanzahl
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)

; Eingabe der Sammleranzahl
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)

; Eingabe der Jägeranzahl
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
  Feld(X,Y,0) = 1 ; Art (1 = Pflanze; 2 = Sammler; 3 = Jaeger)
  Feld(X,Y,5) = Rand(5000,10000)  ;Lebensdauer (Genetisch)
  Feld(X,Y,7) = Rand(1000,2500)  ; Teilungsdauer ( nach wielanger Zeit teilt es sich
  Feld(X,Y,1) = Feld(X,Y,5) - Rand(1,Feld(X,Y,5) / 2) ; Lebensdauer 
  Feld(X,Y,3) = Feld(X,Y,7) - Rand(1,Feld(X,Y,7) / 2) ; Teilungsdauer
 EndIf 
Next

; den Sammlern 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,5) = Rand(2500,5000); Lebensdauer (Genetisch)
  Feld(X,Y,6) = Rand(750,1500)   ; Bis sie verhungert sind (Genetisch 
  Feld(X,Y,7) = Rand(500,1000)   ; Teilungsdauer (Genetisch)
  Feld(X,Y,8) = Rand(200,300)    ; bis sie kacken  (genetisch) ´kacken = neue Pflanze im letzten schritt
  Feld(X,Y,1) = Feld(X,Y,1)  - Rand(1,Feld(X,Y,5) / 2) ; Lebensdauer
  Feld(X,Y,2) = 400 ; Hunger
  Feld(X,Y,3) = Feld(X,Y,3)  - Rand(1,Feld(X,Y,7) / 2) ; Teilungsdauer
  Feld(X,Y,4) = Feld(X,Y,4)  - Rand(1,Feld(X,Y,8) / 2) ; Kacken
 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,5) = Rand(2500,4000)  ; Lebensdauer (Genetisch)
  Feld(X,Y,6) = Rand(1000,2000)   ; Bis sie verhungert sind (Genetisch 
  Feld(X,Y,7) = Rand(1000,2000)   ; Teilungsdauer (Genetisch)
  Feld(X,Y,8) = Rand(200,300)    ; bis sie kacken  (genetisch) ´kacken = neue Pflanze im letzten schritt
  Feld(X,Y,1) = Feld(X,Y,1)  - Rand(1,Feld(X,Y,5) / 2) ; Lebensdauer
  Feld(X,Y,2) = 600; Hunger
  Feld(X,Y,3) = Feld(X,Y,3)  - Rand(1,Feld(X,Y,7) / 2) ; Teilungsdauer
  Feld(X,Y,4) = Feld(X,Y,4)  - Rand(1,Feld(X,Y,8) / 2) ; Kacken
 EndIf
Next


Function bewegen(I,J)
 
 If Feld(I,J,2) < Feld(I,J,6)/2 And I + 1 < 200 And  I - 1 > 0 And J + 1 < 150 And J - 1 > 0 Then
; Erste Abfrage nach links oben
  If Feld(I - 1,J - 1,0) = Feld(I,J,0) - 1 Then
   Bew = 1
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I - 1, J - 1,0) = 0
  EndIf
; Abfrage nach mitte oben
  If Feld(I,J - 1,0) = Feld(I,J,0) - 1 Then
   Bew = 2
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I, J - 1,0) = 0
  EndIf
; Abfrage nach rechts oben
  If Feld(I + 1,J - 1,0) = Feld(I,J,0) - 1 Then
   Bew = 3
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I + 1, J - 1,0) = 0
  EndIf
; Abfrage nach Links Mitte
  If Feld(I - 1,J,0) = Feld(I,J,0) - 1 Then
   Bew = 4
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I - 1, J + 1,0) = 0
  EndIf
; Abfrage nach Rechts Mitte
  If Feld(I,J + 1,0) = Feld(I,J,0) - 1 Then
   Bew = 5
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I, J + 1,0) = 0
  EndIf
; Abfrage nach Links unten
  If Feld(I + 1,J - 1,0) = Feld(I,J,0) - 1 Then
   Bew = 6
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I + 1, J - 1,0) = 0
  EndIf
; Abfrage nach mitte unten
  If Feld(I + 1,J, 0) = Feld(I,J,0) - 1 Then
   Bew = 7
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I + 1, J, 0) = 0
  EndIf
; Abfrage nach Rechts unten
  If Feld(I + 1,J + 1,0) = Feld(I,J,0) - 1 Then
   Bew = 8
   Feld(I,J,2) = Feld(I,J,2) + Rand(150,250)
   If Feld(I,J,2) > Feld(I,J,6) Then Feld(I,J,2) = Feld(I,J,6)
   Feld(I + 1, J + 1,0) = 0
  EndIf
 EndIf


 If Feld(I,J,2) => Feld(I,J,6)/2 Or Bew = 0 Then
  Bew = Rand(1,8)
 EndIf
 
 If Bew = 1 Then X = -1 : Y = -1
 If Bew = 2 Then X =  0 : Y = -1
 If Bew = 3 Then X =  1 : Y = -1
 If Bew = 4 Then X = -1 : Y =  0
 If Bew = 5 Then X =  1 : Y =  0
 If Bew = 6 Then X = -1 : Y =  1
 If Bew = 7 Then X =  0 : Y =  1
 If Bew = 8 Then X =  1 : Y =  1

 If I + X < 200 And I + X > 0 And J + Y < 150 And J + Y > 0 Then
  If Feld(I + X,J + Y,0) = 0  And Schritte > Feld(I,J,11) Then
   Feld(I + X, J + Y, 0) = Feld(I,J,0)
   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) + 4
   Feld(I,J,0) = 0
  EndIf
 EndIf
 Bew = 0
End Function

Function Teilung(I,J)
 Feld(I,J,3) = Feld(I,J,3) - 1
 If Feld(I,J,3) = 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
  If X + I > 0 And X + I < 200 And Y + J > 0 And Y + J < 150 Then
   If Feld(I + X, J + Y,0) = 0 Then
    FEld(I + X, J + Y,0) = Feld(I,J,0)
    FEld(I + X, J + Y,1) = Feld(I,J,5)
    FEld(I + X, J + Y,2) = Feld(I,J,6)
    FEld(I + X, J + Y,3) = Feld(I,J,7)
    FEld(I + X, J + Y,4) = Feld(I,J,8) 
    FEld(I + X, J + Y,5) = Feld(I,J,5) + Rand(-5, 5)
    FEld(I + X, J + Y,6) = Feld(I,J,6) + Rand(-5, 5)
    FEld(I + X, J + Y,7) = Feld(I,J,7) + Rand(-5, 5)
    FEld(I + X, J + Y,8) = Feld(I,J,8) + Rand(-5, 5)
    Feld(I,J,3) = Feld(I,J,7)
   EndIf
  EndIf
 EndIf
End Function


Function Leben(I,J); Auch Hunger gleich mit rein
 Feld(I,J,1) = Feld(I,J,1) - 1
 If Feld(I,J,1) = 0 Then Feld(I,J,0) = 0
 If Feld(I,J,0) > 1 Then
  Feld(I,J,2) = Feld(I,J,2) - 1
  If Feld(I,J,2) < 1 Then Feld(I,J,0) = 0
 EndIf
End Function

Repeat
 Schritte = Schritte + 1
 For I = 1 To 200
  For J = 1 To 150

   If Feld(I,J,0) = 1 Then
    Teilung(I,J)
    Leben(I,J)
    Color 0,255,0
    Rect I * 4, J * 4, 3, 3
   EndIf
   
   If Feld(I,J,0) = 2 Then
    Teilung(I,J)
    Leben(I,J)
    Bewegen(I,J)
    Color 255,255,255
    Rect I * 4, J * 4, 3, 3
   EndIf

   If Feld(I,J,0) = 3 Then
    Teilung(I,J)
    Leben(I,J)
    Bewegen(I,J)
    Color 0,0,255
    Rect I * 4, J * 4, 3, 3
   EndIf
  Next
 Next
Flip
Cls
Until KeyHit(1)
[/code]

Christoph

BeitragMo, Apr 09, 2007 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, bedarf wie ich finde noch einiges an Verbesserungen.

Die Pflanzenfresser irren wie wild umher, selbst wenn eine Pflanze in ihrer Nähe ist. Nach kurzer Zeit sind sie ausgestorben. Sag mal ehrlich: Wenn du hungrig bist, rennst du dann auch wie wild im Kreis rum? Nee, dann schlägst du (wenn du intelligent bist Wink ) irgendeine X-beliebige Route ein und hoffst auf Nahrung.

Für die Fleischfresser gilt das gleiche.

Zu den Planzen: Wäre nett, wenn sie ab und zu wachsen würden. Wink
 

gigi

Betreff: naja

BeitragMo, Apr 09, 2007 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
jop so naja....du brauchst unbedingt eine KI ansonten läuft das Ganze nur so 30 Sekunden,dann sind die Pflanzen in der Übermacht(und alleine).
du könntest denen ja sagen das wenn in der Nähe ein Bush ist sie sich dahin bewegen sollen und aufpassen das sie nicht gefressen werden.
genauso für die fleischfresser.
p.s.:bist du vegitarier?Wink
edit:schreibfehler(ich meine mit bush nicht bush sondern Busch:-D
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185
  • Zuletzt bearbeitet von gigi am Mo, Apr 09, 2007 21:53, insgesamt einmal bearbeitet

StepTiger

BeitragMo, Apr 09, 2007 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also für eins deiner ersten Programme ist das schonmal nicht schlecht!

Zum Codingstil: Es eignet sich sehr, mit dem Tabulator einzurücken. Ich finde es übersichtlicher und die Standard IDE erkennt es auch so Wink

Das ganze ist noch ziemlich langsam, vielleicht kannst du da noch was machen Wink
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Erbin

Betreff: Weiter so !

BeitragDo, Apr 12, 2007 9:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich find's für den Anfang nicht so schlecht.... Wink

Kabelbinder

Sieger des WM-Contest 2006

BeitragSa, Apr 14, 2007 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, gar nicht so schlecht. Ich find so Simulationen irgendwie immer ganz interessant.
Sowas ähnliches hab ich auch mal gemacht, als ich meine Facharbeit schreiben musste.

Das war in Erdkunde über den Viktoriasee und ich hab ein Programm geschrieben, dass die Fischbestände darin simuliert Smile .
Ist vielleicht eher pseudo-wissenschaftlich aber mein Betreuungs fand das gut. Vielleicht wird mir das ja als besonderer Einsatz angerechnet Laughing .

Ich postes einfach mal
Code: [AUSKLAPPEN]
AppTitle "Jäger-Beute"
Graphics 840,370,16,2
SeedRnd MilliSecs()

Const max = 2000
Const pseudospeed = 200
Const b = 34
Const h = 36

Global bnum,nnum,mult,uml,mon,bru,bor,nils,stag#,arten

Dim bunt#(max,4)
Dim nil#(max,5)

Function create(x#,y#,a)
Select a
Case 1
bunt(bnum,0)=Rnd(0,360)
bunt(bnum,1)=x
bunt(bnum,2)=y
bunt(bnum,3)=1
bunt(bnum,4)=40000

If bnum = max Then
bnum = 0
Else
bnum = bnum + 1
EndIf
Case 2
nil(nnum,0)=Rnd(0,360)
nil(nnum,1)=x
nil(nnum,2)=y
nil(nnum,3)=1
nil(nnum,4)=60000
nil(nnum,5)=2000

If nnum = max Then
nnum = 0
Else
nnum = nnum + 1
EndIf
End Select
End Function

Function swim()
mult = 0
nils = 0
For i = 0 To max
If bunt(i,3)=1 Then
bunt(i,1)=bunt(i,1)+Cos(bunt(i,0))*0.001
bunt(i,2)=bunt(i,2)+Sin(bunt(i,0))*0.001
bunt(i,0)=bunt(i,0)+Rnd(-0.1,0.1)
bunt(i,4)=bunt(i,4)-0.01

If bunt(i,4)<0 Then bunt(i,3)=0
If Not RectsOverlap(bunt(i,1),bunt(i,2),1,1,0,0,b,h) Then
bunt(i,0)=(ATan2(bunt(i,2)-100,bunt(i,1)-100)+180) Mod 360
EndIf

;Menge der Buntbarsche
mult = mult + 1
EndIf

If nil(i,3)=1 Then
;Menge der Nilbarsche
nils = nils + 1
nil(i,1)=nil(i,1)+Cos(nil(i,0))*0.04*pseudospeed
nil(i,2)=nil(i,2)+Sin(nil(i,0))*0.04*pseudospeed
nil(i,0)=nil(i,0)+Rnd(-0.1,0.1)*pseudospeed

If Not RectsOverlap(nil(i,1),nil(i,2),1,1,0,0,b,h) Then
nil(i,0)=ATan2(nil(i,2)-100,nil(i,1)-100)
EndIf
;Lebensdauer
nil(i,4)=nil(i,4)-0.01*pseudospeed
If nil(i,4)<0 Then nil(i,3)=0
;Hunger
nil(i,5)=nil(i,5)-1*pseudospeed
If nil(i,5)<Rnd(-20,0) Then nil(i,3)=0

;fressen
For j = 0 To max
If bunt(j,3)=1 And nil(i,3)=1 Then
If Int(bunt(j,1))=Int(nil(i,1)) And Int(bunt(j,2))=Int(nil(i,2)) Then
bunt(j,3)=0
nil(i,5)=nil(i,5)+80*pseudospeed
EndIf
EndIf
Next

EndIf
Next

End Function

mon = 0
bur = 0
uml = 0

For i = 0 To max
create(Rnd(0,b),Rnd(0,h),1)
Next

For i = 0 To 1
create(Rnd(0,3),Rnd(0,3),2)
Next

Color 255,255,255
Rect 20,350,800,1
For f# = 1 To 21
Rect f*3.6*10+20,348,1,7
Text f*3.6*10+20,360,Int(f)*10,1,1
Next
For f# = 1 To 21
Rect (f-0.5)*3.6*10+20,349,1,3
Next
Text 820,364,"Jahr",1,1

Repeat
ft = MilliSecs()

swim()

uml = uml + 1*pseudospeed
If uml >= 1000 Then
mon = mon + 1
bru = bru + 1
uml = 0

WritePixel stag+20,mult/-10+350,255*$100
WritePixel stag+20,nils/-10+350,255*$10000
stag = stag + 0.3
EndIf

If bru=2 Then
For m = 1 To mult Step 8
create(Rnd(0,b),Rnd(0,h),1)
Next
For m = 1 To nils Step 10
create(Rnd(0,b),Rnd(0,h),2)
Next
bru = 0
EndIf

Color 0,0,0
Rect 0,0,300,52
Color 255,255,255
Text 0,0,Str$(mon/12)+". Jahr"

;Text 0,10,Str$(Float(uml)*0.03)+". Tag"
Color 0,255,0
Text 0,30,"Buntbarsche : "+Str$(mult)
Color 255,0,0
Text 0,40,"Nilbarsche : "+Str$(nils)
Color 255,255,255

If KeyHit(57) Then
FlushKeys()
WaitKey()
EndIf

Until KeyHit(1)
End


Die Facharbeit bekomm ich warscheinlich gleich nach den Ostrferien zurück Sad
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

Rongo Matane

BeitragSo, Mai 20, 2007 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Christoph hat Folgendes geschrieben:
Zu den Planzen: Wäre nett, wenn sie ab und zu wachsen würden. Wink


machen sie doch ^^
Feld(X,Y,8) = Rand(200,300) ; bis sie kacken (genetisch) ´kacken = neue Pflanze im letzten schritt


Stellt einfach mal viele pflanzen (1000) ein, dann leben die auch länger.
Natürlich wirds dann ziemlich langsam^^
Ansonsten find ich das fürs erste Programm ziemlich gut.
Aufgefallen ist mir besonders die Eingabe der Anzahl der Pflanzen usw. per Getkey und dann String addieren, anstatt per Input. Hast du vorher schon mit was anderem programmiert?

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group