EnotVM

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » EnotVM » Тестовый форум » Тетрис


Тетрис

Сообщений 1 страница 5 из 5

1

https://gist.github.com/Termojad/ee01e7 … 61dd3e8e6e
https://gist.githubusercontent.com/Termojad/ee01e70997774c342ecc7861dd3e8e6e/raw/432592ac59bb021b27c59adad55dc8b2e6ba0377/Tetris%20Pascal%20ABC

program tetris;                    //
                    //   Создатель Тетриса - Алексей Пажитнов!
                    //   Создатель Паскаль - Никлаус Вирт! Супер!!!
                    //   Для запуска программы требуется скачать и установить бесплатную версию Pascal ABC
                    //

uses crt;    // Подключаем модуль Crt, который осуществляет вывод на экран в текстовом режиме 80 столбцов на 25 строк.

var ss,nn,x,y,pus,a,b,c,d,lin,rlin:integer;  // Объявляем основные переменные

st:array[1..12,1..22] of integer;            // Объявляем массив игрового поля 12х22 под именем st[12х22]

randmas:array[1..999999] of integer;         // Объявляем Случайный ранд массив для создания числовой последовательности появления фигур, для определения следующей фигуры

  CounterFigure:integer;                     // Объявляем счетчик выпавших фигур
  CurrFigure,NextFigure:integer;             // Объявляем переменные для вывода информации о следующей текущей и новой фигуре
  Score:integer;                             // Объявляем переменную для сохранение игрового результата (игровые очки)
  i:integer;                    // Объявляем счетчик для циклов в главном теле программы

//  Процедура рисования клеток поля
procedure k(x,y:integer);                 // Процедура k(x,y) - рисует в определенной координате текстового экрана кусок фигуры, кусок забора стакана
begin                    //
gotoxy(x*2+20,23-y);                      //  Поставить текстовый курсор в строку (X*2+30) по Иксу и (24-Y) по Игрику - стартовое положение стакана !
if ss=0 then write('. ');                 //  Если ss=0 то выводится два сивола пустого фона в кавычках '. '   Для затирания следов перемещения фигуры по экрану.
if ss=1 then write('[]');                 //       ss=1 то выводится блок фигуры Тетриса, из двух знаков в кавычках '[]'
if ss=2 then begin textcolor(LightCyan); write(chr(124),chr(124));textcolor (white); end;    //       ss=2 то выводится символы из ASCII № 124 для рисования границ СТАКАНА Тетриса '||' как было в оригинальной ретро-версии Тетриса
if (ss=3) and (st[x,y]>0) then pus:=1;    //       ss=3 и Индекс массива не пустое место (граница стакана или граница фигур), то присвоить pus=1
if ss=4 then st[x,y]:=1;                  //       ss=4 то записать 1 в массив элементов стакана st:array[1..12,1..22]
                    //
end;  //  Конец процедцры рисования клеток k(x,y)

//  Процедура рисования фигур
procedure fig(x,y,n,s:integer);                           // Процедура fig(x,y,n,s) хранит информацию о типах фигур Тетриса
begin
if s=3 then pus:=0;                    // Если s=3 то сделать pus=0
ss:=s; k(x,y);                    // Сделать ss=s и вызвать процедуру k(x,y)

if n=1 then begin k(x+1,y);k(x,y-1);k(x+1,y-1) end;      // Шаблон фигуры 1    (n=1)
//   [][]
//   [][]

if n=2 then begin k(x-1,y);k(x+1,y);k(x+2,y) end;        // Шаблон фигуры 2    (n=2)
//   [][][][]

if n=3 then begin k(x,y+1);k(x,y-1);k(x,y-2) end;        // Шаблон фигуры 3    (n=3)
//   []
//   []
//   []
//   []

if n=4 then begin k(x+1,y);k(x-1,y);k(x-1,y+1) end;      // Шаблон фигуры 4    (n=4)
//   []
//   [][][]

if n=5 then begin k(x,y+1);k(x+1,y+1);k(x,y-1) end;      // Шаблон фигуры 5    (n=5)
//   [][]
//   []
//   []

if n=6 then begin k(x-1,y);k(x+1,y);k(x+1,y-1) end;      // Шаблон фигуры 6    (n=6)
//   [][][]
//       []

if n=7 then begin k(x,y+1);k(x,y-1);k(x-1,y-1) end;      // Шаблон фигуры 7    (n=7)
//     []
//     []
//   [][]

if n=8 then begin k(x-1,y);k(x+1,y);k(x+1,y+1) end;      // Шаблон фигуры 8    (n=8)
//       []
//   [][][]

if n=9 then begin k(x,y+1);k(x,y-1);k(x+1,y-1) end;      // Шаблон фигуры 9    (n=9)
//   []
//   []
//   [][]

if n=10 then begin k(x+1,y);k(x-1,y);k(x-1,y-1) end;     // Шаблон фигуры 10   (n=10)
//   [][][]
//   []

if n=11 then begin k(x,y+1);k(x,y-1);k(x-1,y+1) end;     // Шаблон фигуры 11   (n=11)
//   [][]
//     []
//     []

if n=12 then begin k(x-1,y);k(x,y-1);k(x+1,y-1) end;     // Шаблон фигуры 12   (n=12)
//   [][]
//     [][]

if n=13 then begin k(x,y+1);k(x-1,y);k(x-1,y-1) end;     // Шаблон фигуры 13   (n=13)
//     []
//   [][]
//   []

if n=14 then begin k(x+1,y);k(x-1,y-1);k(x,y-1) end;     // Шаблон фигуры 14   (n=14)
//     [][]
//   [][]

if n=15 then begin k(x-1,y);k(x,y-1);k(x-1,y+1) end;     // Шаблон фигуры 15   (n=15)
//   []
//   [][]
//     []

if n=16 then begin k(x+1,y);k(x-1,y);k(x,y+1) end;       // Шаблон фигуры 16   (n=16)
//     []
//   [][][]

if n=17 then begin k(x+1,y);k(x,y+1);k(x,y-1) end;       // Шаблон фигуры 17   (n=17)
//   []
//   [][]
//   []

if n=18 then begin k(x,y-1);k(x-1,y);k(x+1,y) end;       // Шаблон фигуры 18   (n=18)
//   [][][]
//     []

if n=19 then begin k(x-1,y);k(x,y+1);k(x,y-1) end;        // Шаблон фигуры 19   (n=19)
//     []
//   [][]
//     []

end;  //  Конец процедуры рисования фигур

//  Процедура поворота фигуры
procedure pov;
begin
nn:=nn-1;
if nn=15 then nn:=19;
if nn=13 then nn:=15;
if nn=11 then nn:=13;
if nn=7 then nn:=11;
if nn=3 then nn:=7;
if nn=1 then nn:=3;
if nn=0 then nn:=1;
end;  //  Конец процедуры поворота фигуры

//  Процедура очистка* стакана
procedure clrst;
begin
for x:=1 to 12 do
for y:=1 to 22 do
if (x=1) or (x=12) or (y=1) then st[x,y]:=2
                            else st[x,y]:=0;        // Рисуется  контур стакана и обнуляется стакан
end;  //  Конец процедуры очистки* стакана

//  Процедура рисовать весь стакан
procedure risvesst;
begin
for x:=1 to 12 do  for y:=1 to 22 do
    begin
    ss:=st[x,y];
    k(x,y)                            // Вызов процедуры k(x,y) - рисует в определенной координате текстового экрана поклеточно кусок фигуры, кусок забора стакана
    end;
end; //  Конец процедуры рисовать весь стакан

//  Поцедура контроля и передвижения фигур с помощью клавиатуры
//  !!! Если клавиши не реагируют, пользователь должен перевести клавиатуры в английскую раскладку!!!
procedure dvig;
var
i:integer;
key:char;
begin
for i:=1 to 10 do
   begin
delay(d);     // Задержка на основе данных из переменной d
key:=' ';
if keypressed then key:=readkey;
if key='a' then                    // Если нажата клавиша a, то влево     <=== [a]
begin
fig(x-1,y,nn,3);
if pus=0 then begin fig(x,y,nn,0); x:=x-1; fig(x,y,nn,1);
end;
end;
if key='d' then                    // Если нажата клавиша d, то вправо    ===> [d]
begin
fig(x+1,y,nn,3);
if pus=0 then begin fig(x,y,nn,0); x:=x+1; fig(x,y,nn,1);
end;
end;
if key='w' then                    // Если нажата клавиша w, то поворот фигуры  =[w]=
begin
pov; fig(x,y,nn,3); pov;pov;pov;
if pus=0 then begin fig(x,y,nn,0); pov; fig(x,y,nn,1);
end;
end;
if key='s' then d:=1;                        // Если нажата клавиша s, то фигура летит вниз =[s]=
end;
end; // Конец процедуры контроля и передвижения фигур с помощью клавиатуры

//  Процедура создания новой текущей и следующей фигуры
procedure newfigure;
begin
//  gotoxy(62,20); writeln('          ');                    //отладка
//  gotoxy(62,20); writeln('CounterFigure ', CounterFigure);                     //отладка
//gotoxy(62,15); writeln('               ');                    //отладка
//gotoxy(62,15); writeln('Текущая ', CurrFigure);                    //отладка

NextFigure:=randmas[CounterFigure+2]; // Определение следующей фигуры

CurrFigure:=randmas[CounterFigure+1]; // Определение текущей фигуры

gotoxy(55,10); writeln('               ');  //  Стирание строки
gotoxy(55,10); writeln('Очки: ', Score);    //  Очки за успехи в игре

//gotoxy(55,3); writeln('             '); // Пробелы. Отладка
gotoxy(55,3); writeln('Следующая ');    // Информация о следующей фигуре
                      gotoxy(56,4); writeln('               ');      // Пробелы, по 15 штук, для стирания следов показа следующей фигуры предыдущего хода
                      gotoxy(56,5); writeln('               ');      //
                      gotoxy(56,6); writeln('               ');      //
                      gotoxy(56,7); writeln('               ');      //
                      gotoxy(56,8); writeln('               ');      //
                      gotoxy(56,9); writeln('               ');      //
                         fig(20,17,NextFigure,1); // Рисуется фигура, которая будет выпадать следующей 20=x координата , 17=y координата, NextFigure=nn значение, 1=[] из какого элемента рисуется фигура
nn:=CurrFigure;  // Рисуется текущая фигура, определенная в переменной CurrFigure
end; // Конец процедуры создания новой текущей и следующей фигуры

//  СТАРТ ГЛАВНОЙ ПРОГРАММЫ

begin

// Показ стартовой заставки!
HideCursor; // Скрыть курсор. Чтобы вклюсить обратно, нужен оператор ShowCursor;
TextBackground(Blue);                        // Установить черный цвет фона
ClrScr;                    // Очистить экран
TextColor(White);                             // Установить белый цвет букв
TextBackGround(Blue);                         // Установить синий цвет фона для букв
GotoXY(22,12);                    // Поставить курсор
write('Это версия Тетриса на Паскале ABC!');  // Вывести текст
GotoXY(8,14); writeln('Выбери английскую раскладку на клавиатуре и нажми на любую клавишу!');  // Вывести текст
TextColor(White);
GotoXY(15,5);  writeln('[][][] [][][] [][][] [][][] []     [] [][][]');
GotoXY(15,6);  writeln('  []   []       []   []  [] []   [][] []    ');
GotoXY(15,7);  writeln('  []   [][][]   []   [][][] []  [] [] []    ');
GotoXY(15,8);  writeln('  []   []       []   []     [] []  [] []    ');
GotoXY(15,9);  writeln('  []   [][][]   []   []     [][]   [] [][][]');

GotoXY(39,3);TextBackGround(Red);   write('(c) Алексей Пажитнов');
GotoXY(22,19);TextBackGround(Red);  write('Александр Титов, Екатеринбург, 2019');
TextBackground(Blue); TextBackGround(Blue); TextColor(White);

ReadKey;                    // Ожидать нажатия любой клавиши !!!}

// Конец показа стартовой заставки!

randomize; // Включение генератора случайных чисел
  for i:=1 to 999999 do randmas[i]:=(1+ random(18));  //Создание случайной последовательности почти бесконечной, для определения текущей и следующей фигуры

TextBackground(Blue); TextBackGround(Blue); TextColor(White);
clrscr;    //Очистить экран от следов начальной заставки

textcolor(DarkGray);                   // Нижняя текстовая строка  по середине
gotoxy(1,25);
Write(' Привет мир любителей оригинальной игры Тетрис (Алексей Пажитнов, 1984, СССР),  спасибо создателю языка программирования Паскаль (Никлаус Вирт, 1970, Швейцария) от программистов на Pascal ABC (Титов Александр, 2019, Россия, Екатеринбург)!');
TextColor(White);

textcolor(Yellow);                      // Левая верхняя строка, подсказывающая "как играть?"
gotoxy(01,10);
Writeln(' Как играть?');
Writeln('');
Writeln('  <A> влево');
Writeln('  <D> вправо');
Writeln('  <S> сбросить вниз');
Writeln('  <W> поворот фигуры');
TextColor(White);                      // Конец левой верхней строка

textcolor(Green);                       // Правая верхняя строка с названием игры  =TETЯIS=Pascal=ABC=2019=
gotoxy(52,01);
Writeln('=TETЯIS=Pascal=ABC=2019=');
TextColor(White);                      // Конец верхней правой строки

clrst;       // Процедура обнуления стакана
risvesst;   // Процедура рисования стакана
lin:=0;     // Установить ноль для счетчика линий, который влияет на скорость игры, т.к. содержится в переменной d
Score:=0;    // Установить ноль очков для старта новой игры

repeat      // Начать повторение основного цикла игры! До тех пор, пока есть пустое место на поле для передвижения и появления новых фигур

  newfigure;             // Тут станет известно какая фигура будет следующей и текущей
  x:=6;y:=21;            // Здесь появляется новая фигура! Обрати внимание на x=6 b y=20 это координаты появления новой фигуры
  fig(x,y,nn,3);         // d влияет на скорость игры (задержка по умолчанию стоял   d:=70-(lin*5);
  d:=80-(lin*3);         // когда d 170 - это очень медленно, когда он 10 - то быстровато!

  if pus=0 then         // Если клетка пустая и нет столкновения со стаканом и уложенными ранее в стакан кирпичиками,
   begin                // то
    repeat              // повторять до столкновения
     fig(x,y,nn,1);     // Рисуется текущая фигура до движения, 1=[] из какого элемента рисуется фигура
     dvig;              // Вызвать процедуру движения фигуры с определением нажатой клавиши
   fig(x,y-1,nn,3);     // Нарисовать фигуру со смещением по оси Y при условии ss=3 и Индекс массива не пустое место (граница стакана или граница фигур), то присвоить pus=1 и остановить падение фигуры вниз за один элемент до границы стакана
     if pus=0 then begin fig(x,y,nn,0); y:=y-1; end;  //Рисуется фигура из элементов пустого поля стаканов '. '
    until pus=1;         // Столкновение произошло

  fig(x,y,nn,4);         // !!!!! Нарисовать текущую фигуру, которая не может двигаться и записать её положение в массив элеменов стакана st[]

  CounterFigure:=CounterFigure+1; // Счетчик фигур для отладки
  Score:=Score+100;               // Прибавить 100 очков к счету за касание фигуры с полом

    for y:=22 downto 2 do   // Проверка заполненных рядов
     begin                  // Начало проверки заполненных рядов
      a:=0; for x:=2 to 11 do a:=a+st[x,y];  // Счетчик заполненных фигур, проверяет наличие клетки фигуры в массиве и увеличивается на 1, если там есть элемент фигуры
      if a=10 then                  // Если сумма клеток равна 10, то значит ряд заполнился, его нужно удалить, массив элементов стакана сдвинуть вниз
       begin         // Начало сдвига массива
        for b:=y to 21 do for c:=2 to 11 do st[c,b]:=st[c,b+1]; // Сдвиг массива вниз
        lin:=lin+1;              // Суммировать полностью заполненные линии и увеличть скорость игры
        gotoxy(55,12); writeln('Линии: ',lin); // Показать количество полностью заполненных линий
        Score:=Score+1000;       // Прибавить 1000 очков к счету за полную линию!
       end;         // Конец сдвига массива
     end;            //Конец проверки заполненных рядов
     
   risvesst; // Процедура рисования элементов всего стакана
   pus:=0;
   end;
   
  until pus=1; // Остановить повторение основного игрового цикла! Т.к. нет пустово места.
       gotoxy(4,2); writeln('Игра окончена!'); // Написать"Игра окончена"

end. // Конец текста кода программы этой замечательной игры Тетрис на Паскале АБЦ!

0

2

3

4

https://studassistent.ru/pascal-abc/tet … pascal-abc

program tetris;                                                                  //
                                                                                 //   Создатель Тетриса - Алексей Пажитнов!
                                                                                 //   Создатель Паскаль - Никлаус Вирт! Супер!!!
                                                                                 //   Для запуска программы требуется скачать и установить бесплатную версию Pascal ABC
                                                                                 //

uses crt;    // Подключаем модуль Crt, который осуществляет вывод на экран в текстовом режиме 80 столбцов на 25 строк.

var ss,nn,x,y,pus,a,b,c,d,lin,rlin:integer;  // Объявляем основные переменные

st:array[1..12,1..22] of integer;            // Объявляем массив игрового поля 12х22 под именем st[12х22]

randmas:array[1..999999] of integer;         // Объявляем Случайный ранд массив для создания числовой последовательности появления фигур, для определения следующей фигуры

  CounterFigure:integer;                     // Объявляем счетчик выпавших фигур
  CurrFigure,NextFigure:integer;             // Объявляем переменные для вывода информации о следующей текущей и новой фигуре
  Score:integer;                             // Объявляем переменную для сохранение игрового результата (игровые очки)
  i:integer;                                 // Объявляем счетчик для циклов в главном теле программы

//  Процедура рисования клеток поля
procedure k(x,y:integer);                 // Процедура k(x,y) - рисует в определенной координате текстового экрана кусок фигуры, кусок забора стакана
begin                                     //
gotoxy(x*2+20,23-y);                      //  Поставить текстовый курсор в строку (X*2+30) по Иксу и (24-Y) по Игрику - стартовое положение стакана !
if ss=0 then write('. ');                 //  Если ss=0 то выводится два сивола пустого фона в кавычках '. '   Для затирания следов перемещения фигуры по экрану.
if ss=1 then write('[]');                 //       ss=1 то выводится блок фигуры Тетриса, из двух знаков в кавычках '[]'
if ss=2 then begin textcolor(LightCyan); write(chr(124),chr(124));textcolor (white); end;    //       ss=2 то выводится символы из ASCII № 124 для рисования границ СТАКАНА Тетриса '||' как было в оригинальной ретро-версии Тетриса
if (ss=3) and (st[x,y]>0) then pus:=1;    //       ss=3 и Индекс массива не пустое место (граница стакана или граница фигур), то присвоить pus=1
if ss=4 then st[x,y]:=1;                  //       ss=4 то записать 1 в массив элементов стакана st:array[1..12,1..22]
                                          //
end;  //  Конец процедцры рисования клеток k(x,y)

//  Процедура рисования фигур
procedure fig(x,y,n,s:integer);                           // Процедура fig(x,y,n,s) хранит информацию о типах фигур Тетриса
begin
if s=3 then pus:=0;                                      // Если s=3 то сделать pus=0
ss:=s; k(x,y);                                           // Сделать ss=s и вызвать процедуру k(x,y)

if n=1 then begin k(x+1,y);k(x,y-1);k(x+1,y-1) end;      // Шаблон фигуры 1    (n=1)
//   [][]
//   [][]

if n=2 then begin k(x-1,y);k(x+1,y);k(x+2,y) end;        // Шаблон фигуры 2    (n=2)
//   [][][][]

if n=3 then begin k(x,y+1);k(x,y-1);k(x,y-2) end;        // Шаблон фигуры 3    (n=3)
//   []
//   []
//   []
//   []

if n=4 then begin k(x+1,y);k(x-1,y);k(x-1,y+1) end;      // Шаблон фигуры 4    (n=4)
//   []
//   [][][]

if n=5 then begin k(x,y+1);k(x+1,y+1);k(x,y-1) end;      // Шаблон фигуры 5    (n=5)
//   [][]
//   []
//   []

if n=6 then begin k(x-1,y);k(x+1,y);k(x+1,y-1) end;      // Шаблон фигуры 6    (n=6)
//   [][][]
//       []

if n=7 then begin k(x,y+1);k(x,y-1);k(x-1,y-1) end;      // Шаблон фигуры 7    (n=7)
//     []
//     []
//   [][]

if n=8 then begin k(x-1,y);k(x+1,y);k(x+1,y+1) end;      // Шаблон фигуры 8    (n=8)
//       []
//   [][][]

if n=9 then begin k(x,y+1);k(x,y-1);k(x+1,y-1) end;      // Шаблон фигуры 9    (n=9)
//   []
//   []
//   [][]

if n=10 then begin k(x+1,y);k(x-1,y);k(x-1,y-1) end;     // Шаблон фигуры 10   (n=10)
//   [][][]
//   []

if n=11 then begin k(x,y+1);k(x,y-1);k(x-1,y+1) end;     // Шаблон фигуры 11   (n=11)
//   [][]
//     []
//     []

if n=12 then begin k(x-1,y);k(x,y-1);k(x+1,y-1) end;     // Шаблон фигуры 12   (n=12)
//   [][]
//     [][]

if n=13 then begin k(x,y+1);k(x-1,y);k(x-1,y-1) end;     // Шаблон фигуры 13   (n=13)
//     []
//   [][]
//   []

if n=14 then begin k(x+1,y);k(x-1,y-1);k(x,y-1) end;     // Шаблон фигуры 14   (n=14)
//     [][]
//   [][]

if n=15 then begin k(x-1,y);k(x,y-1);k(x-1,y+1) end;     // Шаблон фигуры 15   (n=15)
//   []
//   [][]
//     []

if n=16 then begin k(x+1,y);k(x-1,y);k(x,y+1) end;       // Шаблон фигуры 16   (n=16)
//     []
//   [][][]

if n=17 then begin k(x+1,y);k(x,y+1);k(x,y-1) end;       // Шаблон фигуры 17   (n=17)
//   []
//   [][]
//   []

if n=18 then begin k(x,y-1);k(x-1,y);k(x+1,y) end;       // Шаблон фигуры 18   (n=18)
//   [][][]
//     []

if n=19 then begin k(x-1,y);k(x,y+1);k(x,y-1) end;        // Шаблон фигуры 19   (n=19)
//     []
//   [][]
//     []

end;  //  Конец процедуры рисования фигур

//  Процедура поворота фигуры
procedure pov;
begin
nn:=nn-1;
if nn=15 then nn:=19;
if nn=13 then nn:=15;
if nn=11 then nn:=13;
if nn=7 then nn:=11;
if nn=3 then nn:=7;
if nn=1 then nn:=3;
if nn=0 then nn:=1;
end;  //  Конец процедуры поворота фигуры

//  Процедура очистка* стакана
procedure clrst;
begin
for x:=1 to 12 do
for y:=1 to 22 do
if (x=1) or (x=12) or (y=1) then st[x,y]:=2
                            else st[x,y]:=0;        // Рисуется  контур стакана и обнуляется стакан
end;  //  Конец процедуры очистки* стакана

//  Процедура рисовать весь стакан
procedure risvesst;
begin
for x:=1 to 12 do  for y:=1 to 22 do
    begin
    ss:=st[x,y];
    k(x,y)                            // Вызов процедуры k(x,y) - рисует в определенной координате текстового экрана поклеточно кусок фигуры, кусок забора стакана
    end;
end; //  Конец процедуры рисовать весь стакан

//  Поцедура контроля и передвижения фигур с помощью клавиатуры
//  !!! Если клавиши не реагируют, пользователь должен перевести клавиатуры в английскую раскладку!!!
procedure dvig;
var
i:integer;
key:char;
begin
for i:=1 to 10 do
   begin
delay(d);     // Задержка на основе данных из переменной d
key:=' ';
if keypressed then key:=readkey;
if key='a' then                              // Если нажата клавиша a, то влево     <=== [a]
begin
fig(x-1,y,nn,3);
if pus=0 then begin fig(x,y,nn,0); x:=x-1; fig(x,y,nn,1);
end;
end;
if key='d' then                              // Если нажата клавиша d, то вправо    ===> [d]
begin
fig(x+1,y,nn,3);
if pus=0 then begin fig(x,y,nn,0); x:=x+1; fig(x,y,nn,1);
end;
end;
if key='w' then                              // Если нажата клавиша w, то поворот фигуры  =[w]=
begin
pov; fig(x,y,nn,3); pov;pov;pov;
if pus=0 then begin fig(x,y,nn,0); pov; fig(x,y,nn,1);
end;
end;
if key='s' then d:=1;                        // Если нажата клавиша s, то фигура летит вниз =[s]=
end;
end; // Конец процедуры контроля и передвижения фигур с помощью клавиатуры

//  Процедура создания новой текущей и следующей фигуры
procedure newfigure;
begin
//  gotoxy(62,20); writeln('          ');                                        //отладка
//  gotoxy(62,20); writeln('CounterFigure ', CounterFigure);                     //отладка
//gotoxy(62,15); writeln('               ');                                     //отладка
//gotoxy(62,15); writeln('Текущая ', CurrFigure);                                //отладка

NextFigure:=randmas[CounterFigure+2]; // Определение следующей фигуры

CurrFigure:=randmas[CounterFigure+1]; // Определение текущей фигуры

gotoxy(55,10); writeln('               ');  //  Стирание строки
gotoxy(55,10); writeln('Очки: ', Score);    //  Очки за успехи в игре

//gotoxy(55,3); writeln('             '); // Пробелы. Отладка
gotoxy(55,3); writeln('Следующая ');    // Информация о следующей фигуре
                      gotoxy(56,4); writeln('               ');      // Пробелы, по 15 штук, для стирания следов показа следующей фигуры предыдущего хода
                      gotoxy(56,5); writeln('               ');      //
                      gotoxy(56,6); writeln('               ');      //
                      gotoxy(56,7); writeln('               ');      //
                      gotoxy(56,8); writeln('               ');      //
                      gotoxy(56,9); writeln('               ');      //
                         fig(20,17,NextFigure,1); // Рисуется фигура, которая будет выпадать следующей 20=x координата , 17=y координата, NextFigure=nn значение, 1=[] из какого элемента рисуется фигура
nn:=CurrFigure;  // Рисуется текущая фигура, определенная в переменной CurrFigure
end; // Конец процедуры создания новой текущей и следующей фигуры

//  СТАРТ ГЛАВНОЙ ПРОГРАММЫ

begin

// Показ стартовой заставки!
HideCursor; // Скрыть курсор. Чтобы вклюсить обратно, нужен оператор ShowCursor;
TextBackground(Blue);                        // Установить черный цвет фона
ClrScr;                                       // Очистить экран
TextColor(White);                             // Установить белый цвет букв
TextBackGround(Blue);                         // Установить синий цвет фона для букв
GotoXY(22,12);                                // Поставить курсор
write('Это версия Тетриса на Паскале ABC!');  // Вывести текст
GotoXY(8,14); writeln('Выбери английскую раскладку на клавиатуре и нажми на любую клавишу!');  // Вывести текст
TextColor(White);
GotoXY(15,5);  writeln('[][][] [][][] [][][] [][][] []     [] [][][]');
GotoXY(15,6);  writeln('  []   []       []   []  [] []   [][] []    ');
GotoXY(15,7);  writeln('  []   [][][]   []   [][][] []  [] [] []    ');
GotoXY(15,8);  writeln('  []   []       []   []     [] []  [] []    ');
GotoXY(15,9);  writeln('  []   [][][]   []   []     [][]   [] [][][]');

GotoXY(39,3);TextBackGround(Red);   write('(c) Алексей Пажитнов');
GotoXY(22,19);TextBackGround(Red);  write('Александр Титов, Екатеринбург, 2019');
TextBackground(Blue); TextBackGround(Blue); TextColor(White);

ReadKey;                                      // Ожидать нажатия любой клавиши !!!}

// Конец показа стартовой заставки!

randomize; // Включение генератора случайных чисел
  for i:=1 to 999999 do randmas[i]:=(1+ random(18));  //Создание случайной последовательности почти бесконечной, для определения текущей и следующей фигуры

TextBackground(Blue); TextBackGround(Blue); TextColor(White);
clrscr;    //Очистить экран от следов начальной заставки

textcolor(DarkGray);                   // Нижняя текстовая строка  по середине
gotoxy(1,25);
Write(' Привет мир любителей оригинальной игры Тетрис (Алексей Пажитнов, 1984, СССР),  спасибо создателю языка программирования Паскаль (Никлаус Вирт, 1970, Швейцария) от программистов на Pascal ABC (Титов Александр, 2019, Россия, Екатеринбург)!');
TextColor(White);

textcolor(Yellow);                      // Левая верхняя строка, подсказывающая "как играть?"
gotoxy(01,10);
Writeln(' Как играть?');
Writeln('');
Writeln('  <a> влево'</a><a>);
Writeln('  <d> вправо'</d>);
Writeln('  <s> сбросить вниз'</s><s>);
Writeln('  <w> поворот фигуры'</w>);
TextColor(White);                      // Конец левой верхней строка

textcolor(Green);                       // Правая верхняя строка с названием игры  =TETЯIS=Pascal=ABC=2019=
gotoxy(52,01);
Writeln('=TETЯIS=Pascal=ABC=2019=');
TextColor(White);                      // Конец верхней правой строки

clrst;       // Процедура обнуления стакана
risvesst;   // Процедура рисования стакана
lin:=0;     // Установить ноль для счетчика линий, который влияет на скорость игры, т.к. содержится в переменной d
Score:=0;    // Установить ноль очков для старта новой игры

repeat      // Начать повторение основного цикла игры! До тех пор, пока есть пустое место на поле для передвижения и появления новых фигур

  newfigure;             // Тут станет известно какая фигура будет следующей и текущей
  x:=6;y:=21;            // Здесь появляется новая фигура! Обрати внимание на x=6 b y=20 это координаты появления новой фигуры
  fig(x,y,nn,3);         // d влияет на скорость игры (задержка по умолчанию стоял   d:=70-(lin*5);
  d:=80-(lin*3);         // когда d 170 - это очень медленно, когда он 10 - то быстровато!

  if pus=0 then         // Если клетка пустая и нет столкновения со стаканом и уложенными ранее в стакан кирпичиками,
   begin                // то
    repeat              // повторять до столкновения
     fig(x,y,nn,1);     // Рисуется текущая фигура до движения, 1=[] из какого элемента рисуется фигура
     dvig;              // Вызвать процедуру движения фигуры с определением нажатой клавиши
   fig(x,y-1,nn,3);     // Нарисовать фигуру со смещением по оси Y при условии ss=3 и Индекс массива не пустое место (граница стакана или граница фигур), то присвоить pus=1 и остановить падение фигуры вниз за один элемент до границы стакана
     if pus=0 then begin fig(x,y,nn,0); y:=y-1; end;  //Рисуется фигура из элементов пустого поля стаканов '. '
    until pus=1;         // Столкновение произошло

  fig(x,y,nn,4);         // !!!!! Нарисовать текущую фигуру, которая не может двигаться и записать её положение в массив элеменов стакана st[]

  CounterFigure:=CounterFigure+1; // Счетчик фигур для отладки
  Score:=Score+100;               // Прибавить 100 очков к счету за касание фигуры с полом

    for y:=22 downto 2 do   // Проверка заполненных рядов
     begin                  // Начало проверки заполненных рядов
      a:=0; for x:=2 to 11 do a:=a+st[x,y];  // Счетчик заполненных фигур, проверяет наличие клетки фигуры в массиве и увеличивается на 1, если там есть элемент фигуры
      if a=10 then                  // Если сумма клеток равна 10, то значит ряд заполнился, его нужно удалить, массив элементов стакана сдвинуть вниз
       begin         // Начало сдвига массива
        for b:=y to 21 do for c:=2 to 11 do st[c,b]:=st[c,b+1]; // Сдвиг массива вниз
        lin:=lin+1;              // Суммировать полностью заполненные линии и увеличть скорость игры
        gotoxy(55,12); writeln('Линии: ',lin); // Показать количество полностью заполненных линий
        Score:=Score+1000;       // Прибавить 1000 очков к счету за полную линию!
       end;         // Конец сдвига массива
     end;            //Конец проверки заполненных рядов
     
   risvesst; // Процедура рисования элементов всего стакана
   pus:=0;
   end;
   
  until pus=1; // Остановить повторение основного игрового цикла! Т.к. нет пустово места.

0

5

тетрис 9 килобайтний

Uses Crt, Graph;

Type Matriz = Array [0..21, 0..11] Of Integer;
Type Tipopeca = Array [0..3, 0..3] Of Integer;

Var Matela, Mat1Tela, Mat2Tela, Cima : Matriz;
  Next, Pecai, Pecal, Pecaf, Pecat,
  Pecao, Pecas, Peca2, Peca, Pecagira : Tipopeca;
  Prox, Aux, A, B, C, I, J, Num, Cont, Lin, Speed,
  Lines, Nivel, Graphdriver, Graphmode, Con, Bant, Numnex : Integer;
  Fim, Turn, Game, Dir, Esq, Giro, Novapeca : Boolean;
  Tecla : Char;
  Strin : String [6];
  Q : String;
  Ponto, Old : LongInt;

Procedure Botao (Col, Lin, Col1, Lin1: Integer);
Begin
  SetFillStyle (1, 7); Bar (Col, Lin, Col1, Lin1);
  SetColor (15); SetLineStyle (0, 1, 1);
  Line (Col, Lin, Col1, Lin); Line (Col, Lin, Col, Lin1);
  Line (Col, Lin+ 1, Col1, Lin+ 1); Line (Col+ 1, Lin, Col+ 1, Lin1);
  Line (Col, Lin+ 2, Col1, Lin+ 2); Line (Col+ 2, Lin, Col+ 2, Lin1);
  SetColor (8);
  Line (Col, Lin1, Col1, Lin1); Line (Col+ 1, Lin1- 1, Col1, Lin1- 1);
  Line (Col+ 2, Lin1- 2, Col1, Lin1- 2); Line (Col1, Lin, Col1, Lin1);
  Line (Col1- 1, Lin+ 1, Col1- 1, Lin1); Line (Col1- 2, Lin+ 2, Col1- 2, Lin1);
  SetColor (7);
  Line (Col, Lin, Col+ 2, Lin+ 2); Line (Col1, Lin1, Col1- 2, Lin1- 2);
End;

Procedure Destela;
Begin
  If Old<> Ponto Then Begin
    Old:= Ponto;
    Bar (1, 1, 100, 98);
    SetColor (White);
    OutTextXY (520, 85, 'Next');
    Str (Ponto, Strin); OutTextXY (5, 10, 'Score:'+ Strin);
    Str (Lines, Strin); OutTextXY (5, 30, 'Lines:'+ Strin);
    Str (Nivel, Strin); OutTextXY (5, 50, 'Level:'+ Strin);
    OutTextXY (5, 70, 'from bpascal.ru');
  End;
  For I:= 1 To 20 Do
    For J:= 1 To 10 Do Begin
      If Matela [I, J] = 0 Then Begin
        SetFillStyle (1, Black);
        Bar ( (J- 1) * 20+ 215, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 215, (I- 1) * 20+ 19+ 25);
      End
      Else If Matela [I, J] <> Mat2Tela [I, J] Then Begin
        Botao ( (J- 1) * 20+ 215, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 215, (I- 1) * 20+ 19+ 25);
      End;
    End;
End;

Procedure Desnext;
Begin
  For I:= 0 To 3 Do
    For J:= 0 To 3 Do Begin
      If Next [I, J] = 0 Then Begin
        SetFillStyle (1, Black);
        Bar ( (J- 1) * 20+ 515, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 515, (I- 1) * 20+ 19+ 25);
      End
      Else Begin
        Botao ( (J- 1) * 20+ 515, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 515, (I- 1) * 20+ 19+ 25);
      End;
    End;
End;

Procedure Sorteia;
Begin
  Numnex:= Random (7);
  If Numnex= 0 Then Next:= Pecal
  Else If Numnex= 1 Then Next:= Pecaf
  Else If Numnex= 2 Then Next:= Pecai
  Else If Numnex= 3 Then Next:= Pecao
  Else If Numnex= 4 Then Next:= Pecas
  Else If Numnex= 5 Then Next:= Peca2
  Else If Numnex= 6 Then Next:= Pecat;
End;

Procedure Verlinha;
Begin
  Aux:= Lines;
  For A:= 1 To 4 Do
    For I:= 20 Downto 1 Do Begin
      Cont:= 0;
      For J:= 1 To 10 Do If Matela [I, J] = 1 Then Cont:= Cont+ 1;
      If Cont= 10 Then Begin
        For J:= 1 To 10 Do Begin
          Matela [I, J] := 0;
        End;
        Inc (Lines, 1);
        For Lin:= 1 To (I- 1) Do
          For J:= 1 To 10 Do Begin
            Cima [Lin, J] := Matela [Lin, J];
            Matela [Lin, J] := 0;
          End;
        For Lin:= 2 To I Do
          For J:= 1 To 10 Do
            Matela [Lin, J] := Cima [Lin- 1, J];
      End;
    End;
  Ponto:= Ponto+ ( (Lines- Aux) * (Lines- Aux) * 100);
End;

Procedure Verifica;
Begin
  If KeyPressed Then Begin
    Tecla:= ReadKey;
    If Ord (Tecla) = 077 Then Begin
      If Dir= True Then Begin
        Inc (C, 1);
        Inc (Con, 1);
        If Con< 4 Then Dec (B, 1);
        If Con>= 4 Then Begin
          Con:= 0;
          Dec (C, 1);
        End;
      End;
    End
    Else If Ord (Tecla) = 075 Then Begin
      If Esq= True Then Begin
        Dec (C, 1);
        Inc (Con, 1);
        If Con< 4 Then Dec (B, 1);
        If Con>= 4 Then Begin
          Con:= 0;
          Inc (C, 1);
        End;
      End;
    End
      Else If Ord (Tecla) = 072 Then Begin
        If Giro= True Then Begin
          Inc (Con, 1);
          If Con< 2 Then Dec (B, 1);
          If Con>= 2 Then Con:= 0;
          Pecagira:= Peca;
          If (Num= 0) Or (Num= 1) Or (Num= 6) Then Begin
            For I:= 1 To 3 Do Begin
              Peca [3, I] := Pecagira [I, 1];
              Peca [2, I] := Pecagira [I, 2];
              Peca [1, I] := Pecagira [I, 3];
            End;
          End
          Else If (Num= 4) Or (Num= 5) Then Begin
            If Turn= True Then Begin
              For I:= 0 To 3 Do Begin
                Peca [3, I] := Pecagira [I, 0];
                Peca [2, I] := Pecagira [I, 1];
                Peca [1, I] := Pecagira [I, 2];
                Peca [0, I] := Pecagira [I, 3];
                Turn:= False;
              End;
            End
            Else If Turn= False Then Begin
              If Num= 4 Then Peca:= Pecas;
              If Num= 5 Then Peca:= Peca2;
              Turn:= True;
            End;
          End
            Else If Num= 2 Then Begin
              For I:= 0 To 3 Do
                For J:= 0 To 3 Do
                  Peca [I, J] := Pecagira [J, I];
            End;
        End;
      End
        Else If Ord (Tecla) = 080 Then Speed:= 0;
  End;
End;

Begin
  DetectGraph (Graphdriver, Graphmode);
  InitGraph (Graphdriver, Graphmode, ''); {The path of your BGI driver goes here
                                           or your BGI must be in the current dir}
  Randomize;
  For I:= 0 To 3 Do
    For J:= 0 To 3 Do Begin
      Pecai [I, J] := 0;
      Pecao [I, J] := 0;
      Pecal [I, J] := 0;
      Pecaf [I, J] := 0;
      Pecat [I, J] := 0;
      Pecas [I, J] := 0;
      Peca2 [I, J] := 0;
    End;
  For I:= 0 To 3 Do Pecai [2, I] := 1;
  For I:= 1 To 3 Do Pecal [2, I] := 1;
  Pecal [1, 3] := 1;
  For I:= 1 To 3 Do Pecaf [2, I] := 1;
  Pecaf [1, 1] := 1;
  For I:= 0 To 1 Do Pecas [I, 1] := 1;
  For I:= 1 To 2 Do Pecas [I, 2] := 1;
  For I:= 0 To 1 Do Peca2 [I, 2] := 1;
  For I:= 1 To 2 Do Peca2 [I, 1] := 1;
  For I:= 1 To 3 Do Pecat [2, I] := 1;
  Pecat [1, 2] := 1;
  For I:= 1 To 2 Do Pecao [1, I] := 1;
  For I:= 1 To 2 Do Pecao [2, I] := 1;
  Sorteia;
  Old:= 0;
  Con:= 0;
  Ponto:= 0;
  Lines:= 0;
  Tecla:= '0';
  For I:= 1 To 20 Do
    For J:= 1 To 10 Do Matela [I, J] := 0;
  For I:= 1 To 21 Do Matela [I, 0] := 1;
  For I:= 1 To 21 Do Matela [I, 11] := 1;
  For J:= 0 To 11 Do Matela [21, J] := 1;
  SetBkColor (Black);
  SetColor (White);
  Line (214, 25, 214, 425);
  Line (415, 25, 415, 425);
  Line (215, 425, 414, 425);
  Fim:= False;
  Game:= True;
  Repeat
    Speed:= 100;
    Nivel:= 1;
    Inc (Ponto, 10);
    Speed:= Speed- ( (Ponto Div 400) * 10);
    Nivel:= Nivel+ (Ponto Div 4000);
    Novapeca:= False;
    Peca:= Next;
    Num:= Numnex;
    Sorteia;
    Turn:= True;
    C:= 4;
    B:= 0;
    Desnext;
    Repeat
      Verifica;
      Verifica;
      If B= Bant+ 1 Then Con:= 0;
      Esq:= True;
      Dir:= True;
      Giro:= True;
      Mat2Tela:= Matela;
      Verlinha;
      Mat1Tela:= Matela;
      For I:= 0 To 2 Do
        For J:= 0 To 2 Do Begin
          If (Num= 4) Or (Num= 5) Then
            If Matela [I+ B, J+ C] = 1 Then Giro:= False;
        End;
      For I:= 1 To 3 Do
        For J:= 1 To 3 Do Begin
          If (Num= 6) Or (Num= 0) Or (Num= 1) Then
            If Matela [I+ B, J+ C] = 1 Then Giro:= False;
        End;
      For I:= 0 To 3 Do
        For J:= 0 To 3 Do
          If Novapeca= False Then Begin
            If Num= 3 Then Giro:= False;
            If Num= 2 Then
              If Matela [I+ B, J+ C] = 1 Then Giro:= False;
            If Matela [I+ B, J+ C] <> 1 Then
            Begin
              Matela [I+ B, J+ C] := Peca [I, J];
              If (Matela [I+ B, J+ C+ 1] ) + (Peca [I, J] ) = 2 Then Dir:= False;
              If (Mat1Tela [I+ B, J+ C- 1] ) + (Peca [I, J] ) = 2 Then Esq:= False;
              If (Matela [I+ B+ 1, J+ C] ) + (Peca [I, J] ) = 2 Then
              Begin
                For I:= 0 To 3 Do
                  For J:= 0 To 3 Do
                    If Matela [I+ B, J+ C] <> 1 Then
                    Begin
                      Matela [I+ B, J+ C] := Peca [I, J];
                    End;
                Destela;
                Novapeca:= True;
              End;
            End;
          End;
      If Novapeca= False Then Begin
        Destela;
        For I:= 0 To 3 Do
          For J:= 0 To 3 Do
            If Mat1Tela [I+ B, J+ C] <> 1 Then
              Matela [I+ B, J+ C] := 0;
        Delay (Speed+50000);
        Bant:= B;
        Inc (B, 1);
      End;
      If KeyPressed Then Tecla:= ReadKey;
      If Ord (Tecla) = 027 Then Fim:= True;
    Until (Novapeca= True) Or (Fim= True);
    For J:= 4 To 6 Do If Matela [1, J] = 1 Then Game:= False;
  Until (Game= False) Or (Fim= True);
  CloseGraph;
  ClrScr;
End.

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » EnotVM » Тестовый форум » Тетрис