Пример 2. Приложение-игра «Догонялки»




В основе игры лежит следующий принцип. Один из компонентов находящийся на форме может принимать случайные координаты, другой компонент должен быть перемещаем на форме в режиме runtime. Координаты двух выбранных изображений должны совпасть для подсчета очков или выполнения другого события. В визуальном программировании необходимо сравнить координаты, и для этого использовать свойства объектов, условные операторы разветвляющегося алгоритма, представлять объект как класс. Для разработки приложения могут быть использованы компонент Shape или Image.

Система координат формы и представление на них объектов =>

 

 

Из рисунка видно, что у формы как и у компонентов относительно родительского окна есть не только свои координаты, но и свой размер. Задача разработчика – в алгоритме программы описать возможные точки взаимодействия объектов в процедурах возможных событий, например при щелчке одним объектом на другом. Этот принцип взаимодействия заложен практически во всех играх. Давайте попробуем разобрать алгоритм взаимодействия объектов на естественном языке и увидим, что из этого получится, впоследствии написав программу. Дело в том, что для приложения можно использовать и компонент Shape. Вот на нем пока немного и остановимся. Что это за компонент, для чего он нужен, каково его предназначение? Фигура (Shape) располагается на панели "Additional". Он необходим для рисования одной из простейших геометрических фигур.

Конкретно какой геометрический объект будет определяется в свойстве Shape. Он определяется следующим множеством: stEllipse, stCircle, stRectangle, stRoundRect, stSquare, stRoundSquare, что определяет свойства фигуры как - эллипса, круга, прямоугольника, скругленный квадрат, квадрат, квадрат с скругленными углами. Выбор другого свойства ведет к мгновенной перерисовке объекта. Если задан круг или квадрат, а размеры фигуры по вертикали или горизонтали отличаются, то размер у объекта будет меньшим. Цвет фигуры задается с помощью кисти объекта (Brash). Границы фигуры задаются пером Pen

Приступим к разбору исходного текста приложения. Форма приложения видна на рисунке.

Игра "Догонялки Shape"

Правил игры. Одним квадратиком необходимо пересечь другой квадратик таким образом, чтобы они пересеклись в строгой точке заданной случайной координатой. Управление квадратиком производится стрелками вверх-вниз, влево-вправо на клавиатуре, а так же щелчком ЛКМ или перемещением фигуры с помощью удержания ЛКМ. Игра заканчивается или по истечении времени в M минут или после того как вы достигли N попаданий-догонялок.

 

 

Разбор исходного текста приложения. Комментарии к программе.

 

Var

Form1: TForm1;

k:integer; // переменная для подсчета количества набранных очков

f:boolean; // логическая переменная отвечающая за нажатие ЛКМ при перемещении Shape

x0,y0:integer; // координаты класса как Shape-объекта

 

implementation

 

uses Unit2;

 

{$R *.dfm}

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

randomize; // функция генерирования случайного значения

form1.Shape4.Left:=form1.Shape4.Left+random(100);

form1.Shape4.top:=form1.Shape4.top+random(100); // присваивание случайного значения к координатам компонента Shape (объекта который нужно поймать)

if shape4.Left > form1.ClientWidth then shape4.Left:=5;

if shape4.top > form1.ClientHeight then shape4.top:=5; // условие для проверки выхода компонента Shape за пределы формы Form. При выходе за пределы координаты присваиваются к точному значению в родительском окне, в данном случае на форме

 

if (shape3.Top+shape3.Height>shape4.top)and

(shape3.Top+shape3.Height<shape4.top+shape4.Height)

and (shape3.left>shape4.left) and

(shape3.left<shape4.left+shape4.Width) // сравнение координат двух объектов на условие их совпадения

then begin

inc(k); // если координаты совпали то увеличиваем на 1 количество очков

label1.caption:=inttostr(k); // выводим очки в режиме runtime в поле label

if k=2 then begin showmessage ('Победа'); // при достижении N очков завершаем работу программы с выводом сообщения о победе

close;

form2.close;

end;

end;

end;

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if key=(vk_left) then shape3.Left:=shape3.Left-20; // управление клавишей «влево» для изменения координат

if key=(vk_right) then shape3.Left:=shape3.Left+20;// управление клавишей «вправо» для изменения координат

if key=(vk_up) then shape3.Top:=shape3.Top-20; // управление клавишей «вверх» для изменения координат

if key=(vk_down) then shape3.Top:=shape3.Top+20; // управление клавишей «вниз» для изменения координат

 

if shape3.Left > form1.ClientWidth then shape3.Left:=5;

if shape3.Top > form1.ClientHeight then shape3.Top:=5; // условие для проверки выхода компонента Shape за пределы формы Form. При выходе за пределы координаты присваиваются к точному значению в родительском окне, в данном случае на форме

 

end;

 

procedure TForm1.Shape2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

 

const

sc_dragmove=$f012; // константа отвечающая за произвольное перемещение формы

begin

releasecapture;

form1.Perform(wm_syscommand,sc_dragmove,0); // перетаскивание окна приложения удерживанием мыши над компонентом описываемом в процедуре

begin

shape3.left:=X; // перемещает объект который «догоняет» на указанное место щелчком ЛКМ по оси top

shape3.top:=y; // перемещает объект который «догоняет» на указанное место щелчком ЛКМ по оси left

 

end;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

form2.close;

end;

 

procedure TForm1.Timer2Timer(Sender: TObject);

begin

label3.Caption:=inttostr(strtoint(label3.Caption)+1); // процедура отсчета времени по секундомеру

if label3.caption = inttostr(59) then label4.Caption:=inttostr(strtoint(label4.Caption)+1);

if label3.caption = inttostr(59) then label3.Caption:='0';

if label4.Caption='2' then begin showmessage ('Game Over');

close;form2.close;timer1.Enabled:=false;timer2.Enabled:=false; // по истечении M минут программа завершает работу с сообщением «Game Over»

end;

 

end;

 

procedure TForm1.Shape3MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if button<>mbLeft then f:=false else begin x0:=x; y0:=y; f:=true; end; // процедура проверки нажатия кнопки ЛКМ. При нажатой ЛКМ программа присваивает координаты объекта в переменные для класса

end;

 

procedure TForm1.Shape3MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if f then begin // нажатие ЛКМ и ее перемещение изменяет координаты объекта как класса с переменными присвоенными к координатам компонента в режиме runtime

(Sender as TShape).Left:=(Sender as TShape).Left+x-x0;

(Sender as TShape).Top:=(Sender as TShape).Left+y-y0;

end;

end;

 

procedure TForm1.Shape3MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

f:=false; // cобытие MouseUp (отпустить нажатие кнопки ЛКМ) завершает процесс перемещения объекта и изменения его координат присваиванием к переменной отвечающей за проверку нажатия на кнопке ЛКМ

end;

 

end.

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: