Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с графикой.doc
Скачиваний:
6
Добавлен:
04.12.2018
Размер:
305.66 Кб
Скачать

Обработка событий. Создание игры.

Изменим сделанную программу на примитивную игру. На нарисованном шахматном поле спрячем клады разной стоимости. Игрок может открыть клад, щелкнув мышью по клетке. Накопившаяся стоимость отражается на форме.

Пояснение к тексту программы

Изменяемые в программе строки

  1. Для того чтобы задать клады в программе потребуется завести двумерный массив целых чисел. Этот массив должен быть доступен всем процедурам программы, поэтому описать его необходимо в разделе var программы.

var

Form1: TForm1;

d: integer=30; {задаем размер клетки}

Klads: array [1..3, 1..5] of integer;

Implementation

  1. Добавим на форму кнопку Начать игру и метки для информации по текущему состоянию игры LCount – количество открытых мин и LSum – сумма найденного клада. Добавленные кнопки будут прописаны оболочкой в разделе описания класса TForm1 автоматически.

  2. Создадим процедуру для начального размещения кладов на поле игры. Назовем процедуру StartKlads. Эта процедура должна быть доступна при работе формы, поэтому добавим заголовок процедуры в раздел описания класса TForm1.

type

TForm1 = class(TForm)

PBox1: TPaintBox;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

LCount: TLabel;

LSum: TLabel;

procedure PBox1Paint(Sender: TObject);

procedure StartKlads; {Эта строка вписана вручную}

  1. Процедура размещения кладов на поле игры. В этой процедуре потребуется три переменных i – отвечает за номер обрабатываемой строки, j – отвечает за номер обрабатываемого столбца, t – отвечает за номер выставляемого клада.

  • Для начала зададим каждому элементу массива Klads нулевые значения.

  • Затем разместим на поле 7 кладов.

  • Цикл Repeat необходим для того, чтобы не поставить клад в клетку с кладом.

  • Изменим свойство Caption у меток LCount и LSum на '0', т.к. после расстановки кладов количество открытых и сумма кладов равны 0.

implementation

{$R *.dfm}

procedure TForm1.StartKlads;

var t, i, j: integer;

begin

randomize;

for i:=1 to 3 do {зададим нулевые значения}

for j:=1 to 5 do Klads[i, j]:=0;

for t:=1 to 7 do {размещаем 7 кладов}

begin

Repeat

i:=random(3) + 1;

j:=random(5) + 1;

until klads[i,j]=0;

klads[ i, j ]:=random(100)+1; {сумма клада в клетке}

end;

LCount.Caption:='0';

LSum.Caption:='0';

end;

  1. Процедуру StartKlads надо вызывать в начальный момент, т.е. при создании формы. Для этого создадим процедуру обработки события OnCreate. Тело этой процедуры будет содержать всего одну строку – обращение к процедуре StartKlads., но StartKlads выполняется не только при создании формы, но и при нажатии клавиши Начать игру – объект Button1.

procedure TForm1.FormCreate(Sender: TObject);

begin

StartKlads;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

StartKlads;

end;

  1. Добавим в программу возможность определения координат мыши при продвижении по PBox1. Для этого опишем в программе переменные XMouse и YMouse. Эти переменные должны быть доступны процедурам, поэтому опишем их в разделе Var программы.

var

Form1: TForm1;

d: integer=30;

Klads: array [1..3, 1..5] of integer;

XMouse, YMouse: integer;

  1. Создадим процедуру обрабатывающую событие перемещения указателя мыши над объектом PBox1. Запомним считанные с указателя мыши значения x и y в переменные XMouse и YMouse.

procedure TForm1.PBox1MouseMove

(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

XMouse:=x;

YMouse:=y;

end;

  1. Щелчок (событие OnClick) по объекту PBox1 должен приводить к изменению объектов LCount и LSum. Так как i – номер строки, то высчитаем значение его из координаты XMouse, а j – высчитывается из координаты YMouse. Напомним, что d – размер одной клетки. Целочисленным делением на d определяем сколько целых клеток до указателя мыши (слева/сверху) и прибавляем 1, т.к. номер клетки (слева/сверху) на 1 больше. В переменные Count и Sum занесем численные значения LCount.Caption и LSum.Caption. Функция StrToInt выполняет преобразование строкового значения в целое. (А Функция Int To Strвыполняет обратное преобразование.) Если в клетке определяемой переменными i и j имеется клад (klads[ i, j] > 0) увеличим значение Count на 1 и Sum на величину клада. После этого надо изменить значение klads[i,j] на 0, иначе с этой клетки можно брать клад бесконечно.

procedure TForm1.PBox1Click(Sender: TObject);

var i, j, Count, Sum:integer;

begin

i:=YMouse div d + 1;

j:=XMouse div d + 1;

Count:= StrToInt(LCount.Caption)

Sum:= StrToInt(LSum.Caption)

if klads[ i, j] > 0 then

begin

LCount.Caption:=IntToStr(Count+ 1);

LSum.Caption:=IntToStr(Sum+ klads[i,j]);

klads[i,j]:=0;

end;

end;

Можно добавить в игру объект Timer и обработку события OnTimer , так чтобы надо было найти все клады за ограниченное время. Или дописать штрафные очки, если по клетке щелкнули повторно.