From b7a63ee8956d977ad3364a1d8f509e307232a22a Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 28 Dec 2025 19:31:39 +0100 Subject: =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B8=D0=BB=204-?= =?UTF-8?q?=D0=B5=20=D1=83=D0=BF=D1=80=D0=B0=D0=B6=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=204-=D0=B9=20=D0=B3=D0=BB=D0=B0=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4/4_prim/mazeunit.pas" | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "\320\227\320\260\320\275\320\270\320\274\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/4/4_prim/mazeunit.pas" (limited to 'Занимательное программирование/4/4_prim/mazeunit.pas') diff --git "a/\320\227\320\260\320\275\320\270\320\274\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/4/4_prim/mazeunit.pas" "b/\320\227\320\260\320\275\320\270\320\274\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/4/4_prim/mazeunit.pas" new file mode 100644 index 0000000..1c24dbb --- /dev/null +++ "b/\320\227\320\260\320\275\320\270\320\274\320\260\321\202\320\265\320\273\321\214\320\275\320\276\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/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. + -- cgit v1.2.3