Закончил 4-е упражнение 4-й главы

This commit is contained in:
2025-12-28 19:31:39 +01:00
parent 2a9136b2f3
commit b7a63ee895
9 changed files with 999 additions and 2 deletions

View File

@@ -0,0 +1,85 @@
unit MazeUnit;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils;
type
Location = record
left_wall, up_wall: Boolean;
end;
Maze = array of array of Location;
(* Загрузить лабиринт. *)
procedure LoadMaze(var TheMaze: Maze; FileName: string);
(* Сохранить лабиринт *)
procedure SaveMaze(TheMaze: Maze; FileName: string);
function CanGo(TheMaze: Maze; x, y, dx, dy: Integer): Boolean;
implementation
procedure LoadMaze(var TheMaze: Maze; FileName: string);
var f: TextFile; (* Файл с описанием лабиринта *)
Height, Width: Integer; (* высота и ширина лабиринта *)
x, y: Integer; (* текущая локация *)
lw, uw: Integer; (* временные переменные *)
begin
AssignFile(f, FileName); (* открыть файл *)
Reset(f);
ReadLn(f, Width, Height); (* прочитать высоту и ширину *)
SetLength(TheMaze, Width + 1, Height + 1); (* изменить размер лабиринта *)
for y := 0 to Height do (* Цикл по всем локациям *)
for x := 0 to Width do
if (y = Height) or (x = Width) then (* если локация - служебная *)
begin
TheMaze[x, y].left_wall := true; (* обе стены существуют *)
TheMaze[x, y].up_wall := true
end
else
begin (* иначе считываем *)
ReadLn(f, uw, lw); (* из файла *)
TheMaze[x, y].left_wall := Boolean(lw); (* прочитанное целое *)
TheMaze[x, y].up_wall := Boolean(uw); (* число надо привести *)
end; (* к типу Boolean *)
CloseFile(f); (* Закрыть файл *)
end;
procedure SaveMaze(TheMaze: Maze; FileName: string);
var f: TextFile; (* файл с описанием лабиринта *)
Height, Width: Integer; (* высота и ширина *)
x, y: Integer; (* координаты текущей локации *)
begin
AssignFile(f, FileName); (* открыать файл *)
Rewrite(f); (* для записи *)
Height := High(TheMaze[0]); (* определяем высоту *)
Width := High(TheMaze); (* и ширину лабиринта *)
WriteLn(f, Width, ' ', Height); (* запись в файл высоты и ширины *)
for y := 0 to Height - 1 do
for x := 0 to Width - 1 do
WriteLn(f, Integer(TheMaze[x, y].up_wall), ' ',
Integer(TheMaze[x, y].left_wall));
CloseFile(f); (* закрыть файл *)
end;
(* служебная функция: определяет, можно ли пройти из локации
(x, y) в локацию (x + dx, y + dy), то есть нет ли между ними стены *)
function CanGo(TheMaze: Maze; x, y, dx, dy: Integer): Boolean;
begin
if dx = -1 then CanGo := not TheMaze[x, y].left_wall
else if dx = 1 then CanGo := not TheMaze[x + 1, y].left_wall
else if dy = -1 then CanGo := not TheMaze[x, y].up_wall
else CanGo := not TheMaze[x, y + 1].up_wall;
end;
end.