Закончил сокобан из 7-й главы, третьего упражнения
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user