Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi A* / AStar Denkblockade (https://www.delphipraxis.net/92979-%2A-astar-denkblockade.html)

rawsoul 29. Mai 2007 20:04


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:
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 !

Luckie 29. Mai 2007 21:13

Re: A* / AStar Denkblockade
 
Guck mal hier:
http://www.michael-puff.de/Developer/Delphi/Sonstiges/

rawsoul 30. Mai 2007 14:20

Re: A* / AStar Denkblockade
 
Oh super Luckie, das hat mir echt weitergeholfen! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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