Thema: Delphi A* / AStar Denkblockade

Einzelnen Beitrag anzeigen

Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#1

A* / AStar Denkblockade

  Alt 29. Mai 2007, 20:04
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 !
Frank Dumont
  Mit Zitat antworten Zitat