aboutsummaryrefslogtreecommitdiff
path: root/Занимательное программирование/7/6_tetris/unit2.pas
blob: 2ac9fea3872a9d4e1da4e6f9fd0231f61bfbafb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
unit Unit2;

{$mode ObjFPC}

interface

uses
  Classes, SysUtils, Graphics;

type
  IGameHandler = interface
    procedure DoIteration;
    procedure Reset;
    procedure Finish;
    function IsFinished: Boolean;
  end;

  TActionThread = class(TThread)
  public
    GameHandler: IGameHandler;

    constructor Create(AGameHandler: IGameHandler);
    procedure Execute; override;
  end;

const
  FieldHeight = 20;
  FieldWidth = 10; { высота и ширина игрового поля }
  Delay = 6; { Задержка падения фигуры (в кадрах). }
  LinesPerLevel = 10;

var
  ActionThread: TActionThread;
  MSecsPerFrame: Integer; { миллисекунд на кадр }

  Key_Space, Key_Left, Key_Right, Key_Down: Boolean;  { состояния клавиш }
  Bitmaps: array[0..4] of TBitmap; { "строительные блоки" }
  Field: array[-1..FieldWidth, 0..FieldHeight] of Integer; { игровое поле }
  Pieces: array[1..7, 0..3, 0..3] of Integer = (
    ((1,1,1,1), (0,0,0,0), (0,0,0,0), (0,0,0,0)),
    ((1,1,0,0), (0,1,1,0), (0,0,0,0), (0,0,0,0)),
    ((1,1,1,0), (0,0,1,0), (0,0,0,0), (0,0,0,0)),
    ((1,1,0,0), (1,1,0,0), (0,0,0,0), (0,0,0,0)),
    ((1,0,0,0), (1,1,0,0), (1,0,0,0), (0,0,0,0)),
    ((0,0,1,0), (1,1,1,0), (0,0,0,0), (0,0,0,0)),
    ((0,1,1,0), (1,1,0,0), (0,0,0,0), (0,0,0,0))
  );

implementation

constructor TActionThread.Create(AGameHandler: IGameHandler);
begin
  inherited Create(false);
  GameHandler := AGameHandler
end;

procedure TActionThread.Execute;
var
  OldTime: TDateTime;
  ToWait: Integer;
begin
  while not GameHandler.IsFinished do
  begin
    OldTime := Now;
    Synchronize(@GameHandler.DoIteration);
    { Синхронизация с таймером. }
    ToWait := Round(MSecsPerFrame - (Now - OldTime) * MSecsPerDay);
    if ToWait > 0 then
      Sleep(ToWait)
  end;
end;

exports
  MSecsPerFrame, Bitmaps, Field, Pieces,
  Key_Space, Key_Left, Key_Right, Key_Down;

end.