diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-03-26 20:04:24 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-03-26 20:04:24 +0100 |
| commit | 3dff805e9bf157e9481117b5e9ca74d808b1ffb8 (patch) | |
| tree | 23af18365a1c9e53f052f27b77fad89de70a3f81 /Занимательное программирование/7/3_sokoban/Unit1.pas | |
| parent | cdc4d52b08ae1bfc1347a94f001409f38fcc575e (diff) | |
| download | book-exercises-3dff805e9bf157e9481117b5e9ca74d808b1ffb8.tar.gz | |
Закончил сокобан из 7-й главы, третьего упражнения
Diffstat (limited to 'Занимательное программирование/7/3_sokoban/Unit1.pas')
| -rw-r--r-- | Занимательное программирование/7/3_sokoban/Unit1.pas | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/Занимательное программирование/7/3_sokoban/Unit1.pas b/Занимательное программирование/7/3_sokoban/Unit1.pas index bdb2a92..22ad44d 100644 --- a/Занимательное программирование/7/3_sokoban/Unit1.pas +++ b/Занимательное программирование/7/3_sokoban/Unit1.pas @@ -30,7 +30,7 @@ type end;
const
- WALL = 11; SPACE = 10; BOULDER = 1;
+ WALL = 11; SPACE = 10;
SL = 14; SR = 15; SU = 12; SD = 13; { Индексы спрайтов. }
BOULDER_SET = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'];
PLACE_SET = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];
@@ -115,6 +115,9 @@ begin bitmap := TBitmap.Create; { объект для временного хранения рисунка }
Positioned := 0; { считаем, что размещено 0 камней }
+ Form1.BackBuffer.Canvas.Brush.Color := clBlack;
+ Form1.BackBuffer.Canvas.Clear;
+
for j := 1 to 12 do
for i := 1 to 20 do
begin
@@ -206,6 +209,7 @@ procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var
dx, dy: Integer; { Смещения Сокобана (куда идем). }
SprIdx: Integer; { Текущий номер его спрайта. }
+ TargetCell: Integer;
begin
if Busy then Exit; { Если обработчик занят, выходим. }
@@ -241,8 +245,9 @@ begin dy := 0;
SprIdx := Field[CurX, CurY]
end;
+ TargetCell := PositionBy(dx, dy);
- if PositionBy(dx, dy) = SPACE then { если целевая клетка пуста }
+ if TargetCell = SPACE then { если целевая клетка пуста }
begin
Field[CurX + dx, CurY + dy] := SprIdx; { переходим в нее }
Field[CurX, CurY] := SPACE; { на старой позиции теперь ничего нет }
@@ -250,10 +255,10 @@ begin CurY := CurY + dy;
end
{ если целевая клетка содержит камень, а клетка, следующая за ней, пуста }
- else if (PositionBy(dx, dy) = BOULDER) and (PositionBy(dx, dy, 2) = SPACE) then
+ else if (TargetCell > 0) and (TargetCell < SPACE) and (PositionBy(dx, dy, 2) = SPACE) then
begin { двигаем камень: }
Field[CurX + dx, CurY + dy] := SprIdx; { новая позиция Сокобана }
- Field[CurX + 2 * dx, CurY + 2 * dy] := BOULDER; { новая позиция камня }
+ Field[CurX + 2 * dx, CurY + 2 * dy] := TargetCell; { новая позиция камня }
Field[CurX, CurY] := SPACE; { на старой позиции - пусто }
CurX := CurX + dx;
CurY := CurY + dy;
|
