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:
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;
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.
Wo ist da da der Denkfehler?
Danke schonmal für alle Ideen und Tips,
schönen Abend noch !