Einzelnen Beitrag anzeigen

busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#18

Re: Backtracking - Wege aus dem Labyrinth [Source online]

  Alt 16. Feb 2008, 00:55
Bugreport:
Wenn in eine laufende Wegsuche ein neues ungültiges Labyrinth geladen wurde
kam es zu einer Zugriffsverletzung,ein erster Lösungsansatz:

Delphi-Quellcode:
Procedure TForm1.FindeWeg(x,y,i:integer);
begin
//Wenn Ausgang gefunden / Programm beendet -> Breche alle Rekursionstiefen ab
if gefunden or Application.Terminated then
    Exit;

//Schritte insgesamt
inc(c);
//Rekursionstiefe
inc(i);

//Wenn Verzögerung an: Exakte Ausgabe mit Delay
if Form1.rbtnVz.Checked then
  begin
    Ausgabe(i, x, y);
    Delay(StrTointdef(edtDelay.Text,1));
  end
//Im Speed-Modus nur alle 50000 Schritte malen -> sonst speed-modus zu langsam
else
 if (c mod 50000) = 0 then
   Ausgabe(i, x, y);

//EDIT
while Length(Feld)<1 do
begin
gefunden:=True;
exit;
end;
//

Feld[x,y] := 2;
letzte.X := X;
letzte.Y := Y;

if (Ziel.X = X) and (Ziel.Y = Y) then
  begin
    MessageDlg('Ziel gefunden!',mtInformation,[mbOK],0);
    Ausgabe(i,x,y);
    sg.Invalidate;
    gefunden := true;
    Exit;
  end
else
  begin
    feld[X,Y] := 3;
//Edit if Feld[x+1,y] = 1 then
    if not gefunden and (Feld[x+1,y] = 1) then
      FindeWeg(x+1,y,i);

//Edit if Feld[x,y+1] = 1 then
    if not gefunden and (Feld[x,y+1] = 1) then
      FindeWeg(x,y+1,i);

//Edit if Feld[x-1,y] = 1 then
    if not gefunden and (Feld[x-1,y] = 1) then
      FindeWeg(x-1,y,i);

//Edit if Feld[x,y-1] = 1 then
    if not gefunden and (Feld[x,y-1] = 1) then
      FindeWeg(x,y-1,i);

    if not gefunden then
      feld[X,Y] := 2;
    if (i = 1) and not gefunden then
      begin
        Fehler(3,fFehler);
        sg.Invalidate;
        Ausgabe(i,x,y);
        Application.ProcessMessages;
      end;
  end;
end;
  Mit Zitat antworten Zitat