KI_
Übersicht

![]() |
MoochBetreff: KI_ |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() ![]() ![]() Please help! MoOch |
||
Pentium IV 3.0Ghz; nVidia Geforce 6800;
Microsoft Windows XP Home SP2; BlitzBasic 3D .:: Sites ::. .:: http://www.fl4sh-clan.de/ ::. |
![]() |
Klip |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group