1
0

Закончил сокобан из 7-й главы, третьего упражнения

This commit is contained in:
2026-03-26 20:04:24 +01:00
parent cdc4d52b08
commit 3dff805e9b
12 changed files with 209 additions and 150 deletions

View File

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