Program Kolumz;.PAS

{* Колонки *}

Unit PROGRAM KOLUMZ;;
Interface
Implementation
Begin
 writeln('Старая игра в текстовом режиме');
End.

Program Kolumz;

Uses Program Kolumz;.pas; {* Эту строку можно удалить *}
Uses TpCrt, TpWindow; {* Подключаем внешние файлы *}
Type {* Создание новых типов данных *}
  Map    = Array [0..30, 0..7] Of Byte;
  Line   = Array [0..2] Of Byte;
  OfsMap = Array [0..1, 0..3] Of ShortInt;
Const {* Постоянные значения *}
  MaxY    : Byte = 18;
  MaxCol  : Byte = 6;
  OfsMapX : Ofsmap = ((1, 1, 0, 1),(2, 2, 0, 2));
  OfsMapY : Ofsmap = ((0, 1, 1, - 1),(0, 2, 2, - 2));
  ZLn     : Line = (0, 0, 0);
  Atr     : Array [0..8] Of byte = (0, 9, 10, 11, 12, 13, 14, 15, 7);
Var {* Объявление переменных *}
  SysTime                : LongInt Absolute $0;
  OldTime                : LongInt;
  NewTime                : LongInt;
  WorkTime               : word;
  ScoreWindow            : WindowPtr;
  GameWindow             : WindowPtr;
  GameCount              : Byte;
  GX                     : Byte;
  GY                     : Byte;
  OldX                   : Byte;
  OldY                   : Byte;
  RealSpeed              : Word;
  Speed                  : Word;
  GameScore              : Word;
  BeepFlag               : Boolean;
  FoundLn                : Boolean;
  Flag                   : Boolean;
  GameMap                : Map;
  Map1                   : Map;
  GmLn                   : Line;
  GmStr                  : String;
  Key                    : Char;
  I                      : Byte;
  J                      : Byte;
Procedure FoundLines(x : byte;
y                      : byte;
l                      : map);
Var {* Объявление переменных *}
  mask                                               : shortint;
  a                                                  : shortint;
  c                                                  : shortint;
  d                                                  : shortint;
  e                                                  : shortint;
  f                                                  : shortint;
  g                                                  : shortint;
  h                                                  : shortint;
  Begin
  mask := L[y, x];
For a := 0 To 3 Do{* Цикл для a => [0 .. 3] *}
  f := x + OfsMapX[0, a];
g := y + OfsMapY[1, a];
h := x + OfsMapX[1, a];
c := L[e, f];
d := L[g, h];
If ((c = mask) And (d = mask)) Then
  Begin
Map1[y := 1;
x] := 1;
Map1[e := 1;
f] := 1;
Map1[g := 1;
h] := 1;
BeepFlag := True;
Var {* Необходимые переменные *}
  a         : Byte;
  b         : Byte;
  c         : Byte;
  Begin
  a := GmLn[0];
  b := GmLn[1];
  c := GmLn[2];
  GmLn[0] := b;
  GmLn[1] := c;
  GmLn[2] := a;
Var {* Объявление переменных *}
  a           : Byte;
  b           : Byte;
  c           : Byte;
  d           : Byte;
  Begin
For a := 1 To MaxY Do{* Цикл для a => [1 .. MaxY] *}
  For b := 0 To 5 Do{* Цикл для b => [0 .. 5] *}
    c := GameMap[d, b];
Var {* Необходимые переменные *}
  x1                         : Byte;
  y1                         : Byte;
  z1                         : Byte;
  Begin
  flag := true;
While flag Do
  Begin
Flag := false;
For y1 := MaxY Downto 1 Do
  Begin
For x1;
  For z1 := y1 - 1 Downto 1 Do
    GameMap[z1 + 1, x1];
If flag Then
  y1 := 1;
Var {* Объявление переменных *}
  x1                 : Byte;
  y1                 : Byte;
  Begin
  BeepFlag := False;
  FoundLn := false;
For y1 := MaxY Downto 1 Do
  For x1;
    For y1 := MaxY Downto 1 Do
      For x1;
        FoundLn := true;
str(GameScore      : 5, GmStr); {PrintScore}
Procedure PutCol(L : Line;
x                  : byte);
y                  : byte);
Var {* Объявление переменных *}
  i           : byte;
  Begin
For I := 0 To 2 Do{* Цикл для I => [0 .. 2] *}
Procedure PutLine;
Begin
PutCol(ZLn, OldX, OldY);
PutCol(GmLn, GX, GY);
End;
Begin
Randomize;
ClrScr; {* Очистка экрана *}
If Not MakeWindow(ScoreWindow, 30, 1, 45, 5, True, True, True,                       112, 112, 112, ' SCORE 'Then
  Halt(2);
If Not MakeWindow(GameWindow, 10, 1, 27, 22, True, True, True,                       112, 30,$1c, ' KOLUMZ 'Then
  Halt(2);
If Not DisplayWindow(ScoreWindow) Then
  Halt(2);
If Not DisplayWindow(GameWindow) Then
  Halt(2);
GameScore := 0;
FillChar(GameMap, 200,#0);
PutMap;
Speed := 12;
GameCount := 0;
While GameMap[3, 3] = 0 Do
  Begin
GX := 3;
GY := 4;
asm        mov ah, 0Ch        int 21h
End;
OldX := 3;
OldY := 5;
For I := 0 To 2 Do {* Увеличиваем I от 0 до 2 с шагом 1 *}
  GmLn[I] := Random(MaxCol) + 1; {RandLine}
PutLine;
RealSpeed := Speed;
Repeat       OldTime := SysTime;
  Repeat
    If keypressed Then
      Begin
Key := ReadKey; {* Ждем нажатия пользователя *}
If Key = #0 Then
  Begin
Key := ReadKey; {* Ждем нажатия пользователя *}
Case Key Of                        #75:
  Begin
OldX := GX;
OldY := GY;
If GX > 0 Then
  Dec(GX); {* GX-- *}
If GameMap[GY, GX] > 0 Then
  GX := OldX;
PutLine;
End;
#77:
Begin
OldX := GX;
OldY := GY;
If Gx0 Then
  GX := OldX;
PutLine;
End;
#72:
Begin
ScrolLine;
PutLine;
End;
#80 : RealSpeed := RealSpeed Div 10;
End;

End;
If key = #27 Then
  Halt(2);
End;
NewTime := SysTime;
WorkTime := NewTime - OldTime;
Until worktime > = RealSpeed;
OldY := GY;
OldX := GX;
Inc(GY); {* Прибавим к GY единицу *}
PutLine; {       delay(RealSpeed);
}

Until ((GY > MaxY) Or (GameMap[GY, GX] > 0));
For i := 0 To 2 Do {* Цикл для i => [0 .. 2] *}
  GameMap[GY - I - 1, GX] := GmLn[I];
DelLines;
If GameCount = 19 Then
  Begin
GameCount := 0;
Speed := (Speed Div 3) Shl 1;
End;

End;
Beep;
Key := ReadKey; {* Ждем нажатия любой клавиши *}
End....