Registriert seit: 15. Sep 2006
165 Beiträge
|
Re: Backtracking - Wege aus dem Labyrinth [Source online]
16. Feb 2008, 01: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;
|
|
Zitat
|