AI - B3D

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

StepTiger

Betreff: AI - B3D

BeitragDi, Aug 08, 2006 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich programmiere gerade an einem 3d Spiel und arbeite an einer KI. Sie greifen mich schon an und sollen letzendlich nach Wegpunkten laufen.

Das Problem ist, dass die KI nicht auf irgendeinem Weg zu mir laufen soll, sie soll auf dem kürzesten zu mir.

Wie lass ich am besten prüfen, ob es der kürzeste ist? (Alle möglichen Wege sind miteinander verknüpft, wenn man von einem zum anderen direkt laufen kann.)

Soll ich alle Möglichkeiten durchprobieren (vorberechnen), und den Weg messen oder gibt es auch eine Variante, die intelligenter ist und nicht so einen hohen Speicheraufwand hat?
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.

FreetimeCoder

BeitragDi, Aug 08, 2006 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht solltest du ,immer wenn ein Gegner aktiv wird, einen direkten Weg von Gegner zu Spieler erstellen. Dann wird der Wegpunkt errechnet, der dem Gegner und dem direkten Weg am nächsten ist. Diesen Wegpunkt soll dann der Gegner ansteuern.
So geht`s weiter mit dem nächsten Wegpunkt.

Müssteste mal probieren Wink
"Wir haben keine Chance, aber wir werden sie nutzen!"
Projekte:
Dexterity Ball (100%)
Aquatic Atmosfear (22 % ca 4700 Zeilen) eingefrohren mangels OOP Fähigkeiten von Blitz
(ehemals Uboot)
PC: Intel D 3 GHz | NVidiaGforce 6700 256 Mb | 1024 Mb DDR RAM 400 Mhz | 2x160 GB S-ATA
 

Dreamora

BeitragDi, Aug 08, 2006 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dein Pfadnetz aufgestellt hast ist der wohl beliebteste (da sehr effizient) Algorithmus den kürzesten Weg zu finden A* (Astar oder wie auch immer die leute es ausschreiben. Gibt glaub sogar AStern *ggg*)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragDi, Aug 08, 2006 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
hab mir mal ein pathfinding programmiert. (ganz ohne tutorial Wink)

Klappt super, aber wie lese ich die Knotenpunkte wieder aus?

also mal hier das Programm:
*edit*

Code verändert:
So löscht er die alten waypoints und gibt die anzahl der waypoints (wenn danach gefragt) an.

*noch ein edit*
findet den Weg zwar jetzt nicht mehr so schnell aber dafür immer richtig:

*edit nr. 3*
jetzt findet es den weg *bei mir* immer. CodeArchiv-reif oder?

*edit nr. 4*
Jetzt lass ich es erstmal so Smile

Code: [AUSKLAPPEN]
max=15

Graphics max*20,max*20+20,32,2
AppTitle "PATHES"

Dim dat(max,max)
Dim dist#(max,max)
Dim kdist#(max,max)
Dim used(max,max)
Dim once(max,max)
Dim knotx(400)
Dim knoty(400)

Restore mydata

For y=1 To max
   For x=1 To max
      Read dat(x,y)
      If dat(x,y)=2 Then px=x:py=y:starx=x:stary=y
      If dat(x,y)=3 Then tarx=x:tary=y
   Next
Next

For x=1 To max
   For y=1 To max
      If dat(x,y)=0 Then Color 125,125,125
      If dat(x,y)=1 Then Color 255,0,0
      If dat(x,y)=2 Then Color 0,0,255
      If dat(x,y)=3 Then Color 0,255,0
      posx=(x-1)*20
      posy=(y-1)*20
      Rect posx,posy,20,20
      Color 0,0,0
      Text posx+5,posy+5,dist#(x,y)
   Next
Next

SetBuffer BackBuffer()

shortx=0
shorty=0

knot=1
knotx(1)=1
knoty(1)=1

While dat(px,py)<>3 And KeyDown(1)=0
   Cls

   c=0

   opx=px
   opy=py
   
   Dim oonce(max,max)
   Dim oused(max,max)
   
   For x=1 To max
      For y=1 To max
         oonce(x,y)=once(x,y)
         oused(x,y)=used(x,y)
      Next
   Next

   wegnow#=0
   For x=2 To knot
      wegnow#=wegnow#+cdist#(knotx(x-1),knoty(x-1),knotx(x),knoty(x))
   Next

   For x=-1 To 1
      For y=-1 To 1
         tx=px+x
         ty=py+y
         If tx>0 And tx<=max And ty>0 And ty<=max And (x=-1 And y=-1)=0 And (x=1 And y=1)=0 And (x=1 And y=-1)=0 And (x=-1 And y=1)=0
            If dat(tx,ty)<>1
               If (tx<>px Or ty<>py) Then c=c+1
               dist#(tx,ty)=cdist#(tx,ty,tarx,tary)+wegnow#
               kdist#(tx,ty)=dist#(tx,ty)
            EndIf
         EndIf
      Next
   Next
   
   If once(px,py)=0 Then used(px,py)=c
   
   If c=0 Then RuntimeError "Absolut nich möglich!"

;   Text 1,1,used(px,py)+" "+once(px,py):Flip:WaitKey

   shortx=0
   shorty=0

   For x=1 To max
      For y=1 To max
         If dat(x,y)<>1
            If (dist#(x,y)>0) And (used(x,y)>0 Or once(x,y)=0)
;               Cls
;               Print used(x,y)+" "+once(x,y)
;               Flip
;               WaitKey
;               If shortx=0
;                  shortx=x
;                  shorty=y
;                  once(x,y)=1
;
;                  Color 255,255,255
;                  Text 1,1,"Klappt"
;                  Flip
;                  WaitKey
;               EndIf

               If dist#(x,y)<=kdist#(shortx,shorty) Or dist#(shortx,shorty)=0 Or c=1
                  used(px,py)=used(px,py)-1
                  shortx=x
                  shorty=y
                  
                  px=shortx
                  py=shorty
                  
                  If opx>px Then richtung=1
                  If opy<py Then richtung=4
                  If opx<px Then richtung=3
                  If opy>py Then richtung=2

;                  Color 255,255,255
;                  Text 1,1,"Klappt"
;                  Flip
;                  WaitKey
               EndIf
            EndIf
         EndIf
      Next
   Next

   If px=opx And py=opy Then RuntimeError("Es gibt keinen Weg!")

   If dist#(px,py)<odist#
      odist#=dist#(px,py)
      For x=1 To max
         For y=1 To max
            dist#(x,y)=0
         Next
      Next
   EndIf

   once(px,py)=1
   dat(px,py)=4
   If cdist#(opx,opy,px,py)<=1
      If richtung<>altrichtung
         dat(opx,opy)=5
         knotx(knot)=opx
         knoty(knot)=opy
         knot=knot+1
      EndIf
   Else
      richtung=0
      short#=1000
      sknot=0
      For x=1 To knot
         If cdist#(opx,opy,knotx(x),knoty(x))<short# Then sknot=x
      Next
      For y=sknot To knot
         dat(knotx(y),knoty(y))=4
      Next
      knot=sknot
   EndIf
   altrichtung=richtung

   For x=1 To max
      For y=1 To max
         If dat(x,y)=0 Then Color 125,125,125
         If dat(x,y)=1 Then Color 255,0,0
         If dat(x,y)=2 Then Color 0,0,255
         If dat(x,y)=3 Then Color 0,255,0
         If dat(x,y)>=4 Then Color 255,255,255
         posx=(x-1)*20
         posy=(y-1)*20
         Rect posx,posy,20,20
         If dat(x,y)=5 Then Color 255,0,255:Rect posx+8,posy+8,4,4
         Color 0,0,0
         Text posx+5,posy+5,dist#(x,y)
      Next
   Next

   Color 255,255,255
   Text 1,160,starx+" "+stary+" "+px+" "+py+" "+once(px,py)+" "+used(px,py)

   Flip

   If cdist#(px,py,tarx,tary)<=1 Then RuntimeError "Du bist am Ziel. Die Koordinaten lauten: "+(px+Sin(richtung*90))+"x "+(py+Cos(richtung*90))+"y."

   WaitKey
   
   FlushKeys
   
   Delay 100

Wend

End

Function cdist#(x1,y1,x2,y2)
   Return Sqr#((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
End Function

.mydata
Data 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0
Data 1,0,1,0,1,1,0,1,0,1,1,1,0,1,0
Data 1,0,1,0,0,1,0,1,0,0,1,1,0,1,0
Data 1,0,1,1,0,1,0,1,1,0,0,0,0,1,0
Data 1,0,0,1,0,1,0,0,0,0,1,1,1,1,0
Data 1,0,0,1,0,1,1,0,1,0,1,0,0,1,0
Data 1,0,0,1,0,0,1,0,1,0,1,0,0,1,0
Data 1,0,1,1,1,0,1,0,1,0,1,0,0,0,0
Data 1,0,0,0,1,0,1,0,0,0,1,0,0,1,1
Data 1,1,1,0,1,0,1,1,1,1,0,0,0,1,3
Data 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0
Data 1,0,1,1,1,0,0,1,0,1,1,1,0,1,0
Data 0,0,0,0,0,1,0,1,0,1,0,0,0,1,0
Data 0,1,1,1,0,0,0,1,0,0,0,1,0,0,0
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group