Das Große Krabbeln

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Smily

Betreff: Das Große Krabbeln

BeitragFr, Apr 06, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho,
ich hatte mal wieder etwas Lange weile, und wiedermal ist dabei etwas entstanden ^^

Diesmal ist es eine Ameisen Simulation, in der zwei Ameisenstaaten Wachsen und sich bekäpfen.

Kurze Infos:
Es gibt 3 Ameisen-Klassen:
Die Königen (Q), sie legt Eier
Die Arbeiter (W), sie suchen Futter, verarbeiten es zu für andere Fressbares Futter und bringen es ins lager (Bildschirmrand)
Die Kämpfer (X), sie Patrolieren an der Grenze zum anderen Ameisenstaat entlang und greifen feindliche Ameisen in der nähe an.

Alles fängt mit 1 königin und eine Pflanze pro seite an.
Die königin kann eier Legen. Die Pflanze verbreitet sich in der Zeit.
Arbeiter-ameisen Suchen die Pflanzen und verarbeiten sie zu Ameisen-Futter, welches sie dann ins Lager bringen.

Jede Ameise braucht futter. Dabei gibt es für die Ameisen einen Hunger-wert. Wenn dieser Wert eine bestimmte Grenze überschreitet, sucht die Ameise Was zu Futtern. Wenn sie nicht Rechtzeitig was findet verliert sie Energie. Natürlich kann sie auch Während dem Kämpfen energie verlieren. Wobei allerdings nur die Kämpfer-Ameisen sich wirklich auf den Gegner Stürzen. Die Anderen Ameisen wehren sich zwar, aber sie Machen mit ihrer Arbeit weiter.

Wenn die Ameise Satt ist, regeneriert sie ihre Energie wieder.


Update: Man kann jetzt direkt in den Spielverlauf eingreifen. Mit linksklick kann man eine Ameise erstellen (Unten den Typ auswählen) mit Rechtsklick ein Futterstück.
Mit Druck auf die Leertaste kann man einen Krieg starten

Update2: Kleine geschwindigkeits-optimierung Wink
Hier der Code: [AUSKLAPPEN]
Type ant
   Field x
   Field y
   Field energy
   Field team
   Field class
   Field var1
   Field zx
   Field zy
   Field hungry
   Field searchfood
End Type

Type egg
   field x
   Field y
   Field team
   Field e
End type

Type food
   Field x
   Field y
   Field t   
End type

;classes:
;0=queen
;1=worker
;2=warrior
sx = 800
sy = 500
Graphics 800,600,16,2

Dim maxenergy(2)

; Energie der einzelnen Klassen:
maxenergy(0) = 1000
maxenergy(1) = 100
maxenergy(2) = 500


ant.ant = New ant
ant\x = 100
ant\y = sy/2
ant\zx = 100
ant\zy = sy/2
ant\energy = 1000
ant\team = 0
ant\class = 0

ant.ant = New ant
ant\x = sx-100
ant\y = sy/2
ant\zx = sx-100
ant\zy = sy/2
ant\energy = 1000
ant\team = 1
ant\class = 0

food.food = New food
food\x = 200
food\y = sy/2

food.food = New food
food\x = sx-200
food\y = sy/2



SeedRnd(millisecs())

Dim image(1,2)

AutoMidHandle(1)
For t = 0 To 1
   For c = 0 To 2
      image(t,c) = CreateImage(16,16)
      SetBuffer ImageBuffer(image(t,c))
      Select t
         Case 0: Color 255,0,0
         Case 1: Color 0,255,0
      End Select

      Rect 1,1,15,15,0

      Select c
         Case 0
            Text 8,8,"Q",1,1
         Case 1
            Text 8,8,"W",1,1                     
         Case 2
            Text 8,8,"X",1,1
      End select
   
   next
Next
SetBuffer BackBuffer()

ftimer = CreateTimer(60)

Repeat
 klick = MouseHit(1)

   If KeyHit(57) invasion = 1-invasion
;   If invasion
;      For ant.ant = Each ant
;         If ant\team = 1
;            ant\zx = sx/4
;            ant\zy = sy/2
;         End if
;      next
;   End if
;
   For food.food = Each food
      If (Not Rand(0,100)) And food\t = 0
        makefood(rand(food\x-5,food\x+5),rand(food\y-5,food\y+5))
      End If
   Next

   For ant.ant = Each ant
   
      nextant = getnextant(handle(ant),1-ant\team,10)
      ant2.ant = Object.ant(nextant)
      If Handle(ant2)
         Select ant\class
            Case 0:   ant2\energy = ant2\energy-15
            Case 1: If Not Rand(0,2) ant2\energy = ant2\energy-3
            Case 2: If Rand(0,2) ant2\energy = ant2\energy-7
         End select
      End if

      If ant\hungry > 2000 Then ant\searchfood=1
      If ant\hungry > 2200 Then ant\energy = ant\energy-1
      If ant\searchfood
         id = getnextfood(handle(ant),1,1000)
         If id > 1
            food.food = Object.food(id)
            ant\zx = food\x
            ant\zy = food\y
            If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) < 10      
             Delete food.food
             ant\hungry = ant\hungry - 1000
             If ant\hungry < 0 Then ant\searchfood = 0
            End if      
         End if
      Else
         Select Ant\class
            Case 0
               ant\var1 = ant\var1 + 1
               If ant\var1 > 100
                  If makeegg(ant\x,ant\y, ant\team) ant\var1=0
               End If
               If ant\x = ant\zx And ant\y = ant\zy
                  ant\zx = Rand(0,sx/2)
                  If ant\team=1 Then ant\zx = ant\zx + sx/2
                  ant\zy = Rand(0,sy)
               End if
            Case 1
               If Not ant\var1
                  id = getnextfood(handle(ant),0)
                  food.food = Object.food(id)
                  If Handle(food.food)
                     ant\zx = food\x
                     ant\zy = food\y
                     ant\var1 = id
                  End If
               Else
                  food.food = Object.food(ant\var1)
                  If Handle(food)
                     If ant\x = ant\zx And ant\y = ant\zy
                        If food\t = 0
                           food\t = 1
                           If ant\team=0 ant\zx = Rand(0,50) Else ant\zx = Rand(sx-50,sx)
                           ant\zy = Rand(0,sy)
                        Else
                           ant\var1=0
                        End If
                     End If
                     If food\t = 1
                        If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) > 10 ant\var1=0 Else food\x = ant\x   food\y = ant\y
                     End if
                  Else
                     ant\var1=0
                  End if
               End if
            Case 2
               nextant = getnextant(handle(ant),1-ant\team,30+invasion*50)
               ant2.ant = Object.ant(nextant)
               If Handle(ant2)
                  ant\zx = ant2\x
                  ant\zy = ant2\y
                  If ant\zx = ant\x And ant\zy = ant\y
                     ant\x = ant\x + Rand(-3,3)
                     ant\y = ant\Y + Rand(-3,3)
                  End if
               Else
                  If ant\x =ant\zx And ant\y = ant\zy
                   ant\zy = Rand(0,sy)
                     If invasion
                      If ant\team=0 ant\zx = Rand(sx/2,sx) Else ant\zx = Rand(0,sx/2)
                   Else
                      If ant\team=0 ant\zx = sx/2-rand(0,50) Else ant\zx = sx/2+rand(0,50)
                   End if
                  End if
               End If
            End Select   
      End if

      If ant\zx < 0 Then ant\zx = 0
      If ant\zy < 0 Then ant\zy = 0
      If ant\zx > sx Then ant\zx = sx
      If ant\zy > sy Then ant\zy = sy

    If (ant\zx <> ant\x) Or (ant\zy <> ant\y)
     ri = ATan2(ant\zy-ant\y,ant\zx-ant\x)
     ant\x = ant\x + Cos(ri)
     ant\y = ant\y + Sin(ri)
    End if

      ant\hungry = ant\hungry + 1
      If ant\hungry < 1000 And ant\energy < maxenergy(ant\class) ant\energy = ant\energy + 1
      If ant\energy <= 0 Then Delete ant.ant
   Next

   For egg.egg = Each egg
      egg\e = egg\e - 1
      If egg\e = 0 Then
         ant.ant = New ant
         ant\team = egg\team
         ant\class = Rand(1,2)
         ant\x = egg\x
         ant\y = egg\y
         ant\zx = egg\x
         ant\zy = egg\y
         ant\energy=maxenergy(ant\class)
         Delete egg.egg
      End if
   Next
   
   If klick
    If MouseX() < sx And MouseY() < sy
     ant.ant = New ant
     ant\team = selx
     ant\class = sely
   ant\zx = MouseX()
   ant\zy = MouseY()
     ant\x = MouseX()
     ant\y = MouseY()
     ant\energy = maxenergy(sely)
    End if
   End if

   If MouseHit(2)
      food.food = New food
      food\x = MouseX()
      food\y = MouseY()
   End if

   Cls
  Rect 0,0,sx,sy,0
   Line sx/2,0,sx/2,sy
   For ant.ant = Each ant
      DrawBlock image(ant\team, ant\class), ant\x,ant\y
      Text ant\x+5,ant\y, ant\energy,0,1
   Next
   Color 255,255,0
   LockBuffer BackBuffer()
   For food.food = Each food
      If food\t = 0 Then C = $FFFFFF00 Else c = $FF7070FF
      For xdif = -1 To 1
         For ydif = -1 To 1
            WritePixelFast food\x+xdif,food\y+ydif, c
         next
      next
   Next
   UnlockBuffer BackBuffer()

   Color 255,255,255
   For egg.egg = Each egg
      Oval egg\x-4,egg\y-6,8,12,1
   Next

 For y = 0 To 2
      For x = 0 To 1
   If selx = x And sely = y
            Oval 20+x*23,510+y*23,20,20
   End if
         DrawBlock image(x,y),30 + x*23,520 + y*23
         If ImageRectOverlap(image(x,y),30+x*23,520+y*23,mousex(),mousey(),1,1) And klick
            selx = x
            sely = y
       End if
      Next
   Next

 Text 0,0, WaitTimer(ftimer)
   Flip
Until KeyHit(1)

Function makeegg(x,y,t)
   For egg.egg = Each egg
      If RectsOverlap(egg\x-4, egg\y-6, 8, 12,x-4,y-4,8,12) Return 0
   Next
   egg.egg = New egg
   egg\x = x
   egg\y = y
   egg\team = t
  egg\e = 500
   Return 1
End Function

Function makefood(x,y)
 For food.food = Each food
  If RectsOverlap(food\x-2,food\y-2,4,4,x-2,y-2,4,4) Return 0
 Next
 food.food = New food
 food\x = x
 food\y = y
 Return 1
End Function

Function getnextfood(id,t,mine=400)
   ant.ant = Object.ant(id)
   For food.food = Each food
     If food\t = t
         e = sqr((food\x-ant\x)^2 + (food\y-ant\y)^2)
         If e < mine Then id = Handle(food): mine = e: ret=1
      End if
   Next
   If ret Return id Else Return 0
End Function

Function getnextant(id, t, mine=20)
   ant.ant = Object.ant(id)
   For ant2.ant = Each ant
     If ant2\team = t And (Handle(ant2) <> id)
         e = sqr((ant2\x-ant\x)^2 + (ant2\y-ant\y)^2)
         If e < mine Then id = Handle(ant2): mine = e: ret=1
      End if
   Next
   If ret Return id Else Return 0
End Function


Gruß, Smily0412

Smily

BeitragSa, Apr 07, 2007 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ressonanz? oO

ist es so schlecht oder seid ihr Sprachlos? ^^
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Apr 07, 2007 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon ganz nett, bedarf aber imho noch einiger Überarbeitung. Es wird einfach zu schnell langweilig.

Oh, gerade als ich das hier schreib ist es mir mit einem MAV abgeschmiert(nach ca. 3 Minuten) Mr. Green

Mach mal weiter damit, ist immer interessant wie sich sowas entwickelt Wink
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Steven

ehemals "Steven04"

BeitragSa, Apr 07, 2007 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht echt ganz nett aus, aber wie schon gesagt, es wird schnell langweilig und es frisst zu viel Leistung.
Aber ein interessantes Code Beispiel!

Smily

BeitragSa, Apr 07, 2007 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm hättet ihr eine idee, was ich der Simulation noch hinzufügen könnte?
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

ToeB

BeitragSa, Apr 07, 2007 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, aba das kann man sicher prima zu einem Strategiespiel entwikeln ( Jeder spieler ha ein AmeisenVolk, man setzt abwechelnt, oda halt per Lan oda Interne Wink
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Smily

BeitragSa, Apr 07, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
joa wär eine Idee ^^
mir ist auch gerade dei Idee gekommen, dass es vlt sowas wie Faulenzer-Ameisen gibt, welche nihts tun und nur Futter holen ^^

Aber an eine Multiplayer-Version könnt ich mich ja mal wirklich versuchen ^^

Gruß, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Thorsten

BeitragSa, Apr 07, 2007 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finds sehr geil, beschäftige mich schon eine Zeit damit.
Allerdings kommt bei mir regelmäßig ne MAV reingeschossen Sad

Achja : Ich finds sehr witzig dass die Sammler auch gerne mal zur anderen Seite gehen um da Futter zu kriegen; stattdessen holen sie sich den Tod Smile

mfG

Smily

BeitragSo, Apr 08, 2007 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zur anderen Seite gehen sie eigentlich nur, wenn sie bei sich kein Futter mehr haben.

Ich vermute mal, das MAV kommt, wenn ein Futterstück ausserhalb des Bildschirmes gezeichnet werden soll, da werd ich mich mal bei gelegenheit wieder ransetzen
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Thorsten

BeitragMo, Apr 09, 2007 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine etwas veränderte und (schnellere) Version ohne Mav.
Allerdings werden aus einem mir ungekannten Grund keine Eier gezeichnet.
Wie auch immer, ich habe einige Werte nach meine Wünschen abgeändert, werde vielleicht auch noch mal einfach oben Variablen reinschmeißen damit es jeder ändern kann...

Code: [AUSKLAPPEN]
Type ant
   Field x
   Field y
   Field energy
   Field team
   Field class
   Field var1
   Field zx
   Field zy
   Field hungry
   Field searchfood
End Type

Type egg
   Field x
   Field y
   Field team
   Field e
End Type

Type food
   Field x
   Field y
   Field t   
End Type

;classes:
;0=queen
;1=worker
;2=warrior
Global sx = 800
Global sy = 500
Graphics 800,600,16,2

Dim maxenergy(2)

; Energie der einzelnen Klassen:
maxenergy(0) = 1000
maxenergy(1) = 100
maxenergy(2) = 500


ant.ant = New ant
ant\x = 100
ant\y = sy/2
ant\zx = 100
ant\zy = sy/2
ant\energy = 1000
ant\team = 0
ant\class = 0

ant.ant = New ant
ant\x = sx-100
ant\y = sy/2
ant\zx = sx-100
ant\zy = sy/2
ant\energy = 1000
ant\team = 1
ant\class = 0

food.food = New food
food\x = 200
food\y = sy/2

food.food = New food
food\x = sx-200
food\y = sy/2



SeedRnd MilliSecs()

font=LoadFont("Arial",11)
SetFont Font

Dim image(1,2)


AutoMidHandle(1)
For t = 0 To 1
   For c = 0 To 2
      image(t,c) = CreateImage(8,8)
      SetBuffer ImageBuffer(image(t,c))
      Select t
         Case 0: Color 255,0,0
         Case 1: Color 0,255,0
      End Select

      ;Rect 1,1,15,15,0

      Select c
         Case 0
            Text 4,4,"Q",1,1
         Case 1
            Text 4,4,"W",1,1                     
         Case 2
            Text 4,4,"X",1,1
      End Select
   
   Next
Next
SetBuffer BackBuffer()

ftimer = CreateTimer(60)

start_time=MilliSecs()

Repeat
 klick = MouseHit(1)

   If KeyHit(57) invasion = 1-invasion
;   If invasion
;      For ant.ant = Each ant
;         If ant\team = 1
;            ant\zx = sx/4
;            ant\zy = sy/2
;         End if
;      next
;   End if
;
   For food.food = Each food
      If (Not Rand(0,((MilliSecs()-start_time)/1000)*150)) And food\t = 0
        makefood(Rand(food\x-5,food\x+5),Rand(food\y-5,food\y+5))
      End If
   Next

   For ant.ant = Each ant
   
      nextant = getnextant(Handle(ant),1-ant\team,10)
      ant2.ant = Object.ant(nextant)
      If Handle(ant2)
         Select ant\class
            Case 0:   ant2\energy = ant2\energy-15
            Case 1: If Not Rand(0,2) ant2\energy = ant2\energy-3
            Case 2: If Rand(0,2) ant2\energy = ant2\energy-7
         End Select
      End If

      If ant\hungry > 2000 Then ant\searchfood=1
      If ant\hungry > 2200 Then ant\energy = ant\energy-1
      If ant\searchfood
         id = getnextfood(Handle(ant),1,1000)
         If id > 1
            food.food = Object.food(id)
            ant\zx = food\x
            ant\zy = food\y
            If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) < 10     
             Delete food.food
             ant\hungry = ant\hungry - 1000
             If ant\hungry < 0 Then ant\searchfood = 0
            End If     
         End If
      Else
         Select Ant\class
            Case 0
               ant\var1 = ant\var1 + 1
               If ant\var1 > 100
                  If makeegg(ant\x,ant\y, ant\team) ant\var1=0
               End If
               If ant\x = ant\zx And ant\y = ant\zy
                  ant\zx = Rand(0,sx/2)
                  If ant\team=1 Then ant\zx = ant\zx + sx/2
                  ant\zy = Rand(0,sy)
               End If
            Case 1
               If Not ant\var1
                  id = getnextfood(Handle(ant),0)
                  food.food = Object.food(id)
                  If Handle(food.food)
                     ant\zx = food\x
                     ant\zy = food\y
                     ant\var1 = id
                  End If
               Else
                  food.food = Object.food(ant\var1)
                  If Handle(food)
                     If ant\x = ant\zx And ant\y = ant\zy
                        If food\t = 0
                           food\t = 1
                           If ant\team=0 ant\zx = Rand(0,50) Else ant\zx = Rand(sx-50,sx)
                           ant\zy = Rand(0,sy)
                        Else
                           ant\var1=0
                        End If
                     End If
                     If food\t = 1
                        If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) > 10 ant\var1=0 Else food\x = ant\x   food\y = ant\y
                     End If
                  Else
                     ant\var1=0
                  End If
               End If
            Case 2
               nextant = getnextant(Handle(ant),1-ant\team,30+invasion*50)
               ant2.ant = Object.ant(nextant)
               If Handle(ant2)
                  ant\zx = ant2\x
                  ant\zy = ant2\y
                  If ant\zx = ant\x And ant\zy = ant\y
                     ant\x = ant\x + Rand(-3,3)
                     ant\y = ant\Y + Rand(-3,3)
                  End If
               Else
                  If ant\x =ant\zx And ant\y = ant\zy
                   ant\zy = Rand(0,sy)
                     If invasion
                      If ant\team=0 ant\zx = Rand(sx/2,sx) Else ant\zx = Rand(0,sx/2)
                   Else
                      If ant\team=0 ant\zx = sx/2-Rand(0,50) Else ant\zx = sx/2+Rand(0,50)
                   End If
                  End If
               End If
            End Select   
      End If

      If ant\zx < 0 Then ant\zx = 0
      If ant\zy < 0 Then ant\zy = 0
      If ant\zx > sx Then ant\zx = sx
      If ant\zy > sy Then ant\zy = sy

    If (ant\zx <> ant\x) Or (ant\zy <> ant\y)
     ri = ATan2(ant\zy-ant\y,ant\zx-ant\x)
     ant\x = ant\x + Cos(ri)
     ant\y = ant\y + Sin(ri)
    End If

      ant\hungry = ant\hungry + 1
      If ant\hungry < 1000 And ant\energy < maxenergy(ant\class) ant\energy = ant\energy + 1
      If ant\energy <= 0 Then Delete ant.ant
   Next

   For egg.egg = Each egg
      egg\e = egg\e - 1
      If egg\e = 0 Then
         ant.ant = New ant
         ant\team = egg\team
         ant\class = Rand(1,2)
         ant\x = egg\x
         ant\y = egg\y
         ant\zx = egg\x
         ant\zy = egg\y
         ant\energy=maxenergy(ant\class)
         Delete egg.egg
      End If
   Next
   
   If klick
    If MouseX() < sx And MouseY() < sy
     ant.ant = New ant
     ant\team = selx
     ant\class = sely
   ant\zx = MouseX()
   ant\zy = MouseY()
     ant\x = MouseX()
     ant\y = MouseY()
     ant\energy = maxenergy(sely)
    End If
   End If

   If MouseHit(2)
      food.food = New food
      food\x = MouseX()
      food\y = MouseY()
   End If

   Cls

   LockBuffer BackBuffer()
   For food.food = Each food
      If food\t = 0 Then C = $FFFFFF00 Else c = $FF7070FF
      If food\x>0 And food\y>0 And food\x<sx And food\y<sy Then WritePixelFast food\x,food\y, c
   Next

   For egg.egg = Each egg
      If egg\x>0 And egg\y>0 And egg\x<sx And egg\y<sy Then WritePixelFast egg\x,egg\y,$FFFFFF
   Next

   UnlockBuffer BackBuffer()

  Rect 0,0,sx,sy,0
   Line sx/2,0,sx/2,sy
   For ant.ant = Each ant
      DrawImage image(ant\team, ant\class), ant\x,ant\y
      ;Text ant\x+5,ant\y, ant\energy,0,1
   Next

 For y = 0 To 2
      For x = 0 To 1
   If selx = x And sely = y
            Oval 20+x*23,510+y*23,20,20
   End If
         DrawBlock image(x,y),30 + x*23,520 + y*23
         If ImageRectOverlap(image(x,y),30+x*23,520+y*23,MouseX(),MouseY(),1,1) And klick
            selx = x
            sely = y
       End If
      Next
   Next

 Text 0,0, WaitTimer(ftimer)
   Flip 0
Until KeyHit(1)

Function makeegg(x,y,t)
   For egg.egg = Each egg
      egg\x=x And egg\y=y Return 0
   Next
   egg.egg = New egg
   egg\x = x
   egg\y = y
   egg\team = t
  egg\e = 500
   Return 1
End Function

Function makefood(x,y)
 For food.food = Each food
  If food\x=x And food\y=y Return 0
 Next
 food.food = New food
 food\x = x
 food\y = y
 Return 1
End Function

Function getnextfood(id,t,mine=400)
   ant.ant = Object.ant(id)
   For food.food = Each food
     If food\t = t
         e = Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2)
         If e < mine Then id = Handle(food): mine = e: ret=1
      End If
   Next
   If ret Return id Else Return 0
End Function

Function getnextant(id, t, mine=20)
   ant.ant = Object.ant(id)
   For ant2.ant = Each ant
     If ant2\team = t And (Handle(ant2) <> id)
         e = Sqr((ant2\x-ant\x)^2 + (ant2\y-ant\y)^2)
         If e < mine Then id = Handle(ant2): mine = e: ret=1
      End If
   Next
   If ret Return id Else Return 0
End Function


mfG

Thorsten

Smily

BeitragMo, Apr 09, 2007 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm auch nicht schlecht
Ich arbeite auch gerade selber an eine neue verbesserte Version, werde sie aber erst hochladen, wenn sie sich auch sehen lassen kann ^^
Eine Frage: Wie genau hast du das gemacht? also dass es so viele futterstücke so schnell verwaltet werden können?

Bei deinem Beispiel würde für allerdings in den späteren Versionen ein kleines Problem Aufkommen: Durch die große Menge ist das Futter nahezu unbegrenzt. Ich habe mir das so vorgestellt, dass der spieler später einfluss auf die Entwicklung seiner Kolonie hat, und auch Sparsam mit dem "abbau" von futter umgehen muss.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Thorsten

BeitragMo, Apr 09, 2007 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
WritePixelFast hattest du ja schon drin. Das Futter wird dann abhängig von der Zeit erstellt, ganz am Anfang eben sehr viel, dann immer weniger.
Außerdem RectsOverlap rausgenommen und nur die Positionen verglichen, da ja ein Futter Teil nur noch ein Pixel belegt.
Eine große Speedbremse ist außerdem "Text" gewesen.

Das wars eigentlich schon im groben und ganzen. Hier und da noch ein paar Kleinigkeiten.

Was mir allerdings auffällt ist, dass die Version sehr seltsam reagiert ^^
Manchmal legt die Queen keine Eier. Allerdings hab ich in dem Bereich gar nichts geändert.

mfG

Thorsten

Smily

BeitragMo, Apr 09, 2007 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Die eier werden nur nicht gezeichnet, existieren tun sie.

Irgendwie Ulkig oO

Edit: die Eier scheinen sich ausserhalb vom Spielfeld zu befinden (warum auch immer)
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
  • Zuletzt bearbeitet von Smily am Mo, Apr 09, 2007 17:38, insgesamt einmal bearbeitet

The_Nici

BeitragMo, Apr 09, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@BlindGuy: Joa, hab ich auch schon bemerkt mit den Eiern, aber Arbeiter, Kämpfer etc. kommen einfach vonnen Seiten raus... 0o

Toll wäre es, wenn es richtige Grafiken wären. Aber die Simulation ist ziemlich gelungen^^
Toll wäre es auch noch, wenn man einen bau sehen würde, den sie stetig verbessern. Kann mich mal an grafiken versuchen, wenn ihr wollt. =D

Smily

BeitragMo, Apr 09, 2007 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Grafiken kommen ganz zum Schluss, wenn der Rest fertig ist Wink
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Smily

BeitragMo, Apr 09, 2007 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
soo. Ein neues Update. Allerdings hab ich einige Verbesserungen von BG hier noch nicht beachtet. (ganz einfach, weil mir die größeren Futter-Brocken besser gefallen ^^)

Einen gegner gibt es diesmal nicht, da ich plane, dass seine Daten von einem anderen Rechner geschickt werden... (und fertig ist mein erstes Muliplayer-Spiel Very Happy)

Das Interface ist dazugekommen:
Wenn man eine Ameise anklickt wird unten ein Datenblatt von ihr angezeigt.
Mit dem Button "UC" (= "User Controll") Kann man eine Ameise selber Kontrollieren. Mit rechtsklick bewegt man sie über das Feld.

mit dem Button "E" kann eine Ameise Essen. mit "X" wird sie getötet
Jee Klasse hat auch noch ihre eigene Kommandos:
die Königin kann mit "L" eier Legen
Ein Arbeiter kann mit "C" ein in der nähe liegendes Futterstück unwandeln.
Mit "T" bzw "P" kann die Ameise das Futterstück aufheben bzw Hinlegen.

Code: [AUSKLAPPEN]
Type ant
   Field x
   Field y
   Field energy
   Field team
   Field class
   Field var1
   Field zx
   Field zy
   Field hungry
   Field searchfood
   Field UC
End Type

Type egg
   field x
   Field y
   Field team
   Field e
End type

Type food
   Field x
   Field y
   Field t   
End type

;classes:
;0=queen
;1=worker
;2=warrior
Global sx = 800
Global sy = 500
Graphics 800,600,16,2

Global klick
worker_val = 50

Dim classname$(2)
Dim Teamname$(1)
Dim maxenergy(2)
Dim maxhunger(2)
Dim at_val(2)
Dim at_str(2)
Dim Search_food_by_hungry(2)
Dim Dec_en_by_hungry(2)
Dim dec_hungry_by_food(2)
Dim inc_en_to_hung(2)

; Diverse Daten der einzelnen Klassen:

Classname$(0) = "Queen"
Classname$(1) = "Worker"
Classname$(2) = "Warrior"

Teamname$(0) = "Red"
Teamname$(1) = "Green"

maxenergy(0) = 100
maxenergy(1) = 150
maxenergy(2) = 500

maxhunger(0) = 1300
maxhunger(1) = 2100
maxhunger(2) = 2100

at_val(0) = 5
at_val(1) = 3
at_val(2) = 1

at_str(0) = 2
at_str(1) = 1
at_str(2) = 5

Search_food_by_hungry(0) = 750
Search_food_by_hungry(1) = 1500
Search_food_by_hungry(2) = 1500

Dec_en_by_hungry(0) = 1250
Dec_en_by_hungry(1) = 2000
Dec_en_by_hungry(2) = 2000

dec_hungry_by_food(0) = 200
dec_hungry_by_food(1) = 1000
dec_hungry_by_food(2) = 1000

inc_en_to_hung(0) = 500
inc_en_to_hung(1) = 1000
inc_en_to_hung(2) = 1000

food_gen_val = 200

ant.ant = New ant
ant\x = 100
ant\y = sy/2
ant\zx = 100
ant\zy = sy/2
ant\energy = 1
ant\team = 0
ant\class = 0
ant\hungry = 0


For x = 0 To 2
   ant.ant = New ant
   ant\x = 100
   ant\y = sy/2
   ant\zx = 100
   ant\zy = sy/2
   ant\energy = 1
   ant\team = 0
   ant\class = 1
Next


For x = sx/4-10 To sx/4+10 Step 1
   For y = sy/2-10 To sy/2+10 Step 1
      makefood(x,y)
   Next
Next

SeedRnd(millisecs())

Dim image(1,2)

AutoMidHandle(1)
For t = 0 To 1
   For c = 0 To 2
      image(t,c) = CreateImage(16,16)
      SetBuffer ImageBuffer(image(t,c))
      Select t
         Case 0: Color 255,0,0
         Case 1: Color 0,255,0
      End Select

      Rect 1,1,15,15,0

      Select c
         Case 0
            Text 8,8,"Q",1,1
         Case 1
            Text 8,8,"W",1,1                     
         Case 2
            Text 8,8,"X",1,1
      End select
   
   next
Next
SetBuffer BackBuffer()

ftimer = CreateTimer(60)

Repeat
   klick = MouseHit(1)
   
   If KeyHit(57) invasion = 1-invasion

   For food.food = Each food
      If (Not Rand(0,food_gen_val)) And food\t = 0
        makefood(rand(food\x-5,food\x+5),rand(food\y-5,food\y+5))
      End If
   Next

   For ant.ant = Each ant
      nextant = getnextant(handle(ant),1-ant\team,10)
      ant2.ant = Object.ant(nextant)
      If Handle(ant2)
         If Not Rand(0,at_val(ant\class)) ant2\energy = ant2\energy-at_str(ant\class)
      End if
      If ant\hungry > Search_food_by_hungry(ant\class) Then ant\searchfood=1
      If ant\hungry > Dec_en_by_hungry(ant\class) Then ant\energy = ant\energy-1
      
      Select ant\class
         Case 0: ant\var1 = ant\var1 + 1
         Case 1
            food.food = Object.food(ant\var1)
            If Handle(food)
               If food\t = 1
                  If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) > 10 ant\var1=0 Else food\x = ant\x   food\y = ant\y
               End If
            End If
         Case 2
      End select
      
      If ant\uc
         If MouseHit(2)
            ant.ant = Object.ant(sel)
            If Handle(ant)
               ant\zx = MouseX()
               ant\zy = MouseY()
            End If
         End If
      Else
         If ant\searchfood
            id = getnextfood(handle(ant),1,1000)
            If id > 1
               food.food = Object.food(id)
               ant\zx = food\x
               ant\zy = food\y
               If Sqr((food\x-ant\x)^2 + (food\y-ant\y)^2) < 10      
                Delete food.food
                ant\hungry = ant\hungry - dec_hungry_by_food(ant\class)
                If ant\hungry <= 0 Then ant\searchfood = 0
               End if      
            End if
         Else
            Select Ant\class
               Case 0
                  ;ant\var1 = ant\var1 + 1
                  If ant\var1 > 100 makeegg(ant\x,ant\y, ant\team): ant\var1=0
                  If ant\x = ant\zx And ant\y = ant\zy
                     ant\zx = Rand(0,sx/2)
                     If ant\team=1 Then ant\zx = ant\zx + sx/2
                     ant\zy = Rand(0,sy)
                  End if
               Case 1
                  If Not ant\var1
                     id = getnextfood(Handle(ant),0)
                     food.food = Object.food(id)
                     If Handle(food.food)
                        ant\zx = food\x
                        ant\zy = food\y
                        ant\var1 = id
                     End If
                  Else
                     food.food = Object.food(ant\var1)
                     If Handle(food)
                        If ant\x = ant\zx And ant\y = ant\zy
                           If food\t = 0
                              food\t = 1
                              If ant\team=0 ant\zx = Rand(0,50) Else ant\zx = Rand(sx-50,sx)
                              ant\zy = Rand(0,sy)
                           Else
                              ant\var1=0
                           End If
                        End If
                     Else
                        ant\var1=0
                     End If
                  End If
               Case 2
                  nextant = getnextant(handle(ant),1-ant\team,30+invasion*50)
                  ant2.ant = Object.ant(nextant)
                  If Handle(ant2)
                     ant\zx = ant2\x
                     ant\zy = ant2\y
                     If ant\zx = ant\x And ant\zy = ant\y
                        ant\x = ant\x + Rand(-3,3)
                        ant\y = ant\Y + Rand(-3,3)
                     End if
                  Else
                     If ant\x =ant\zx And ant\y = ant\zy
                        ant\zy = Rand(0,sy)
                        If invasion
                           ant\zx = Rand(0,sx)
                        Else
                           If ant\team=0 ant\zx = sx/2-rand(0,50) Else ant\zx = sx/2+rand(0,50)
                        End if
                     End if
                  End If
               End Select   
         End if
      EndIf
      
      If ant\zx < 0 Then ant\zx = 0
      If ant\zy < 0 Then ant\zy = 0
      If ant\zx > sx Then ant\zx = sx
      If ant\zy > sy Then ant\zy = sy
   
      If (ant\zx <> ant\x) Or (ant\zy <> ant\y)
         ri = ATan2(ant\zy-ant\y,ant\zx-ant\x)
         ant\x = ant\x + Cos(ri)
         ant\y = ant\y + Sin(ri)
      End if
   
      ant\hungry = ant\hungry + 1
      If ant\hungry < inc_en_to_hung(ant\class) And ant\energy < maxenergy(ant\class) ant\energy = ant\energy + 1
      If ant\energy > maxenergy(ant\class) ant\energy = maxenergy(ant\class)
      If ant\hungry < 0 ant\hungry = 0
      If ant\hungry > maxhunger(ant\class) ant\hungry = maxhunger(ant\class)
      If ant\energy <= 1 Then Delete ant.ant
   Next
   
   For egg.egg = Each egg
      egg\e = egg\e - 1
      If egg\e = 0 Then
         ant.ant = New ant
         ant\team = egg\team
         If Rand(0,100) <= worker_val ant\class = 1 Else ant\class=2
         ant\x = egg\x
         ant\y = egg\y
         ant\zx = egg\x
         ant\zy = egg\y
         ant\energy=maxenergy(ant\class)
         Delete egg.egg
      End if
   Next
   
   If klick And MouseX() < sx And MouseY() < sy
      For ant.ant = Each ant
         If ImageRectOverlap(image(0,0),ant\x,ant\y,MouseX(),MouseY(),0,0)
            Sel = Handle(ant)
         End If
      Next
   End If
   
   If MouseDown(1) And RectsOverlap(sx/2-50,520,100,20,MouseX(),MouseY(),1,1)
      worker_val = MouseX()-sx/2 + 50
   End If
   
   ;-----------------------
   ;- Bildschirm Zeichnen -
   ;-----------------------
   Cls
  Rect 0,0,sx,sy,0
   Line sx/2,0,sx/2,sy
   
   ; Ausgewählte Ameise
   For ant.ant = Each ant      
      Color 255,255,255
      Rect ant\x-8,ant\y-10,16,2
      Color 255,0,0
      Rect ant\x-8,ant\y-10,16.0/maxenergy(ant\class)*ant\energy,2
      DrawBlock image(ant\team, ant\class), ant\x,ant\y
      If ant\hungry > search_food_by_hungry(ant\class)
         If ant\hungry > dec_en_by_hungry(ant\class) Color 255,0,0 Else Color 255,255,0
         Oval ant\x+6,ant\y+6,6,6,1
         Color 255,255,255
         Oval ant\x+6,ant\y+6,6,6,0
      End If
      If sel = Handle(ant)
         Color 255,255,255
         Rect ant\x-16,ant\y-16,32,32,0
         Rect 5,505,260,90,0
         Text 10,505, "Ameise ausgewählt"; + ant\class
         Text 10,525, "Klase: "; + classname$(ant\class)
         Text 10,540, "Team: "
         Text 10,555, "Energie:"
         Text 10,570, "Hunger:"
         Text 100,525, classname$(ant\class)
         Text 100,540, teamname$(ant\team)
         Rect 100,556,100,13
         Rect 100,571,100,13
         Color 255,0,0
         Rect 100,556,100.0/maxenergy(ant\class)*ant\energy,13
         Color 255,128,128
         Rect 100,571,100,13
         Color 255,255,128
         Rect 100,571,100.0/maxhunger(ant\class)*dec_en_by_hungry(ant\class),13
         Color 128,255,128
         Rect 100,571,100.0/maxhunger(ant\class)*search_food_by_hungry(ant\class),13
         Color 255,0,0
         Rect 100,571,100.0/maxhunger(ant\class)*ant\hungry,13
         Color 0,0,0
         Text 150,562,ant\energy + "/" + maxenergy(ant\class),1,1
         Text 150,577,ant\hungry + "/" + maxhunger(ant\class),1,1
         Color 255,255,255
         If ant\uc c = 255 Else c = 155
         If Drawbutton("UC", 240, 535, 20, 20,c,c,c) ant\uc = Not ant\uc
         If ant\uc
            id = getnextfood(Handle(ant),1,5)
            food.food = Object.food(id)
            If Handle(food)
               If drawbutton("E",215,510,20,20)
                  Delete food.food
                  ant\hungry = ant\hungry - dec_hungry_by_food(ant\class)                  
               End If
            End If
            Select ant\class
               Case 0
                  If ant\var1 > 100
                     If drawbutton("L",215,535,20,20) makeegg(ant\x,ant\y, ant\team): ant\var1=0
                  End If
               Case 1
                  id = getnextfood(Handle(ant),0,5)
                  If id
                     If drawbutton("C",215,535,20,20)
                        food.food = Object.food(id)
                        food\t = 1
                     End If
                  EndIf
                  If ant\var1
                     If drawbutton("P",215,560,20,20) ant\var1 = 0
                  Else
                     id = getnextfood(Handle(ant),1,5)
                     If id
                        If drawbutton("T",215,560,20,20)   ant\var1 = id
                     EndIf
                  End If
               Case 2
            End select
         End If
         If Drawbutton("X",240,510,20,20) Delete ant.ant
      End If
   Next
   
   ;Arbeiter - Kämpfer verhältniss
   Color 255,255,255
   Rect sx/2-50,520,100,21,0
   Line sx/2-50+worker_val,520,sx/2-50+worker_val,540
   Text sx/2-50,550, classname$(2),1,1
   Text sx/2-50,570, 100-worker_val + "%",1,1
   Text sx/2+50,550, classname$(1),1,1
   Text sx/2+50,570, worker_val + "%",1,1
   
   LockBuffer BackBuffer()
   For food.food = Each food
      If food\t = 0 Then C = $FFFFFF00 Else c = $FF7070FF
      For xdif = -1 To 1
         For ydif = -1 To 1
            WritePixelFast food\x+xdif,food\y+ydif, c
         next
      next
   Next
   UnlockBuffer BackBuffer()

   Color 255,255,255
   For egg.egg = Each egg
      Oval egg\x-4,egg\y-6,8,12,1
   Next

   Text 0,0, WaitTimer(ftimer)
   Flip 0
Until KeyHit(1)

Function makeegg(x,y,t)
   For egg.egg = Each egg
      If RectsOverlap(egg\x-4, egg\y-6, 8, 12,x-4,y-4,8,12) Return 0
   Next
   egg.egg = New egg
   egg\x = x
   egg\y = y
   egg\team = t
  egg\e = 500
   Return 1
End Function

Function makefood(x,y)
 For food.food = Each food
  If RectsOverlap(food\x-2,food\y-2,4,4,x-2,y-2,4,4) Return 0
 Next
 If x < 2 Return 0
 If y < 2 Return 0
 If x > sx-2 Return 0
 If y > sy-2 Return 0
 food.food = New food
 food\x = x
 food\y = y
 Return 1
End Function

Function getnextfood(id,t,mine=400)
   ant.ant = Object.ant(id)
   For food.food = Each food
     If food\t = t
         e = sqr((food\x-ant\x)^2 + (food\y-ant\y)^2)
         If e < mine Then id = Handle(food): mine = e: ret=1
      End if
   Next
   If ret Return id Else Return 0
End Function

Function getnextant(id, t, mine=20)
   ant.ant = Object.ant(id)
   For ant2.ant = Each ant
     If ant2\team = t And (Handle(ant2) <> id)
         e = sqr((ant2\x-ant\x)^2 + (ant2\y-ant\y)^2)
         If e < mine Then id = Handle(ant2): mine = e: ret=1
      End if
   Next
   If ret Return id Else Return 0
End Function

Function drawbutton(t$,x,y,w,h,r=255,g=255,b=255)
   Color 100,100,100
   If RectsOverlap(x,y,w,h,MouseX(),MouseY(),1,1) Rect x,y,w,h: If klick Return 1
   Color r,g,b
   Rect x,y,w,h,0
   Text x+w/2,y+h/2,t$,1,1
End Function
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group