Во время игры программа
воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает
клетки или ставит в клетки флажки.
Основную работу выполняет
процедура обработки события 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;
Знаете ли Вы, как разрешается парадокс Ольберса? (Фотометрический парадокс, парадокс Ольберса - это один из парадоксов космологии, заключающийся в том, что во Вселенной, равномерно заполненной звёздами, яркость неба (в том числе ночного) должна быть примерно равна яркости солнечного диска. Это должно иметь место потому, что по любому направлению неба луч зрения рано или поздно упрется в поверхность звезды. Иными словами парадос Ольберса заключается в том, что если Вселенная бесконечна, то черного неба мы не увидим, так как излучение дальних звезд будет суммироваться с излучением ближних, и небо должно иметь среднюю температуру фотосфер звезд. При поглощении света межзвездным веществом, оно будет разогреваться до температуры звездных фотосфер и излучать также ярко, как звезды. Однако в дело вступает явление "усталости света", открытое Эдвином Хабблом, который показал, что чем дальше от нас расположена галактика, тем больше становится красным свет ее излучения, то есть фотоны как бы "устают", отдают свою энергию межзвездной среде. На очень больших расстояниях галактики видны только в радиодиапазоне, так как их свет вовсе потерял энергию идя через бескрайние просторы Вселенной. Подробнее читайте в FAQ по эфирной физике.