Blame lazarus/pathfinder/unit1.pas

ad5f6a
unit Unit1;
ad5f6a
ad5f6a
{$mode objfpc}{$H+}
ad5f6a
ad5f6a
interface
ad5f6a
ad5f6a
uses
ad5f6a
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
ad5f6a
ad5f6a
type
ad5f6a
ad5f6a
  { TForm1 }
ad5f6a
ad5f6a
  TForm1 = class(TForm)
ad5f6a
    Label1: TLabel;
ad5f6a
    procedure FormCreate(Sender: TObject);
ad5f6a
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
ad5f6a
      Shift: TShiftState; X, Y: Integer);
ad5f6a
    procedure FormPaint(Sender: TObject);
ad5f6a
  private
ad5f6a
    { private declarations }
ad5f6a
  public
ad5f6a
    { public declarations }
ad5f6a
  end;
ad5f6a
ad5f6a
const
ad5f6a
  cols = 10;
ad5f6a
  rows = 10;
ad5f6a
  size = 40;
ad5f6a
ad5f6a
var
ad5f6a
  Form1: TForm1;
ad5f6a
  walls: array [0..cols, 0..rows] of boolean;
ad5f6a
  vizited: array [0..cols, 0..rows] of boolean;
ad5f6a
  px, py: integer;
ad5f6a
ad5f6a
implementation
ad5f6a
ad5f6a
{$R *.lfm}
ad5f6a
ad5f6a
function Go(x, y, dx, dy: integer): boolean;
ad5f6a
begin
ad5f6a
  Result := false;
ad5f6a
  if (x>=0) and (y>=0) and (x
ad5f6a
    vizited[x, y] := true;
ad5f6a
ad5f6a
    px := x; py := y;
ad5f6a
    Form1.Refresh;
ad5f6a
    Application.ProcessMessages;
ad5f6a
    Sleep(100);
ad5f6a
ad5f6a
    if (x=dx) and (y=dy) then begin
ad5f6a
      Result := true;
ad5f6a
    end else begin
ad5f6a
      if Go(x-1, y, dx, dy) then Result := true else
ad5f6a
      if Go(x, y-1, dx, dy) then Result := true else
ad5f6a
      if Go(x+1, y, dx, dy) then Result := true else
ad5f6a
      if Go(x, y+1, dx, dy) then Result := true;
ad5f6a
    end;
ad5f6a
ad5f6a
    if not Result then begin
ad5f6a
      px := x; py := y;
ad5f6a
      Form1.Refresh;
ad5f6a
      Application.ProcessMessages;
ad5f6a
      Sleep(100);
ad5f6a
    end;
ad5f6a
  end;
ad5f6a
end;
ad5f6a
ad5f6a
procedure TForm1.FormCreate(Sender: TObject);
ad5f6a
var
ad5f6a
  x, y: integer;
ad5f6a
begin
ad5f6a
  Randomize;
ad5f6a
  for x := 0 to cols-1 do begin
ad5f6a
    for y := 0 to rows-1 do begin
ad5f6a
      if Random > 0.5 then begin
ad5f6a
        walls[x, y] := true;
ad5f6a
      end else begin
ad5f6a
        walls[x, y] := false;
ad5f6a
        px := x;
ad5f6a
        py := y;
ad5f6a
      end;
ad5f6a
    end;
ad5f6a
  end;
ad5f6a
end;
ad5f6a
ad5f6a
procedure TForm1.FormPaint(Sender: TObject);
ad5f6a
var
ad5f6a
  x, y: integer;
ad5f6a
begin
ad5f6a
  for x := 0 to cols-1 do begin
ad5f6a
    for y := 0 to rows-1 do begin
ad5f6a
      if walls[x, y] then begin
ad5f6a
        Canvas.Brush.Color := clBlack;
ad5f6a
      end else begin
ad5f6a
        Canvas.Brush.Color := clWhite;
ad5f6a
      end;
ad5f6a
      Canvas.FillRect(Rect(x*size, y*size, (x+1)*size, (y+1)*size));
ad5f6a
    end;
ad5f6a
  end;
ad5f6a
ad5f6a
  Canvas.Brush.Color := clRed;
ad5f6a
  Canvas.Ellipse(px*size, py*size, (px+1)*size, (py+1)*size);
ad5f6a
end;
ad5f6a
ad5f6a
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
ad5f6a
  Shift: TShiftState; X, Y: Integer);
ad5f6a
var
ad5f6a
  dx, dy, vx, vy: integer;
ad5f6a
begin
ad5f6a
  dx := x div size;
ad5f6a
  dy := y div size;
ad5f6a
  if (dx>=0) and (dy>=0) and (dx
ad5f6a
    if Button = mbLeft then begin
ad5f6a
      walls[dx, dy] := not walls[dx, dy];
ad5f6a
      Refresh;
ad5f6a
    end;
ad5f6a
    if Button = mbRight then begin
ad5f6a
      for vx := 0 to cols-1 do begin
ad5f6a
        for vy := 0 to rows-1 do begin
ad5f6a
          vizited[vx, vy] := false;
ad5f6a
        end;
ad5f6a
      end;
ad5f6a
      if not Go(px, py, dx, dy) then ShowMessage('Path not found');
ad5f6a
      Refresh;
ad5f6a
    end;
ad5f6a
  end;
ad5f6a
end;
ad5f6a
ad5f6a
end.
ad5f6a