Во время игры программа
воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает
клетки или ставит в клетки флажки.
Основную работу выполняет
процедура обработки события 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] < 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;