AGB  ·  Datenschutz  ·  Impressum  







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

A* / AStar Denkblockade

Ein Thema von rawsoul · begonnen am 29. Mai 2007 · letzter Beitrag vom 30. Mai 2007
Antwort Antwort
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
Benutzerbild von Luckie
Luckie

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

Re: A* / AStar Denkblockade

  Alt 29. Mai 2007, 21:13
Guck mal hier:
http://www.michael-puff.de/Developer/Delphi/Sonstiges/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

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

Re: A* / AStar Denkblockade

  Alt 30. Mai 2007, 14:20
Oh super Luckie, das hat mir echt weitergeholfen!
Frank Dumont
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:58 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