aboutsummaryrefslogtreecommitdiff
path: root/Занимательное программирование/4/4_prim/mazeunit.pas
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-12-28 19:31:39 +0100
committerEugen Wissner <belka@caraus.de>2025-12-28 19:42:29 +0100
commitb7a63ee8956d977ad3364a1d8f509e307232a22a (patch)
tree8718da1ac404ff210b2d2feada06c36a06c9a32d /Занимательное программирование/4/4_prim/mazeunit.pas
parent2a9136b2f3c82193a9a090b27d4e32b18c594c7e (diff)
downloadbook-exercises-b7a63ee8956d977ad3364a1d8f509e307232a22a.tar.gz
Закончил 4-е упражнение 4-й главы
Diffstat (limited to 'Занимательное программирование/4/4_prim/mazeunit.pas')
-rw-r--r--Занимательное программирование/4/4_prim/mazeunit.pas85
1 files changed, 85 insertions, 0 deletions
diff --git a/Занимательное программирование/4/4_prim/mazeunit.pas b/Занимательное программирование/4/4_prim/mazeunit.pas
new file mode 100644
index 0000000..1c24dbb
--- /dev/null
+++ b/Занимательное программирование/4/4_prim/mazeunit.pas
@@ -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.
+