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