Во время игры программа
воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает
клетки или ставит в клетки флажки.
Основную работу выполняет
процедура обработки события 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;
Знаете ли Вы, что cогласно релятивистской мифологии "гравитационное линзирование - это физическое явление, связанное с отклонением лучей света в поле тяжести. Гравитационные линзы обясняют образование кратных изображений одного и того же астрономического объекта (квазаров, галактик), когда на луч зрения от источника к наблюдателю попадает другая галактика или скопление галактик (собственно линза). В некоторых изображениях происходит усиление яркости оригинального источника." (Релятивисты приводят примеры искажения изображений галактик в качестве подтверждения ОТО - воздействия гравитации на свет) При этом они забывают, что поле действия эффекта ОТО - это малые углы вблизи поверхности звезд, где на самом деле этот эффект не наблюдается (затменные двойные). Разница в шкалах явлений реального искажения изображений галактик и мифического отклонения вблизи звезд - 1011 раз. Приведу аналогию. Можно говорить о воздействии поверхностного натяжения на форму капель, но нельзя серьезно говорить о силе поверхностного натяжения, как о причине океанских приливов. Эфирная физика находит ответ на наблюдаемое явление искажения изображений галактик. Это результат нагрева эфира вблизи галактик, изменения его плотности и, следовательно, изменения скорости света на галактических расстояниях вследствие преломления света в эфире различной плотности. Подтверждением термической природы искажения изображений галактик является прямая связь этого искажения с радиоизлучением пространства, то есть эфира в этом месте, смещение спектра CMB (космическое микроволновое излучение) в данном направлении в высокочастотную область. Подробнее читайте в FAQ по эфирной физике.