KI_

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Mooch

Betreff: KI_

BeitragDo, Jan 27, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja,
ich möchte nicht, dass die Mäuse in meiner Simu (Siehe https://www.blitzforum.de/view...6b969cb687 )
einfach dumm vor den Füchsen weglaufen...

Hab mal ne (Ziemlich) abgespeckte Version gecodet:

Code: [AUSKLAPPEN]

AppTitle "KI - Test"
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global FindenFuchs = 50,LastInKreis

Type Mause
   Field X
   Field Y
   Field ZX
   Field ZY
End Type

Type Fuchse
   Field X
   Field Y
   Field ZX
   Field ZY
End Type

CreateMause(200)
CreateFuchse(1)
Timer = CreateTimer(60)


Repeat
   Cls
   UpdateMause()
   UpdateFuchse()
   Flip 0
   WaitTimer Timer
Until KeyDown(1)

End


Function CreateMause(Anzahl=1)
   For I=1 To Anzahl
      CreateMaus(Rand(1,GraphicsWidth()),Rand(1,GraphicsHeight()))
   Next
End Function

Function CreateFuchse(Anzahl=1)
   For I=1 To Anzahl
      CreateFuchs(Rand(1,GraphicsWidth()),Rand(1,GraphicsHeight()))
   Next
End Function


Function CreateMaus(X,Y)
   Maus.Mause = New Mause
   Maus\X  = X
   Maus\Y  = Y
   Maus\ZX = 0
   Maus\ZY = 0
End Function

Function CreateFuchs(X,Y)
   Fuchs.Fuchse = New Fuchse
   Fuchs\X  = X
   Fuchs\Y  = Y
   Fuchs\ZX = 0
   Fuchs\ZY = 0
End Function

Function UpdateMause()
   For Maus.Mause = Each Mause
      If FuchsNextTo(Handle(Maus.Mause)) = False Then
         If Distance#(Maus\X,Maus\Y,Maus\ZX,Maus\ZY) < 20 Then
            Maus\ZX = Rand(1,GraphicsWidth())
            Maus\ZY = Rand(1,GraphicsHeight())
         EndIf
      
         MoveMaus(Handle(Maus.Mause),0,Maus\ZX,Maus\ZY)         
         DrawMaus(Maus\X,Maus\Y)
      Else
         DrawMaus(Maus\X,Maus\Y,1)
         In=In+1
      EndIf
      
      If Maus\X > GraphicsWidth()-50 Then
         Maus\X = GraphicsWidth()-50            
         Maus\ZX = Rand(50,GraphicsWidth()-50)
      EndIf
      If Maus\X < 50 Then
         Maus\X = 50            
         Maus\ZX = Rand(50,GraphicsWidth()-50)
      EndIf
      
      If Maus\y > GraphicsHeight()-50 Then
         Maus\y = GraphicsHeight()-50            
         Maus\Zy = Rand(50,GraphicsHeight()-50)
      EndIf
      If Maus\y < 50 Then
         Maus\y = 50            
         Maus\Zy = Rand(50,GraphicsHeight()-50)
      EndIf
   Next
   
   Text 1,1,"Im Kreis: "+In
   If In Then
      LastInKreis = MilliSecs()
   EndIf
   Text 1,16,"Last In Kreis = "+(Millisecs()-LastInKreis)
   In=0
End Function

Function UpdateFuchse()
   For Fuchs.Fuchse = Each Fuchse
;      If Distance#(Fuchs\X,Fuchs\Y,Fuchs\ZX,Fuchs\ZY) < 20 Then
;         Fuchs\ZX = Rand(1,GraphicsWidth())
;         Fuchs\ZY = Rand(1,GraphicsHeight())
;      EndIf
;      
;      MoveFuchs(Handle(Fuchs.Fuchse),0,Fuchs\ZX,Fuchs\ZY)
      DrawFuchs(Fuchs\X,Fuchs\Y)
      Maus.Mause = First Mause
      MoveFuchsTOMaus(Handle(Fuchs.Fuchse),Handle(Maus.Mause),1)
      Color 0,200,0
      Oval Fuchs\X-FindenFuchs*2,Fuchs\Y-FindenFuchs*2,FindenFuchs*4,FindenFuchs*4,0
   Next
End Function

Function DrawFuchs(X,Y,C=0)
   If C=0 Then Color 150,75,0
   Oval X,Y,5,5,1
End Function

Function DrawMaus(X,Y,C=0)
   If C=0 Then Color 150,150,150
   Oval X,Y,4,4,1
End Function

Function FuchsNextTo(Objekt)
   Maus.Mause = Object.Mause(Objekt)
   
   For Fuchs.Fuchse = Each Fuchse
      If Fuchs <> Null Then
         If Distance#(Maus\X,Maus\Y,Fuchs\X,Fuchs\Y) < FindenFuchs*2 Then
            Anz = Anz + 1
            Fliehen(Handle(Maus.Mause),Handle(Fuchs.Fuchse))
         EndIf
      EndIf
   Next
   
   If Anz>0 Then Return 1
   If Anz=0 Then Return 0
End Function

Function Fliehen(Objekt,Objekt2)
   Maus.Mause   = Object.Mause(Objekt)
   Fuchs.Fuchse = Object.Fuchse(Objekt2)
   
   If Fuchs<>Null And Maus <> Null Then   
      Color 150,0,0
      
      If Fuchs\X > Maus\X+20 Then Maus\ZX = Rand(20,Maus\X+20)
      If Fuchs\X < Maus\X-20 Then Maus\ZX = Rand(Maus\X-20,GraphicsWidth()-50)            
      If Fuchs\Y > Maus\Y+20 Then Maus\ZY = Rand(20,Maus\Y+20)
      If Fuchs\Y < Maus\Y-20 Then Maus\ZY = Rand(Maus\Y-20,GraphicsHeight()-50)
      
      If DistanceY(Fuchs\Y, Maus\Y) < 20 Then Maus\ZY = Rand(20,GraphicsHeight()-50)
      If DistanceX(Fuchs\X, Maus\X) < 20 Then Maus\ZX = Rand(20,GraphicsWidth()-50)   
      
      MoveMaus(Objekt,0,Maus\ZX,Maus\ZY,Rand(1,4))      
   EndIf
End Function

Function distance#(x1#,y1#,x2#,y2#)
  Return Sqr((x2-x1)^2+(y2-y1)^2)
End Function

Function distanceX(x1,x2)
  Return Sqr((x2-x1)^2)
End Function

Function distanceY(Y1,Y2)
  Return Sqr((Y2-Y1)^2)
End Function

Function MoveMaus(Objekt,Ziel=0,X=0,Y=0,Geschw=4)
   Temp.Mause = Object.Mause(Objekt)
   
   If Ziel=0 Then
      If X = 0 Or Y = 0 Then
         X = Temp\ZX
         Y = TEmp\ZY
      EndIf
      
      If Temp\X < X Then Temp\X = Temp\X+Geschw
      If Temp\x > X Then Temp\X = Temp\X-Geschw
      
      If Temp\Y < Y Then Temp\Y = Temp\Y+Geschw
      If Temp\Y > Y Then Temp\Y = Temp\Y-Geschw
   EndIf
   
   If Ziel Then
      Part.Mause = Object.Mause(Ziel)
      
      If Part <> Null Then
         X = Part\X
         Y = Part\Y
         
         If Temp\X < X Then Temp\X = Temp\X+Geschw
         If Temp\x > X Then Temp\X = Temp\X-Geschw
         
         If Temp\Y < Y Then Temp\Y = Temp\Y+Geschw
         If Temp\Y > Y Then Temp\Y = Temp\Y-Geschw
      EndIf
   Endif
End Function

Function MoveFuchs(Objekt,Ziel=0,X=0,Y=0,Geschw=4)
   Temp.Fuchse = Object.Fuchse(Objekt)
   
   If Ziel=0 Then
      If Temp\X < X Then Temp\X = Temp\X+Geschw
      If Temp\x > X Then Temp\X = Temp\X-Geschw
      
      If Temp\Y < Y Then Temp\Y = Temp\Y+Geschw
      If Temp\Y > Y Then Temp\Y = Temp\Y-Geschw
   EndIf
   
   If Ziel Then
      Part.Fuchse = Object.Fuchse(Ziel)
      X = Part\X
      Y = Part\Y
      
      If Temp\X < X Then Temp\X = Temp\X+Geschw
      If Temp\x > X Then Temp\X = Temp\X-Geschw
      
      If Temp\Y < Y Then Temp\Y = Temp\Y+Geschw
      If Temp\Y > Y Then Temp\Y = Temp\Y-Geschw
   Endif
End Function

Function MoveFuchsToMaus(Objekt,Objekt2,Geschw=5)
   Part.Mause = Object.Mause(Objekt2)
   X = Part\X
   Y = Part\Y
   
   Temp.Fuchse = Object.Fuchse(Objekt)
      
   If Temp\X < X Then Temp\X = Temp\X+Geschw
   If Temp\x > X Then Temp\X = Temp\X-Geschw
      
   If Temp\Y < Y Then Temp\Y = Temp\Y+Geschw
   If Temp\Y > Y Then Temp\Y = Temp\Y-Geschw
End Function


Die Mäuse laufen jetzt einfach zufällig vor dem Fuchs weg.
Sie werden dadurch leicht in eine Ecke gedrängt o.ä.
Das will ich verhindern.
Klappt aber nich... Crying or Very sad Sad Crying or Very sad

Please help!
MoOch
Pentium IV 3.0Ghz; nVidia Geforce 6800;
Microsoft Windows XP Home SP2; BlitzBasic 3D

.:: Sites ::.
.:: http://www.fl4sh-clan.de/ ::.


Klip

BeitragDo, Jan 27, 2005 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest Wegpunkte erstellen, die eine Variable als Priorität verwenden. Bei jedem Wegpunkt schaut die Maus dann, wo der nächste Fuchs ist und entscheidet dann, wohin sie sich wendet. Wegpunkte an Ecken haben eine sehr niedrige Priorität in Richtung der Ecken.

Das nur als Idee ohne Bezug zum Code (spät, gehe nun schlafen). Wenn bis morgen noch keine sinnvolle Lösung da ist, schau ich es mir noch einmal an.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group