![]() |
A* / AStar Denkblockade
Hey Zusammen,
Bin vor ein paar Tagen auf den AStar Algorythmus gestoßen und wollte versuchen, diesen umzusetzen. Irgendwo scheine ich falsch zu denken. Hier einfach mal ein Stück Quelltext.
Delphi-Quellcode:
type
zelle = record typ : byte; f,g,h : integer; posi,vorgaenger : tpoint; end; pointarr = array of tpoint; var Form1: TForm1; zellen: array of array of zelle; start,ziel,aktuell: tpoint; offeneliste,geschlosseneliste: pointarr; const rowcount=12; colcount=12;
Delphi-Quellcode:
Nun ist es so, dass er den Neuen umliegenden Zellen nicht F, G und H neu zuweist (werden normalerweise in der Statusbar angezeigt). Daher denke ich, dass es nicht einmal soweit kommt.
procedure TForm1.schrittbtnClick(Sender: TObject);
var i,x,y,minf,zwg:integer; ingeschlossenerliste,inoffenerliste:boolean; begin //2a minf:=zellen[offeneliste[0].x,offeneliste[0].y].f; for i:=0 to high(offeneliste) do begin if zellen[offeneliste[i].x,offeneliste[i].y].f < minf then begin minf:=zellen[offeneliste[i].x,offeneliste[i].y].f; aktuell:=offeneliste[i]; delarrayele(offeneliste,i); end; end; //2b setlength(geschlosseneliste,high(geschlosseneliste)+2); geschlosseneliste[high(geschlosseneliste)]:=aktuell; //2c for x:=-1 to 1 do for y:=-1 to 1 do //wenn gültig, dann if (aktuell.x+x>-1) and (aktuell.x+x<12) and (aktuell.y+y>-1) and (aktuell.y+y<12) then begin //MIT JEDER ZELLE: ingeschlossenerliste:=false; for i:=0 to high(geschlosseneliste) do if (aktuell.x+x=geschlosseneliste[i].x) and (aktuell.y+y=geschlosseneliste[i].y) then ingeschlossenerliste:=true; if (zellen[aktuell.x+x,aktuell.y+y].typ<>2) and ingeschlossenerliste=false then begin //inoffeneliste inoffenerliste:=false; for i:=0 to high(offeneliste) do if (aktuell.x+x=offeneliste[i].x) and (aktuell.y+y=offeneliste[i].y) then inoffenerliste:=true; if inoffenerliste=false then begin //eintragen, werte übergeben setlength(offeneliste,high(offeneliste)+2); offeneliste[high(offeneliste)]:=point(aktuell.x+x,aktuell.y+y); with zellen[aktuell.X+x,aktuell.y+y] do begin vorgaenger:=aktuell; h:=abs(ziel.X-aktuell.x+x)*10+abs(ziel.y-aktuell.Y+y)*10; g:=round(sqrt(sqr(vorgaenger.x-aktuell.X+x)+sqr(vorgaenger.y-aktuell.Y+y))); f:=g+h; end; end; end; end; end; Wo ist da da der Denkfehler? Danke schonmal für alle Ideen und Tips, schönen Abend noch ! |
Re: A* / AStar Denkblockade
|
Re: A* / AStar Denkblockade
Oh super Luckie, das hat mir echt weitergeholfen! :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz