Программирование с C++ Builder



Игра



Во время игры программа воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает клетки или ставит в клетки флажки.

Основную работу выполняет функция обработки события OnMouseDown (ее текст приведен в листинге 10.6). Функция получает координаты точки формы, в которой игрок щелкнул кнопкой мыши, а также информацию о том, какая кнопка была нажата. Сначала функция преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем она вносит необходимые изменения в массив Pole и, если нажата правая кнопка, вызывает функцию Flag , которая рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, и на экране появляется ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается функция showPole , которая показывает все мины, в том числе и те, которые игрок не успел найти.

 Листинг 10.6. Обработка события OnMouseDown на поверхности игрового поля ;

// нажатие кнопки мыши на игровом поле
void _fastcall TForml::ForraMouseDown
(TObject*Sender,TMouseButton
Button,
TShiftState Shift, int x, int y)
-{
if ( status == 2) return;
if ( status == 0) status = 1;
x -= LEFT;
у -== TOP;
if (x > 0 && у > 0)
{
// преобразуем координаты мыши
// в индексы клетки поля
int row = y/H + 1;
int col = x/W + 1;
if (Button == mbLeft) {
if ( Pole[row][col] == 9) {
Pole[row][col] +=100; status -2;
  // игра закончена ShowPole(status); }
else if  ( Pole[row][col] < 9) {
Open(row,col); ShowPole(status); } }
else if (Button == mbRight) {
nFlag++;
if ( Pole[row][col] == 9)
nMin++;
Pole[row][col] += 200;  // поставили флаг
if (nMin == MM && nFlag = NM) {
status =2;  // игра закончена
ShowPole(status); }
else Kletka(row, col, status); } } }

Функция Flag (листинг 10.7) рисует флажок. Флажок (рис. 10.13) состоит из четырех примитивов: линии (древко), замкнутого контура (флаг) и ломаной линии (буква "М"). Функция Flag рисует флажок, используя метод базовой точки, т. е. координаты всех точек, определяющих положение элементов рисунка, отсчитываются от базовой точки.

Функция Mina (листинг 10.8) рисует мину. Мина (рис. 10.14) состоит из восьми примитивов: два прямоугольника и сектор образуют корпус мины, остальные элементы рисунка — линии ("усы" и полоски на корпусе).

Обеим функциям в качестве параметров передаются координаты базовой точки рисунка и указатель на объект, на поверхности которого надо рисовать.



Рис. 10.13. Флажок



Рис. 10.14. Мина


Листинг 10.7. Функция Flag рисует флажок

// рисует флаг
void _fastcall TForml::Flag(  int x,   int y)
{
TPoint p[4];
// координаты флажка и нижней точки древка
// точки флажка р[0].х=х+4;  р[0].у=у+4;
 р[1].х=х+30; р[1].у=у+12;
 
р[2].х=х+4;  р[2].у=у+20;
// установим цвет кисти и карандаша
Canvas->Brush->Color = clRed;
Canvas->Pen->Color = clRed;
// чтобы контур флажка был красный
Canvas->Polygon(р, 2);  // флажок
// древко
Canvas->Pen->Color = clBlack;
Canvas->MoveTo(p[0].x, p[0].у);
Canvas->LineTo(x+4,y+36);
TPoint m[5];         // буква М
m[0].x=x+8; m[0].y=y+14;
m[l].x=x+8; m[l].y=y+8;
m[2].x=x+10; m[2].y=y+10;
m[3].x=x+12;  m[3].y=y+8;
m[4].x=x+12;  m[4].y=y+14;
Canvas->Pen->Color = clWhite;
Canvas->Polyline(m,4};
Canvas->Pen->Color = clBlack; }

Листинг 10.8. Функция Mina рисует мину

// рисует мину
void __faatcall TForml::Mina(int x,   int y)
{
Canvas->Brush->Color = clGreen;
Canvas->Pen->Color = clBlack;
// корпус
Canvas->Rectangle(x+16,y+26,x+24,y+30);
Canvas->Rectangle(x+8,y+30,x+32,y+34) ;
Canvas->Pie(x+б,y+28,x+34,y+44,x+34,y+36,x+6,y+36);
// полоса на корпусе
Canvas->MoveTo(x+12,y+32);
Canvas->LineTo(x+28,y+32);
// основание
Canvas->MoveTo(x+8,y+36); 
Canvas->LineTo(x+32,y+36);
// вертикальный "ус"
Canvas->MoveTo(x+20,y+22);
Canvas->LineTo(x+20,y+26);
// боковые "усы"
Canvas->MoveTo(x+8, y+30);
Canvas->LineTo(x+6,y+28);
Canvas->MoveTo(х+32,y+30);
Canvas->LineTo(х+34, у+28); }

Назад Начало Вперед