Разработка игры "Воздушный бой"
Описание предметной области. Контроль и методы доступа. Работа с графикой в С++ Builder. Программирование игры "Воздушный бой" с использованием основных принципов объектно-ориентированного программирования. Принципы работы конструкторов и деструкторов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 31.05.2015 |
Размер файла | 901,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Федеральное агентство связи
Бурятский филиал
Государственного образовательного бюджетного учреждения
высшего профессионального образования
«СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ И ИНФОРМАТИКИ»
Факультет информационных технологий и экономики
Кафедра информатики и вычислительной техники
Разработка игры «Воздушный бой»
КУРСОВАЯ РАБОТА
Пояснительная записка
Руководитель/Эрдынеева Л.И./
Студент /Сапунов А.А. /
2013г
Размещено на http://www.allbest.ru
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1.Теоретическая часть
1.1 Описание предметной области
1.2 Особенности реализации
1.2.1 Описание класса
1.2.2 Описание объектов
1.3 Конструкторы и деструкторы
1.4 Работа с графикой в С++ Builder
2.Проектная часть
2.1 Постановка задачи
2.2 Разработка приложения
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЯ
Размещено на http://www.allbest.ru
ВВЕДЕНИЕ
Естественное стремление разработчиков программ - сократить время разработки, облегчить повторное использование отлаженных модулей и снизить издержки на сопровождение и модификацию программ.
Для достижения этих целей в отрасли создания программ комплексов используют методы и подходы управления процессом разработки. На разных этапах развития программной инженерии использовались различные технологии программирования - императивное программирование; модульное программирование; структурное программирование; программирование, управляемое данными; программирование, управляемое событиями; функциональное программирование; логическое программирование и т.п. Теперь невозможно принять участие в дискуссии, посвященной программированию, если не использовать термин «объектно-ориентированное программирование».
Объектно-ориентированное программирование -- это стиль кодирования, который позволяет разработчику группировать схожие задачи в классы. Таким образом, код соответствует принципу DRY (don't repeat yourself - не повторяй самого себя) и становится лёгким для сопровождения.
Цель данного курсового проекта написать игру, используя три принципа ООП.
1.ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.1 Описание предметной области
Объектно-ориентированное программирование (ООП) основано на трех концепциях:
Инкапсуляция
Наследование
Полиморфизм
В центре ООП находится понятие объекта. Объект - это абстрактная модель, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Объект - это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией. Инкапсуляция - это ограничение доступа к данным и их объединение с методами, обрабатывающими эти данные. Доступ к отдельным частям класса регулируется с помощью специальных ключевых слов: public(открытая часть), private(закрытая часть) и protected(защищенная часть). Наличие инкапсуляции достаточно для объектности языка программирования, но для его объектной ориентированности требуется наличие наследования. Наследование - механизм получения нового класса их существующего. Производный класс (наследник) создается путем дополнения или изменения существующего класса (класса-родителя). Методы, расположенные в открытой части, формируют интерфейс класса и могут свободно вызываться клиентом через соответствующий объект класса.
Основные преимущества ООП заключаются в том, что существует возможность объектов с одинаковой спецификацией иметь различную реализацию - полиморфизм.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект -- это экземпляр класса. При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа.
Прототип -- это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.
1.2 Особенности реализации
1.2.1 Описание класса
Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.
Данные класса называются полями, а функция класса - методами. Поля и методы являются элементами класса. Синтаксис имеет следующий вид:
class <имя>
{
private:
<описание скрытых элементов>
public:
<описание доступных элементов> };
Спецификаторы private и public управляют видимостью элементов класса. Всего таких спецификаторов три:
private (частный);
public (общедоступный);
protected (защищенный).
Как уже говорилось выше, в современных объектно-ориентированных языках программирования каждый объект является значением, относящимся к определённому классу. Класс представляет собой объявленный программистом составной тип данных, имеющий в составе:
Поля данных
Параметры объекта (конечно, не все, а только необходимые в программе), задающие его состояние (свойства объекта предметной области). Иногда поля данных объекта называют свойствами объекта, из-за чего возможна путаница. Физически поля представляют собой значения (переменные, константы), объявленные как принадлежащие классу.
Методы
Процедуры и функции, связанные с классом. Они определяют действия, которые можно выполнять над объектом такого типа, и которые сам объект может выполнять. Классы могут наследоваться друг от друга. Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными либо переопределять уже имеющиеся. Большинство языков программирования поддерживает только единичное наследование (класс может иметь только один класс-родитель), лишь в некоторых допускается множественное наследование -- порождение класса от двух или более классов-родителей. Множественное наследование создаёт целый ряд проблем, как логических, так и чисто реализационных, поэтому в полном объёме его поддержка не распространена. Вместо этого в 1990-е годы появилось и стало активно вводиться в объектно-ориентированные языки понятие интерфейса.
Интерфейс -- это класс без полей и без реализации, включающий только заголовки методов. Если некий класс наследует (или, как говорят, реализует) интерфейс, он должен реализовать все входящие в него методы. Использование интерфейсов предоставляет относительно дешёвую альтернативу множественному наследованию. Взаимодействие объектов в абсолютном большинстве случаев обеспечивается вызовом ими методов друг друга.
Контроль доступа
Поскольку методы класса могут быть как чисто внутренними, обеспечивающими логику функционирования объекта, так и внешними, с помощью которых взаимодействуют объекты, необходимо обеспечить скрытость первых при доступности извне вторых. Для этого в языки вводятся специальные синтаксические конструкции, явно задающие область видимости каждого члена класса. Традиционно это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные только из классов-потомков и скрытые, доступные только внутри класса. Конкретная номенклатура модификаторов и их точный смысл различаются в разных языках.
Методы доступа
Поля класса, в общем случае, не должны быть доступны извне, поскольку такой доступ позволил бы произвольным образом менять внутреннее состояние объектов. Поэтому поля обычно объявляются скрытыми (либо язык в принципе не позволяет обращаться к полям класса извне), а для доступа к находящимся в полях данным используются специальные методы, называемые методами доступа. Такие методы либо возвращают значение того или иного поля, либо производят запись в это поле нового значения. При записи метод доступа может проконтролировать допустимость записываемого значения и, при необходимости, произвести другие манипуляции с данными объекта, чтобы они остались корректными (внутренне согласованными). Методы доступа называют ещё аксессорами (от англ. Access -- доступ), а по отдельности -- геттерами (англ. Get -- чтение) и сеттерами (англ. Set -- запись).
Свойства объекта
Псевдополя, доступные для чтения и/или записи. Свойства внешне выглядят как поля и используются аналогично доступным полям (с некоторыми исключениями), однако фактически при обращении к ним происходит вызов методов доступа. Таким образом, свойства можно рассматривать как «умные» поля данных, сопровождающие доступ к внутренним данным объекта какими-либо дополнительными действиями (например, когда изменение координаты объекта сопровождается его перерисовкой на новом месте). Свойства, по сути -- не более чем синтаксический сахар, поскольку никаких новых возможностей они не добавляют, а лишь скрывают вызов методов доступа. Конкретная языковая реализация свойств может быть разной.
1.2.2 Описание объектов
Конкретные переменные типа «класс» называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам С++.
При создании объекта выделяется память, достаточная для хранения всех его полей и автоматически вызывается конструктор, выполняющий их инициализацию. При выходе объекта из области видимости он уничтожается, при этом автоматически вызывается деструктор.
Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используется операция «.» (точка) при обращении к элементу через имя объекта и операция «->» при обращении через указатель.
<переменная>.<имя члена класса>
<указатель> -> <имя члена класса>
1.3 Конструкторы и деструкторы
Конструктор предназначен для инициализации объекта вызывается автоматически при его создании. Ниже перечислены основные свойства конструкторов:
Конструктор не возвращает значение. Нельзя получить указатель на конструктор.
Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).
Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значение параметров по умолчанию. Их может содержать только один из конструкторов.
Если при написании программы не было указано ни одного конструктора, компилятор создает его автоматически.
Конструкторы не наследуются.
Конструкторы нельзя описывать с модификаторами const, virtual и static
Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действий. Конструктор запускается и при создании временного объекта (например, при передачи объекта из функции).
Деструктор - это особый вид метода, применяющийся для освобождения памяти, занимаемой объектом. Деструктор вызывается автоматически, когда объект выходит из области видимости:
Для локальных объектов - при выходе из блока, в котором они объявлены;
Для глобальных - как часть процедуры выхода из main;
Для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.
Имя деструктора начинается с тильды (), непосредственно за которой следует имя класса. Свойства деструктора:
не имеет аргументов и возвращаемого значения;
не может быть объявлен как const или stract;
не наследуется;
может быть виртуальным.
Если деструктор явным образом не определен, компилятор автоматически пустой деструктор.
1.4 Работа с графикой в С++ Builder
В C++ Builder для графических построений предусмотрены специальные компоненты. TCanvas(Канва) - класс, предназначенный для вывода и хранения графических объектов в C++ Builder. Канва входит в состав большинства визуальных компонентов, кроме большинства визуальных компонентов, кроме стандартных оконных контролов (TButton, TMemo, Tpanel и т.п.).
При помощи методов этого класса можно рисовать как и стандартные примитивы (линии, эллипсы, прямоугольники), так и графические объекты, типа Graphics::TBitmap.
Доступ к канве любого объекта происходит следующим образом:
имя_объекта->Canvas->Свойство/Метод;
Канва, в ее графическом представлении, это двумерный массив пикселей. Каждый элемент этого массива хранит в себе информацию о цвете. Доступ к отдельно взятому пикселю можно получить из свойства Pixels, подробнее о котором будет написано ниже.
Точка(0,0) - верхний левый угол канвы. Значение по х-координате возрастает слева направо от точки(0,0), а значение по у-координате сверху вниз.
2.ПРОЕКТНАЯ ЧАСТЬ
2.1 Постановка задачи
В качестве практического применения изученного материала необходимо реализовать задачу:
Запрограммировать игру с использованием основных принципов объектно-ориентированного программирования.
Курсовой проект должен содержать:
Главный модуль интерфейса программы;
Модуль программы, описывающий классы и методы;
Назовем разрабатываемую игру: Воздушный бой.
Целью игры будет:
Игрок контролирующему свой самолет необходимо уничтожить, двигающихся к нему на встречу, вражеские самолеты, ведя по ним дистанционный огонь. По мере прохождения скорость врагов будет увеличиваться. Уровень считается пройденным, если все вражеские самолеты были уничтожены. На одну игру дается три жизни, если враг сумел добраться до нас, то игрок теряет одну жизнь. При потере игроком всех жизней игра заканчивается. Основная задача игры - заработать как можно больше очков.
2.2 Разработка приложения
Класс TEnemy содержит открытые методы:
x,y - координаты объекта
int Color,State - цвет и положение объекта
int Maxtime - максимальное время
int time - время
Также имеется конструктор TEnemy(int tx,int ty), который устанавливает цвет и противников на поле в случайном порядке.
Класс TShip содержит открытые методы:
x,y - координаты объекта
int TimeToNextBullet - время до следующего выстрела
int Time - время
В нем также присутствует конструктор TShip(), который устанавливает задержку перед выстрелом, пока не пуля не долетит до объектов.
Метод Draw() класса TEnemy устанавливает на фоне картинки врагов по цвету и положению на поле:
void Draw()
{
BackScreen->Canvas->Draw(x,y, EnemyPic[State][Color]);
}
Методы Draw(), Draw1() класса TShip устанавливает цвет и ширин пуль, метод Draw3() устанавливает позицию корабля:
void Draw()
{
BackScreen->Canvas->Pen->Color=clYellow;
BackScreen->Canvas->Pen->Width=3;
BackScreen->Canvas->MoveTo(BulletPos.x,BulletPos.y+9);
BackScreen->Canvas->Pen->Style=psDot;
BackScreen->Canvas->LineTo(BulletPos.x,BulletPos.y+12);
}
void Draw1()
{
BackScreen->Canvas->Pen->Color=clYellow;
BackScreen->Canvas->Pen->Width=3;
BackScreen->Canvas->MoveTo(BulletPos1.x,BulletPos1.y+9);
BackScreen->Canvas->Pen->Style=psDot;
BackScreen->Canvas->LineTo(BulletPos1.x,BulletPos1.y+12);
}
void Draw3()
{
BackScreen->Canvas->Draw(x,y,Plane);
BackScreen->Canvas->MoveTo(BulletPos3.x,BulletPos3.y-100);
}
Метод Fire() класса TShip проверяет через сколько можно будет сделать следующий выстрел:
void Fire()
{
if(!Fired)
{
if(Time>TimeToNextBullet)
{
Fired=true;
Time=0;
}
}}
В процедуре __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) производится загрузка картинок из файла для вражеских самолетов и истребителя игрока, устанавливает ширину, длину, цвет и размер объектов. Задает начальную скорость вражеских самолетов, а также начальное количество жизней и очки игрока:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
randomize();
BackScreen=new Graphics::TBitmap();
BackScreen->Width =400;
BackScreen->Height=400;
BackScreen->Canvas->Font->Color=clYellow;
BackScreen->Canvas->Font->Size=15;
Enemy=new TList();
Plane=new Graphics::TBitmap();
Plane->LoadFromFile("Plane.bmp");
Graphics::TBitmap*Temp=new Graphics::TBitmap();
Temp->LoadFromFile("enemy.bmp");
for(int j=0;j<3;j++)
for(int i=0;i<2;i++)
{
EnemyPic[i][j]=new Graphics::TBitmap();
EnemyPic[i][j]->Width =30;
EnemyPic[i][j]->Height=30;
EnemyPic[i][j]->Canvas->CopyRect(Rect(0,0,30,30),
Temp->Canvas,Rect(i*30,j*30,i*30+30,j*30+30));
EnemyPic[i][j]->Transparent=true;
}
EnemySpeed=0;
Lifes=3;
Scores=0;
NewGame();
EnemyDirect=1;//Вправо
LEFT=false;RIGHT=false;
}
Функция void TForm1::NewGame() отвечает за переход на следующий уровень, увеличение скорости врага:
void TForm1::NewGame()
{
Enemy->Clear();
int x=5,y=5;
for(int j=0;j<4;j++)
{
for(int i=0;i<8;i++,x+=40)
{
TEnemy*temp=new TEnemy(x,y);
Enemy->Add((void*)temp);
}
x=5;
y+=30;
}
EnemySpeed+=0.5;
}
Основным элементом программы является игровое поле - где и будут отображаться все элементы программы. Зададим для него начальные основные параметры - размер и цвет, функция void TForm1::ClearBack().
void TForm1::ClearBack()
{
BackScreen->Canvas->Brush->Color=clAqua;
BackScreen->Canvas->FillRect(Rect(0,0,400,400));
}
Так же у нас имеются такие объекты как самолет игрока, вражеские самолеты и элементы пуль, описанные выше в классах TEnemy и TShip. Так как по задумке уничтоженные враги будут исчезать с поля боя, то следует сразу предусмотреть что и характер их движения с уменьшением количества будет изменен соответственно. Следовательно и их отображение должно меняться, DrawAllEnemy().
TForm1::DrawAllEnemy()
{
for(int i=0;i<Enemy->Count;i++)
{
TEnemy*temp=(TEnemy*)Enemy->Items[i];
temp->Draw();
}
return 0;
}
Для обозначения остальных объектов воспользуемся методами класса TShip. Теперь остается лишь отобразить наше поле боя с объявленными для него объектами, для этого напишем процедуру void __fastcall TForm1::FormPaint(TObject *Sender) разрисовывывающую поле боя.
void __fastcall TForm1::FormPaint(TObject *Sender)
{
ClearBack();
DrawAllEnemy();
Ship.Draw1();
Ship.Draw();
Ship.Draw3();
Flip();
}
После того как мы обозначили все наши объекты на поле поя необходимо их запрограммировать, начнем с вражеских самолетов, напишем процедуру, MoveEnemy() отвечающую за их передвижение:
bool __fastcall TForm1::MoveEnemy()
{
bool MustMoveDown=false;
TEnemy*temp;
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
if(EnemyDirect==1)
{
if((temp->x)>370)
{
EnemyDirect=2;
MustMoveDown=true;
}
}
if(EnemyDirect==2)
{
if((temp->x)<0)
{
EnemyDirect=1;
MustMoveDown=true;
}
}
}
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
temp->time++;
if(temp->time>temp->Maxtime)
{
temp->time=0;
if(temp->State==0)temp->State=1;else temp->State=0;
}
if(EnemyDirect==1)temp->x+=EnemySpeed;
if(EnemyDirect==2)temp->x-=EnemySpeed;
if(MustMoveDown)temp->y+=20;
if(temp->y>370)return false;
}
return true;
}
Чтобы наши объекты двигались необходимо привязать изменение параметров их координат и свойств на поле боя к событию которое происходило постоянно и придавало бы нашей игре динамичность и им послужит событие OnTimer объекта Timer. Запрограммируем данное событие:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(!MoveEnemy())
{
Timer1->Enabled=false;
ShowMessage("Вы проиграли");
if(Lifes>0)
{
Lifes--;
EnemySpeed-=0.5;
NewGame();
}else
{
if (MessageDlg("У вас больше нет жизней. Начать сначала?", mtInformation, TMsgDlgButtons() << mbYes << mbNo,0) == mrNo)
{
Close();
}
EnemySpeed=0;
Lifes=3;
Scores=0;
NewGame();
}
Timer1->Enabled=true;
}
if(LEFT)Ship.x-=3;
if(RIGHT)Ship.x+=3;
MoveBullet();
if(IsPobeda())
{
Timer1->Enabled=false;
if (MessageDlg("Вы победили? Продолжить?", mtInformation, TMsgDlgButtons() << mbYes << mbNo,0) == mrNo)
{
Close();
}
NewGame();
Timer1->Enabled=true;
}
ClearBack();
DrawAllEnemy();
Ship.Draw1();
Ship.Draw();
Ship.Draw3();
BackScreen->Canvas->Brush->Style=bsClear;
BackScreen->Canvas->TextOut(10,10,"Жизней:"+IntToStr(Lifes));
BackScreen->Canvas->TextOut(10,30,"Очков:"+IntToStr(Scores));
BackScreen->Canvas->Brush->Style=bsSolid;
Flip();
}
Программа почти готова осталось запрограммировать клавиши управления и один из основных элементов игры - уничтожение противника. Напишем функцию MoveBullet(), которая будет отвечать за проверку попадания пули во врага и начисления очков игроку в случае уничтожения вражеских самолетов:
void TForm1::MoveBullet()
{
if(!Ship.Fired)
{
Ship.BulletPos.x=Ship.x+14;
Ship.BulletPos.y=Ship.y-6;
Ship.BulletPos1.x=Ship.x+34;
Ship.BulletPos1.y=Ship.y-6;
}else
{
Ship.BulletPos.y-=10;
Ship.BulletPos1.y-=10;
Ship.Time++;
if(Ship.Time>40) //При выходе за экран
{
Ship.Fired=false;
}
TEnemy*temp;
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
if(((Ship.BulletPos.x>=temp->x)&&(Ship.BulletPos.x<=temp->x+30)&&
(Ship.BulletPos.y>=temp->y)&&(Ship.BulletPos.y<=temp->y+30))||
((Ship.BulletPos1.x>=temp->x)&&(Ship.BulletPos1.x<=temp->x+30)&&
(Ship.BulletPos1.y>=temp->y)&&(Ship.BulletPos1.y<=temp->y+30)))
{
Ship.Fired=false;
Ship.Time=100;
Enemy->Delete(i);
Scores+=10;
delete temp;
break;
}
}
}
}
ЗАКЛЮЧЕНИЕ
воздушный бой игра предметный
В процессе написания курсовой работы, были получены знания об основных принципах объектно - ориентированного программирования, рассмотрены такие понятия класс, метод. Подробно изучены способы создания объектов, использование графики в C++ Builder, также изучены принципы работы конструкторов и деструкторов, были приобретены огромные навыки в объектно-ориентированном программировании, подкреплены теоретические знания на практике. Все эти знания были применены при выполнении данного курсового проекта в виде реализации простейшей компьютерной игры - Воздушный бой.
СПИСОК ЛИТЕРАТУРЫ
Семакин И.Г., Шестяков А.П., «Основы программирования». Москва. 2002.
Лафоре Р., «Объектно - ориентированное программирование С++». 2013.
Медведев В.И., «Особенности объектно - ориентированного программирования на С++/CLI, C# и Java». 2010
Набайоти Баркакати «Программирование игр для Windows на Borland C++». 1994
http://citforum.ru/programming/tasm3/tasm3_4.shtml
ПРИЛОЖЕНИЕ 1. Общий вид программы
ПРИЛОЖЕНИЕ 2. Процесс игры
ПРИЛОЖЕНИЕ 3. Победа в раунде
ПРИЛОЖЕНИЕ 4. Проигрыш раунда
ПРИЛОЖЕНИЕ 5. Конец игры
ПРИЛОЖЕНИЕ 6. Листинг программы
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap*Plane;
Graphics::TBitmap*EnemyPic[2][3];
Graphics::TBitmap*BackScreen;
TList*Enemy;
int EnemyDirect;
bool LEFT,RIGHT;
float EnemySpeed;
int Lifes;
int Scores;
//---------------------------------------------------------------------------
// устанавливает цвет и противников на поле в случайном порядке
class TEnemy
{
public:
float x;int y;
int Color,State;
int Maxtime;
int time;
TEnemy(int tx,int ty)
{
x=tx;y=ty;
State=random(2);
Color=random(3);
time=0;
Maxtime=random(20)+20;
}
void Draw()
{
BackScreen->Canvas->Draw(x,y,EnemyPic[State][Color]);
}
};
// устанавливает задержку перед выстрелом, пока не пуля не долетит до объектов
class TShip
{
public:
int x;int y;
int TimeToNextBullet;
int Time;
bool Fired;
TPoint BulletPos;
TPoint BulletPos1;
TPoint BulletPos3;
TShip()
{
Fired=false;
TimeToNextBullet=30;
Time=50;
x=185;
y=365;
BulletPos=Point(199,359);
BulletPos1=Point(199,359);
BulletPos3=Point(199,359);
}
void Draw()
{
BackScreen->Canvas->Pen->Color=clYellow;
BackScreen->Canvas->Pen->Width=3;
BackScreen->Canvas->MoveTo(BulletPos.x,BulletPos.y+9);
BackScreen->Canvas->Pen->Style=psDot;
BackScreen->Canvas->LineTo(BulletPos.x,BulletPos.y+12);
}
void Draw1()
{
BackScreen->Canvas->Pen->Color=clYellow;
BackScreen->Canvas->Pen->Width=3;
BackScreen->Canvas->MoveTo(BulletPos1.x,BulletPos1.y+9);
BackScreen->Canvas->Pen->Style=psDot;
BackScreen->Canvas->LineTo(BulletPos1.x,BulletPos1.y+12);
}
void Draw3()
{
BackScreen->Canvas->Draw(x,y,Plane);
BackScreen->Canvas->MoveTo(BulletPos3.x,BulletPos3.y-100);
}
void Fire()
{
if(!Fired)
{
if(Time>TimeToNextBullet)
{
Fired=true;
Time=0;
}
}
}
};
TShip Ship;
// загружает из файла картинки для врагов и самолета,
// устанавливает ширину, длину, цвет и размер объектов.
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
randomize();
BackScreen=new Graphics::TBitmap();
BackScreen->Width =400;
BackScreen->Height=400;
BackScreen->Canvas->Font->Color=clYellow;
BackScreen->Canvas->Font->Size=15;
Enemy=new TList();
Plane=new Graphics::TBitmap();
Plane->LoadFromFile("Plane.bmp");
Graphics::TBitmap*Temp=new Graphics::TBitmap();
Temp->LoadFromFile("enemy.bmp");
for(int j=0;j<3;j++)
for(int i=0;i<2;i++)
{
EnemyPic[i][j]=new Graphics::TBitmap();
EnemyPic[i][j]->Width =30;
EnemyPic[i][j]->Height=30;
EnemyPic[i][j]->Canvas->CopyRect(Rect(0,0,30,30),Temp->Canvas,Rect(i*30,j*30,i*30+30,j*30+30));
EnemyPic[i][j]->Transparent=true;
}
EnemySpeed=0;
Lifes=3;
Scores=0;
NewGame();
EnemyDirect=1;//Вправо
LEFT=false;RIGHT=false;
}
//---------------------------------------------------------------------------
// Задает скорость врагов, а также жизни и очки игрока
// переход на следующий уровень
void TForm1::NewGame()
{
Enemy->Clear();
int x=5,y=5;
for(int j=0;j<4;j++)
{
for(int i=0;i<8;i++,x+=40)
{
TEnemy*temp=new TEnemy(x,y);
Enemy->Add((void*)temp);
}
x=5;
y+=30;
}
EnemySpeed+=0.5;
}
// Истребители
TForm1::DrawAllEnemy()
{
for(int i=0;i<Enemy->Count;i++)
{
TEnemy*temp=(TEnemy*)Enemy->Items[i];
temp->Draw();
}
return 0;
}
// Разрисовывает поле боя
void __fastcall TForm1::FormPaint(TObject *Sender)
{
ClearBack();
DrawAllEnemy();
Ship.Draw1();
Ship.Draw();
Ship.Draw3();
Flip();
}
// Задаем параметры игрового поля (Цвет, размер)
void TForm1::ClearBack()
{
BackScreen->Canvas->Brush->Color=clAqua;
BackScreen->Canvas->FillRect(Rect(0,0,400,400));
}
void TForm1::Flip()
{
Canvas->Draw(0,0,BackScreen);
}
// передвижения врагов по полю
bool __fastcall TForm1::MoveEnemy()
{
bool MustMoveDown=false;
TEnemy*temp;
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
if(EnemyDirect==1)
{
if((temp->x)>370)
{
EnemyDirect=2;
MustMoveDown=true;
}
}
if(EnemyDirect==2)
{
if((temp->x)<0)
{
EnemyDirect=1;
MustMoveDown=true;
}
}
}
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
temp->time++;
if(temp->time>temp->Maxtime)
{
temp->time=0;
if(temp->State==0)temp->State=1;else temp->State=0;
}
if(EnemyDirect==1)temp->x+=EnemySpeed;
if(EnemyDirect==2)temp->x-=EnemySpeed;
if(MustMoveDown)temp->y+=20;
if(temp->y>370)return false;
}
return true;
}
// устанавливает время, за которое враги доберутся до корабля
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(!MoveEnemy())
{
Timer1->Enabled=false;
ShowMessage("Вы проиграли");
if(Lifes>0)
{
Lifes--;
EnemySpeed-=0.5;
NewGame();
}else
{
if (MessageDlg("У вас больше нет жизней. Начать сначала?", mtInformation, TMsgDlgButtons() << mbYes << mbNo,0) == mrNo)
{
Close();
}
EnemySpeed=0;
Lifes=3;
Scores=0;
NewGame();
}
Timer1->Enabled=true;
}
if(LEFT)Ship.x-=3;
if(RIGHT)Ship.x+=3;
MoveBullet();
if(IsPobeda())
{
Timer1->Enabled=false;
if (MessageDlg("Вы победили? Продолжить?", mtInformation, TMsgDlgButtons() << mbYes << mbNo,0) == mrNo)
{
Close();
}
NewGame();
Timer1->Enabled=true;
}
ClearBack();
DrawAllEnemy();
Ship.Draw1();
Ship.Draw();
Ship.Draw3();
BackScreen->Canvas->Brush->Style=bsClear;
BackScreen->Canvas->TextOut(10,10,"Жизней:"+IntToStr(Lifes));
BackScreen->Canvas->TextOut(10,30,"Очков:"+IntToStr(Scores));
BackScreen->Canvas->Brush->Style=bsSolid;
Flip();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_RIGHT || Key==68) RIGHT=true;
if(Key==VK_LEFT || Key==65)LEFT=true;
if(Key==VK_SPACE)Ship.Fire();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_RIGHT || Key==68)RIGHT=false;
if(Key==VK_LEFT || Key==65) LEFT =false;
}
//---------------------------------------------------------------------------
// попадание пули во врага
void TForm1::MoveBullet()
{
if(!Ship.Fired)
{
Ship.BulletPos.x=Ship.x+14;
Ship.BulletPos.y=Ship.y-6;
Ship.BulletPos1.x=Ship.x+34;
Ship.BulletPos1.y=Ship.y-6;
}else
{
Ship.BulletPos.y-=10;
Ship.BulletPos1.y-=10;
Ship.Time++;
if(Ship.Time>40) //При выходе за экран
{
Ship.Fired=false;
}
TEnemy*temp;
for(int i=0;i<Enemy->Count;i++)
{
temp=(TEnemy*)Enemy->Items[i];
if(((Ship.BulletPos.x>=temp->x)&&(Ship.BulletPos.x<=temp->x+30)&&
(Ship.BulletPos.y>=temp->y)&&(Ship.BulletPos.y<=temp->y+30))||
((Ship.BulletPos1.x>=temp->x)&&(Ship.BulletPos1.x<=temp->x+30)&&
(Ship.BulletPos1.y>=temp->y)&&(Ship.BulletPos1.y<=temp->y+30)))
{
Ship.Fired=false;
Ship.Time=100;
Enemy->Delete(i);
Scores+=10;
delete temp;
break;
}
}
}
}
bool __fastcall TForm1::IsPobeda()
{
if(Enemy->Count>0)return false;else return true;
}
Размещено на Allbest.ru
Подобные документы
Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.
курсовая работа [355,9 K], добавлен 18.06.2013Разработка объектно-ориентированной модели животного, которая объясняется построением модели игры Terrarium. Модель построена на базе концепций объектно-ориентированного программирования. Разработка компонента, моделирующего поведение животного.
курсовая работа [23,2 K], добавлен 30.11.2008Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Создание консольных приложений с использованием графического интерфейса пользователя. Содержание палитры компонентов программы С++ Builder. Использование возможностей объектно-ориентированного программирования, особенности редактора кода и форм в С++.
лекция [27,0 K], добавлен 22.12.2010Анализ объектно-ориентированного программирования, имитирующего способы выполнения предметов. Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Понятие классов, полей, методов, сообщений, событий.
контрольная работа [51,7 K], добавлен 22.01.2013Приемы и правила объектно-ориентированного программирования с использованием языка С++. Общие принципы разработки объектно-ориентированных программ. Основные конструкции языка С++. Разработка различных программ для Windows с использованием WIN32 API.
учебное пособие [1,6 M], добавлен 28.12.2013Приемы практического использования объектно-ориентированного подхода в создании законченного программного продукта. Разработка кроссплатформенной компьютерной игры "Морской бой". Принципы "хорошего стиля программирования C++/Qt". Описание классов игры.
курсовая работа [2,7 M], добавлен 12.08.2014Понятие объектно-ориентированного программирования, общая характеристика языков высокого уровня. Разработка программного обеспечения для реализации компьютерной игры "пинбол" с помощью императивного программирования в среде Microsoft Visual Basic.
курсовая работа [428,9 K], добавлен 19.09.2012Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).
курсовая работа [29,7 K], добавлен 29.10.2011