AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pathfinding mit A*

Ein Thema von Luckie · begonnen am 17. Dez 2005 · letzter Beitrag vom 18. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Pathfinding mit A*

  Alt 17. Dez 2005, 16:56
Ich habe mich heute Nachmittag mal drangesetzt und habe versucht den obigen Algorithmus zum Finden eines Pfades zu implementieren. Also so halb funktionieren tut es schon mal. Ich habe mich an die Beschreibung von dieser Seite gehalten: http://www.policyalmanac.org/games/a...torial_de.html .

Nur irgendwie bleibt mein Algorithmus auf halben Weg stecken, das heißt, er landet in einer Endlosschleife. Desweitern, wenn ich das Hindernis bis an die Oberkante des Spielfeldes mache, bleibt er auch stecken. Und ich finde den Fehler in meinem Algorithmus einfach nicht. Ich weiß, dass der Code bestimmt nicht sehr performant ist und auch nicht unbedingt den kürzesten Wg findet, aber ich will überhaupt erstmal einen Weg finden.

Ich glaube, hier Sourcecode zu posten ist etwas schlecht, da man es im Zusammenhang sehen muss. Deswegen hänge ich mal den Source an. Ich denke, der Source spricht für sich.
Angehängte Dateien
Dateityp: zip astar_184.zip (3,1 KB, 50x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 18:03
Ich habe jetzt auch den horizontalen Abstand für die geschätzte Entfernung zum Ziel mit einbezogen:
List.H := (Abs(Abs((Dest.X - i)) + (Abs(Dest.Y - j)))) * 10; Jetzt hängt er gleich beim ersten mal in einer Endlosschleife.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#3

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 18:25
Ich hatte vor einiger Zeit mal diesen Artikel genutzt um A* Pathfinding für die Geister in einen Pacman Klon zu realisieren. Vielleicht fällt dir ja mit dessen Hilfe auf, was bei dir fehlt, oder nicht richtig umgesetzt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#4

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 18:32
@Luckie

Zwar nichts zum Problem, aber warum machst du ein Abs() um die Summe zweier anderer Abs()-gekapselten Rechnungen?
Da diese 100% positiv sind und eine Summe zweier positiver Werte sicher nicht negativ ist, ist die äußerste abs() sinnlos

air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 19:37
Wenn ich den Beitrag richtig verstanden habe, habe ich vermutlich den fehler gefunden und evtl. eine lösung für dich(ich habes nicht gestet).

Meiner meinung nach berechnes du den H wert falsch.
Delphi-Quellcode:
   if Dest.X > Start.X then
        List.H := (Dest.X - i) * 10
      else
        List.H := (i - Dest.X) * 10;
Laut tutorial musst du nicht einfach die Horizontale länge bereichnen sondern auch die vertikal damit meine ich folgendes für die Richtung Rechts:
Delphi-Quellcode:
if Dest.X > Start.x then begin
  Liste.H:=(Dest.X - i)+Dest.Y-j * 10
end;
das müste eigentlich so gehen.
damit meine ich folgendes:
du berechnes vom Start zum Ziel Punkt und berechnes den abstand. Angenommen das Ziel ist unten Rechts und der Start Oben Linx. Dazwischen währen jetzt hindernisse. Jetzt musst du die Horizontale richtung berechnen und anschließnd die Vertiklae richtung und anschließnd zusammen addieren.
So habe ich es verstanden.

Bin mir aber nicht sicher aber das richtig ist.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 22:41
Zitat von mimi:
Meiner meinung nach berechnes du den H wert falsch.
Ja, da suche ich auch gerade den Fehler. Ich habe es jetzt so:
Delphi-Quellcode:
      if Dest.X > Start.x then
      begin
        dx := Dest.X - i;
      end
      else if Dest.X < Start.X then
      begin
        dx := i - Dest.X;
      end
      else
        dx := Dest.X;

      if Dest.y > Start.y then
      begin
        dy := Dest.y - j;
      end
      else if Dest.Y < Start.Y then
      begin
        dy := j - Dest.y;
      end
      else
        dy := Dest.Y;
Aber er bleibt trotzdem wieder stecken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#7

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 23:01
Versuchs doch nochmal auf die kurze Weise:

List.H := (Abs(Dest.X - i) + Abs(Dest.Y - j)) * 10; air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Pathfinding mit A*

  Alt 17. Dez 2005, 23:07
Habe ich auch schon versucht, das klappt auch nicht. Im obigen Code war ein Fehler. So stimmt es:
Delphi-Quellcode:
      if Dest.X > i then
      begin
        dx := Dest.X - i;
      end
      else if Dest.X < i then
      begin
        dx := i - Dest.X;
      end
      else
        dx := Dest.X;

      if Dest.y > j then
      begin
        dy := Dest.y - j;
      end
      else if Dest.Y < j then
      begin
        dy := j - Dest.y;
      end
      else
        dy := Dest.Y;
      List.H := (dx + dy) * 10;
Jetzt kommt er bis zum Ziel, aber nur bis ein Kästchen vor das Ziel, so dass er aus der Schleife nicht rauskommt:
Delphi-Quellcode:
  while (Dest.X <> Start.X) or (Dest.Y <> Start.Y) do
  begin
    Application.ProcessMessages;
    Start := FindPath(Maze, Start, Dest);
    SetLength(Path, length(Path) + 1);
    Path[length(Path) - 1] := Start;
    SetLength(OpenList, 0);
    Sleep(250);
    DrawSquare(2, 3, SPACING, clGreen);
    InvalidateRect(Handle, nil, True);
  end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Pathfinding mit A*

  Alt 18. Dez 2005, 00:43
Michael,

versuche mal folgendes

in TForm1.Button1Click
ersetze
while (Dest.X - 1 <> Start.X) or (Dest.Y - 1 <> Start.Y) do durch
while (abs(dest.x-start.x)>1) or (abs(dest.y-start.y)>1) do in FindPath
ersetze
Delphi-Quellcode:
if Dest.X > Start.X then
   List.H := (Dest.X - i) * 10
else
   List.H := (i - Dest.X) * 10;
// Diagonale Felder
if ((Start.X - 1 = i) and (Start.Y - 1 = j)) // oben links
   or ((Start.X - 1 = i) and (Start.Y + 1 = j)) // unten links
   or ((Start.X + 1 = i) and (Start.Y - 1 = j)) // oben rechts
   or ((Start.X + 1 = i) and (Start.Y + 1 = J)) then // unten rechts
      List.G := 14
else
   // alle anderen
   List.G := 10;
List.F := List.G + List.H;
durch
Delphi-Quellcode:
dx:=abs(dest.x-i);
dy:=abs(dest.y-j);
list.f:=dx*dx+dy*dy;
dx und dy mußt Du natürlich lokal deklarieren.

keine Garantie, aber bei mir funktioniert das.

Gruß, Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Pathfinding mit A*

  Alt 18. Dez 2005, 01:05
Hm, danke. Für diese eine Situation scheint es zu klappen. Aber wenn ich das Ziel auf 6,4 versetze oder die Mauer oben zu mache, dann geht es schon nicht mehr.

Im ersten Posting jetzt noch mnal mein aktueller Code.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz