diff options
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;
|
