Advertisement
Guest User

Untitled

a guest
May 24th, 2018
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.50 KB | None | 0 0
  1. uses GraphABC;
  2. const
  3.   box = 50; // размер ребра прямоугольников
  4.   r = 20; // радиус шаров
  5.   w = 10; // кол-во клеток по ширине
  6.   h = 10; // кол-во клеток по высоте
  7.   k = 10;  // кол-во новых шаров генерируемых каждый новый ход
  8.   d = 6;  // кол-во шаров для удаления ряда
  9.   c = 3;// кол-во цветов
  10.  
  11. var
  12.   Xc, Yc, y0, x0, clStep: word;
  13.   count: integer;// количество незанятых элементов массива
  14.   score: uint64;
  15.   gameOver: boolean;
  16.   arr: array [1..h, 1..w] of integer; //матрица наших шаров
  17.   zer: array [1..h, 1..w] of integer;//матрица обнуления шаров
  18.  
  19. {***ПРОЦЕДУРА  ПРИВЕДЕНИЯ МАТРИЦЫ ОБНУЛЕНИЯ К  ЕДИНИЧНОМУ ВИДУ**}
  20. procedure Identity();
  21. begin
  22.   for var x := 1 to w do
  23.     for var y := 1 to h do
  24.       zer[y, x] := 1;
  25. end;
  26.  
  27. {***ПРОЦЕДУРА  ОБНУЛЕНИЯ МАТРИЦЫ ШАРОВ**}
  28. procedure null();
  29. begin
  30.   for var x := 1 to w do
  31.     for var y := 1 to h do
  32.       arr[y, x] := 0;
  33. end;
  34.  
  35. {***ПРОЦЕДУРА ОБРАБОТКИ НАЖАТИЯ КЛAВИШИ ПОСЛЕ ПРОИГРЫША**}
  36. procedure repeat_game(key: integer);
  37. begin
  38.   gameOver := false;
  39. end;
  40.  
  41. {***ПРОЦЕДУРА ОБРАБОТКИ НАЖАТИЯ КЛAВИШИ В ИГРЕ**}
  42. procedure keyDown(key: integer);
  43. begin
  44.   var sum: byte;
  45.  
  46.   for var i := 1 to k do
  47.   begin
  48.     var x: byte;
  49.     var y: byte;
  50.    
  51.     repeat
  52.       begin
  53.         x := random(1, w); // получаю случайное значение столбца массива
  54.         y := random(1, h); // получаю случайное значение строки массива
  55.       end;
  56.     until (arr[y, x] = 0) or (count <= 0); // перебираю случайные элементы массива до тех пор пока не найду пустой
  57.      
  58.     count -= 1; // уменьшаю количество свободных элементов массива
  59.     arr[y, x] := random(1, c); // присваиваю элементу случайный цвет
  60.       { установка цвета заливки, формулы содержания компонента цвета
  61.       выбраны совершенно случайно, какого-то математического смысла в них нет }
  62.     SetBrushColor(RGB(clStep * arr[y, x], 255 - clStep * arr[y, x], 127 - trunc(power(-1, arr[y, x]) * clStep * arr[y, x] / 2)));
  63.     FillCircle(x0 + box * x - box div 2, y0 + box * y - box div 2, r); // рисую окружность
  64.   end;
  65.  
  66.   for var y := 1 to h do
  67.   begin
  68.     var val: byte := 1; //счетчик одинаковых шаров
  69.     for var x := 2 to w do
  70.     begin
  71.       if (arr[y, x] = arr[y, x - 1]) and (arr[y, x] <> 0) then  // если цвет текущего шара равен цвету предыдущего и не равен нулю
  72.       begin
  73.         val += 1; //инкрементирую количество шаров одного цвета
  74.         if val >= d then  // если превысило предельное значение
  75.           for var i := 0 to val - 1  do
  76.             zer[y, x - i] := 0; // обнуляю позиции  шаров в матрице обнуления
  77.       end
  78.       else
  79.         val := 1;  
  80.     end;
  81.   end;
  82.  
  83.   for var x := 1 to w do
  84.   begin
  85.     var val: byte := 1; //счетчик одинаковых шаров
  86.     for var y := 2 to h do
  87.     begin
  88.       if (arr[y, x] = arr[y - 1, x]) and (arr[y, x] <> 0) then  // если цвет текущего шара равен цвету предыдущего
  89.       begin
  90.         val += 1; //инкрементирую количество шаров одного цвета
  91.         if val >= d then  // если превысило предельное значение
  92.           for var i := 0 to val - 1  do
  93.             zer[y - i, x] := 0; // обнуляю позиции  шаров в матрице обнуления
  94.       end
  95.       else
  96.         val := 1;        
  97.     end;
  98.   end;
  99.  
  100.   for var y := 1 to h do
  101.     for var x := 1 to w do
  102.       arr[y, x] *= zer[y, x]; //умнажаю нашу матрицу на матрицу обнуления;
  103.  
  104.   SetBrushColor(ClWhite);
  105.  
  106.   for var y := 1 to h do
  107.     for var x := 1 to w do
  108.       if zer[y, x] = 0 then
  109.       begin
  110.         Rectangle(x0 + box * (x - 1), y0 + box * (y - 1), x0 + x * box, y0 + y * box );
  111.         sum += 1;
  112.       end;
  113.  
  114.   count := count + sum;
  115.   score += sum;
  116.   Identity();  // привожу обратно к единичному виду
  117.   sum := 0;
  118. end;
  119.  
  120. begin
  121.   SetFontSize(20);
  122.   clStep := 255 div c;
  123.   window.Height := 700;  // устанавливаю высоту окна
  124.   window.Width := 700;  // устанавливаю ширину окна
  125.   //координаты центра
  126.   Xc := window.Width div 2; //центр по х
  127.   Yc := window.Height div 2; //центр по у
  128.  
  129.   //координаты  левого верхнего угла нащего поля
  130.   x0 := Xc - (box * w) div 2;
  131.   y0 := Yc - (box * h) div 2;
  132.  
  133.   {***БЕСКОНЕЧНЫЙ ЦИКЛ ИГРЫ**}
  134.   while true do
  135.   begin
  136.     //Блок инициализации каждой новой игры
  137.     clearWindow();
  138.     SetFontColor(ClRed);
  139.     OnKeyDown := keyDown; // назначаю обработчик события по нажатию кнопки
  140.     count := h * w;
  141.     null();
  142.     Identity();  // привожу  к единичному виду
  143.     score:=0;
  144.     gameOver:=true;
  145.    
  146.     // отрисовываю прямоугольники
  147.     for var y := 1 to h do
  148.       for var x := 1 to w do
  149.         DrawRectangle(x0 + box * (x - 1), y0 + box * (y - 1), x0 + x * box, y0 + y * box );  
  150.    
  151.     while count > 0 do;
  152.    
  153.     OnKeyDown := repeat_game; // назначаю обработчик события по нажатию кнопки
  154.     Window.Clear();
  155.     DrawTextCentered(Xc - 100, Yc - 100, Xc + 100, Yc + 100, 'YOU LOST!!!');
  156.     SetFontColor(ClBlack);
  157.     DrawTextCentered(Xc - 200, Yc - 60, Xc + 200, Yc + 140, 'YOUR SCORE:');
  158.     DrawTextCentered(Xc - 200, Yc - 20, Xc + 200, Yc + 180, score);  
  159.     OnKeyDown := repeat_game; // назначаю обработчик события по нажатию кнопки
  160.    
  161.     while gameOver do;
  162.  
  163.   end;
  164. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement