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