Skip to Content

Игра

Игра

Во время игры программа воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает клетки или ставит в клетки флажки.

Основную работу выполняет процедура обработки события onMouseDown (ее текст приведен в листинге 15.6). Сначала процедура преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем делает необходимые изменения в массиве Pole и, если нажата правая кнопка, рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, на экран выводится ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается процедура showPole, которая показывает все мины, в том числе и те, которые игрок не успел найти.

Листинг 15.6. Обработка события OnMouseDown на поверхности игрового поля

// нажатие кнопки мыши на игровом поле

  1. procedure TForm1.Form1MouseDown(Sender: TObject;
  2. Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
  3. var
  4.  
  5. row, col : integer;
  6.  
  7. begin
  8.  
  9. if status = 2 then// игра завершена
  10. exit;
  11.  
  12. if status = 0 then // первый щелчок
  13. status := 1;
  14.  
  15. // преобразуем координаты мыши в индексы
  16. // клетки поля
  17.  
  18. row := Trunc(y/H) + 1;
  19. col := Trunc(x/W) + 1;
  20.  
  21. if Button = mbLeft then
  22. begin
  23.  
  24. if Pole[row,col] = 9 then
  25. begin // открыта клетка, в которой есть мина
  26.  
  27. Pole[row,col] := Pole[row,col] + 100;
  28. status := 2; // игра закончена
  29. ShowPole(Form1.Canvas, status);
  30.  
  31. end
  32. else
  33.  
  34. if Pole[row,col] < 9 then
  35. Open(row,col);
  36.  
  37. end
  38. else
  39.  
  40. if Button = mbRight then
  41.  
  42. if Pole[row,col] > 200 then
  43. begin
  44.  
  45. // уберем флаг и закроем клетку
  46.  
  47. nFlag := nFlag — 1;
  48. Pole[row,col] := Pole[row,col]-200;
  49.  
  50. // уберем флаг
  51.  
  52. x := (col-D* W + 1; у := (row-1)* H + 1;
  53. Canvas.Brush.Color := clLtGray;
  54. Canvas.Rectangle(x-1,y-1,x+W,y+H);
  55.  
  56. end
  57. else
  58.  
  59. begin // поставить в клетку флаг
  60.  
  61. nFlag := nFlag + 1;
  62.  
  63. if Pole[row,col] = 9 then
  64. nMin := nMin + 1;
  65.  
  66. Pole[row,col]:=Pole[row,col]+200;
  67.  
  68. // поставили флаг
  69.  
  70. if (nMin = NM) and (nFlag = NM) then
  71. begin
  72.  
  73. status := 2;
  74.  
  75. // игра закончена
  76.  
  77. ShowPole(Form1.Canvas, status);
  78.  
  79. end
  80.  
  81. else
  82. Kletka(Form1.Canvas, row, col, status);
  83.  
  84. end;
  85. end;



Delphi Для профессионалов &1   |    Delphi Для профессионалов &2   |    Delphi Для профессионалов &3   |    Иллюстрированный самоучитель &1   |    Иллюстрированный самоучитель &2