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