Гра

Під час гри програма сприймає натискання кнопок миші і, відповідно до правил гри, відкриває клітини або ставить в клітини прапорці.
Основну роботу виконує процедура обробки події onMouseDown (її текст приведений в лістингу 15.6). Спочатку процедура перетворює координати точки, в якій гравець натиснув кнопку миші, в координати клітини ігрового поля. Потім робить необхідні зміни в масиві Pole і, якщо натиснута права кнопка, малює в клітці прапорець. якщо натиснута ліва кнопка в клітці, в якій немає міни, то ця клітина відкривається, на екран виводиться її вміст. Якщо натиснута ліва кнопка в клітці, в якій є міна, то викликається процедура showPole, яка показує всі міни, в тому числі і ті, які гравець не встиг знайти.

Лістинг 15.6. Обробка події OnMouseDown на поверхні ігрового поля // натискання кнопки миші на ігровому полі

procedure TForm1.Form1MouseDown (Sender: TObject;

Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

var
row, col: integer;

begin
if status = 2 // гра завершена

then exit;
if status = 0 then // перший клацання

status : = 1;
// перетворимо координати миші в індекси
// клітини поля
row : = Trunc (y / H) + 1;
col : = Trunc (x / W) + 1;
if Button = mbLeft then
begin
if Pole [row, col] = 9 then
begin // відкрита клітина, в якій є міна

Pole [row, col] : = Pole [row, col] + 100;

status : = 2; // гра закінчена

ShowPole (Form1.Canvas, status);

end else

if Pole [row, col] & lt; 9 then
Open (row, col);

end else
if Button = mbRight then
if Pole [row, col] > 200 then begin
// приберемо прапор і закриємо клітку

nFlag : = NFlag - 1;
Pole [row, col] : = Pole [row, col] -200;

// приберемо прапор

x : = (Col-D * W + 1; у: = (row-1) * H + 1;

Canvas.Brush.Color : = ClLtGray;

Canvas.Rectangle (x-1, y-1, x + W, y + H );

end else
begin // поставити в клітку прапор

nFlag : = NFlag + 1; if Pole [row, col] = 9
then nMin: = nMin + 1;
Pole [row, col]: = Pole [row, col] +200;

// поставили прапор

if (nMin = NM) and (nFlag = NM) then begin
status : = 2;

// гра закінчена

ShowPole (Form1.Canvas, status);

end
else Kletka (Form1.Canvas, row, col, status);

end;

end;