Астероиды на C++
СОДЕРЖАНИЕ
Введение
1. Теоретическая часть
1.1 Объектно –ориентированное программирование
1.2 Объект
1.3 Класс
1.4 Инкапсуляция
1.5 Наследование
1.6 Полиморфизм
2. Практическая часть
2.1 Постановка задачи
2.2 Интерфейс программы
Заключение
Список используемой литературы
Приложение. Листинг программы
По мере развития компьютерной техники развивались также и методика, и технология программирования. Сначала возникает командное и операторное программирование, в 1960-х гг. бурно развивается структурное программирование, появляются линии логического и функционального программирования, а в последнее время — объектно-ориентированное и визуальное программирование. Задача, которую следует ставить при первоначальном изучении программирования, — освоение основ структурной методики программирования.
C++ — это попытка решения разработчиками языка С задач объектно-ориентированного программирования (Object Oriented Programming, OOP). Построенный на твердом фундаменте С, C++ помимо OOP поддерживает множество других полезных инструментов, не жертвуя при этом ни мощью, ни элегантностью, ни гибкостью С. C++ уже стал универсальным языком для программистов всего мира, языком, на котором будет написано следующее поколение высокоэффективного программного обеспечения. Это единственный серьезный язык, который просто обязан знать любой уважающий себя профессиональный программист.
Объектно-ориентированное программирование позволяет программисту моделировать объекты определённой предметной области путем программирования их содержания и поведения в пределах класса. Конструкция «класс» обеспечивает механизм инкапсуляции для реализации абстрактных типов данных. Инкапсуляция как бы скрывает и подробности внутренней реализации типов, и внешние операции и функции, допустимые для выполнения над объектами этого типа.
.
I.Теоретическая часть
1.1 Объектно-ориентированное программирование
Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Объектное и объектно-ориентированное программирование (ООП) возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Кроме того, в современном объектно-ориентированном программировании часто большое значение имеют понятия события и компонента.
Первым
языком программирования, в котором
были предложены принципы
В
настоящее время количество
Структура данных «класс», представляющая собой объектный тип данных, внешне похожа на типы данных процедурно-ориентированных языков, такие как структура в языке Си. При этом элементы такой структуры (члены класса) могут сами быть не только данными, но и методами (то есть процедурами или функциями). Такое объединение называется инкапсуляцией.
Наличие
инкапсуляции достаточно для
объектности языка
Но
даже наличие инкапсуляции и
наследования не делает язык
программирования в полной
По мнению Алана Кея, создателя
языка Smalltalk, которого считают одним
из «отцов-основателей» ООП, объектно-ориентированный
подход заключается в
- Всё является объектом.
- Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
- Каждый объект имеет независимую память, которая состоит из других объектов.
- Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).
- В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
- Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
Таким образом, программа представляет собой набор объектов, имеющих состояние и поведение. Объекты взаимодействуют посредством сообщений. Естественным образом выстраивается иерархия объектов: программа в целом — это объект, для выполнения своих функций она обращается к входящим в неё объектам, которые, в свою очередь, выполняют запрошенное путём обращения к другим объектам программы. Естественно, чтобы избежать бесконечной рекурсии в обращениях, на каком-то этапе объект трансформирует обращённое к нему сообщение в сообщения к стандартным системным объектам, предоставляемым языком и средой программирования.
Устойчивость
и управляемость системы
1.2 Объект
Объект
в ООП — это сущность, способная
сохранять свое состояние (информацию)
и обеспечивающая набор
Объект
в объектно-ориентированном
- абстракция понятия: объект — это модель какого-то понятия предметной области;
- абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;
- абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;
- случайная абстракция: объект объединяет не связанные между собой операции.
1.3 Класс
Класс (class) - это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.
Структура класса.
Class имя_класса [ от кого унаследован]
{
private:
. . . . . . .
public:
. . . . . . .
protected:
. . . . . . .
}
Класс должен иметь уникальное имя. Если он наследован из другого, то надо указать имя родительского(их) класса(ов). Обычно у класса бывают три раздела: private, public, protected. Указание на начало раздела private часто опускается и, если не объявлено начало ни одного из других разделов описания класса, считается, что данные относятся к разделу private.
Методы в классе могут быть объявлены как дружественные (friend) или виртуальные (virtual). Иногда встречается объявление перегружаемых (overload) функций.
Private(частный)
раздел описания класса обычно
находится вначале описания
Protected(защищенный) - раздел описания
класса содержит данные и
Таким образом, раздел protected используется
для описания данных и методов,
которые будут доступны только
из производных классов. А в
производных классах эти
Раздел public – публичный, открытый раздел. Методы описанные в разделе public доступны в пределах области видимости объекта и для производных классов. Таким образом, можно получить свободный доступ к методам, описанным в разделе public, из любого места программы (объект должен быть виден) и из любого производного класса. Методы, входящие в этот раздел, образуют интерфейс класса, с помощью которого и осуществляется взаимодействие экземпляра класса с внешним миром. Это единственный раздел, доступ к которому из внешней среды никак не ограничен.
Методы (methods)- это функции (процедуры), принадлежащие классу.
Сообщение (message)- это практически тоже самое, что и вызов функций в обычном программировании. В ООП обычно употребляется выражение "послать сообщение" какому-либо объекту. Понятие "сообщение" в ООП можно объяснить с точки зрения основ ООП: мы не можем напрямую изменить состояние объекта и должны как бы послать сообщение объекту, что мы хотим так и так изменить его состояние. Объект сам меняет свое состояние, а мы только его просим об этом посылая сообщения.
1.4 Инкапсуляция
Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект.
Итак, зачем же нам нужна инкапсуляция ? Ответ прост, мы - люди. А человеку свойственно ошибаться. Никто не застрахован от ошибок. Применяя инкапсуляцию, мы, как бы, возводим крепость, которая защищает данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это на много упрощает процесс поиска и исправления этих ошибок.
Можно сказать,
что инкапсуляция
Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов(операций).
Это существенно
ограничивает возможность
Хорошим
примером применения принципа
инкапсуляции являются команды
доступа к файлам. Обычно доступ
к данным на диске можно
осуществить только через
Как известно, ни что в этом мире не дается даром. Применение этого метода ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов(переменных) объекта. Однако, при современном уровне развития вычислительной техники, эти потери в эффективности не играют существенной роли.
1.5 Наследование
Наследование - это процесс, посредством которого, один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него.
Смысл
и универсальность
В описаниях языков ООП
1.6 Полиморфизм
Полиморфизм - это свойство, которое
позволяет одно и тоже имя
использовать для решения
В общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий.
Преимуществом полиморфизма
Применительно к ООП, целью полиморфизма, является использование одного имени для задания общих для класса действий. На практике это означает способность объектов выбирать внутреннюю процедуру (метод) исходя из типа данных, принятых в сообщении.
II. Практическая часть
2.1 Постановка задачи
Поставлена задача о разработке анимации, которая должна реализоваться с использованием инкапсуляции, наследования и полиморфизма. При процедурном подходе требуется описать каждый шаг, каждое действие алгоритма для достижения конечного результата. В программе должна быть реализована основные свойства объектно-ориентированного программирования.
Краткое описание классов.
Класс Bullet (снаряды)
{
public:
float x,y,dx,dy;
void CreateBullet()
{
x=ShipPosX;y=ShipPosY;
dx=10*cos(RADIAN*ShipAngle);
dy=10*sin(RADIAN*ShipAngle);
}
void Draw()
{
ZadniyBuffer->Canvas->Pen->
ZadniyBuffer->Canvas->MoveTo(
ZadniyBuffer->Canvas->LineTo(
}
};
Класс CRock (астероиды)
{
public:
float x,y;
int Figure[50];
float Angle;
float Spin;
float XSpeed,YSpeed;
int Tip;
void CreateAsteroid(int t)
{
Tip=t;
XSpeed=random(4)+(random(9)/
YSpeed=random(4)+(random(9)/
Spin=random(10)-5;
for(int i=0;i<20;i++)
{
if(Tip==1)Figure[i]=random(10)
if(Tip==2)Figure[i]=random(10)
if(Tip==3)Figure[i]=random(5)+
}
}
void Move()
{
x+=XSpeed;y+=YSpeed;
Angle+=Spin;
if(x>440)x=-40;if(x<-40)x=440;
if(y>440)y=-40;if(y<-40)y=440;
}
void Draw()
{
ZadniyBuffer->Canvas->Pen->
float tAng=0;
int tx=cos(RADIAN*(Angle+tAng))*
int ty=sin(RADIAN*(Angle+tAng))*
ZadniyBuffer->Canvas->MoveTo(
for(int i=0;i<20;i++,tAng+=19)
{
int tx=cos(RADIAN*(Angle+tAng))*
int ty=sin(RADIAN*(Angle+tAng))*
ZadniyBuffer->Canvas->LineTo(
}
}
};
Интерфейс программы выглядит следующим образом:
Заключение
В результате
проделанной работы была
В процессе выполнения курсовой работы были освоены и закреплены навыки объектно-ориентированного программирования. Навыки, приобретенные мною в ходе выполнения курсового проекта помогут в дальнейшем при выполнении курсовых дипломного проекта.
В результате выполнения проекта была реализована игра «Астероиды», используя объектно ориентированное программирование. Программное средство разработано в среде программирования – С++.
- Герберт Шилдт – Самоучитель С++ .pdf.
- Семакин- Основы программирования.
- Ишкова С++ Начала программирования.Третье издание.2011г.
- Справочное руководство по С++.
- Иванова П.С. Объектно-ориентированное программирование:
Учебник для ВУЗов. – М : Изд. МГТУ им Н.Э. Баумана. 2001г. – 320: ил.
- Павловская Л.А. C/++. Программирование на языке высокого уровня Санкт-Петербург,2002 г.
- Архангельский А.Я. Решение типовых задач в С++Builder 6. – М:ЗАО «Издательство БИНОМ», 2003г.
- Основы программирования: Учеб. Для сред. проф. образования /И.Г.Семакин, А.П.Шестаков. – М., 2006.
Листинг программы
//----------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
const float RADIAN=0.01744444444;
TForm1 *Form1;
Graphics::TBitmap*
float ShipPosX,ShipPosY;
float ShipAngle;
float ShipSpeed;
bool LEFT,RIGHT,UP;
TList*Bullets;
TList*Asteroids;
class Bullet
{
public:
float x,y,dx,dy;
void CreateBullet()
{
x=ShipPosX;y=ShipPosY;
dx=10*cos(RADIAN*ShipAngle);
dy=10*sin(RADIAN*ShipAngle);
}
void Draw()
{
ZadniyBuffer->Canvas->Pen->
ZadniyBuffer->Canvas->MoveTo(
ZadniyBuffer->Canvas->LineTo(
}
};
class CRock
{
public:
float x,y;
int Figure[50];
float Angle;
float Spin;
float XSpeed,YSpeed;
int Tip;
void CreateAsteroid(int t)
{
Tip=t;
XSpeed=random(4)+(random(9)/
YSpeed=random(4)+(random(9)/
Spin=random(10)-5;
for(int i=0;i<20;i++)
{
if(Tip==1)Figure[i]=random(10)
if(Tip==2)Figure[i]=random(10)
if(Tip==3)Figure[i]=random(5)+
}
}
void Move()
{
x+=XSpeed;y+=YSpeed;
Angle+=Spin;
if(x>440)x=-40;if(x<-40)x=440;
if(y>440)y=-40;if(y<-40)y=440;
}
void Draw()
{
ZadniyBuffer->Canvas->Pen->
float tAng=0;
int tx=cos(RADIAN*(Angle+tAng))*
int ty=sin(RADIAN*(Angle+tAng))*
ZadniyBuffer->Canvas->MoveTo(
for(int i=0;i<20;i++,tAng+=19)
{
int tx=cos(RADIAN*(Angle+tAng))*
int ty=sin(RADIAN*(Angle+tAng))*
ZadniyBuffer->Canvas->LineTo(
}
}
};
//----------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
randomize();
ZadniyBuffer=new Graphics::TBitmap();
ZadniyBuffer->Width =400;
ZadniyBuffer->Height=400;
ZadniyBuffer->Canvas->Pen->
Bullets =new TList();
Asteroids=new TList();
LEFT=false;RIGHT=false;
ShipPosX=200;ShipPosY=200;
ShipAngle=0;
ShipSpeed=0;
for(int i=0;i<4;i++)
{
CRock*a=new CRock();
a->x=random(400);
a->y=40;
a->CreateAsteroid(1);
Asteroids->Add((void*)a);
}
}
//----------------------------
void TForm1::CLS()
{
ZadniyBuffer->Canvas->Brush->
ZadniyBuffer->Canvas->
}
void __fastcall TForm1::CopyToScreen()
{
Canvas->Draw(0,0,ZadniyBuffer)
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(LEFT)ShipAngle-=3;
if(RIGHT)ShipAngle+=3;
MoveShip();
CLS();
DrawShip();
MoveAndDrawBullets();
MoveAndDrawAsteroids();
ZadniyBuffer->Canvas->Font->
ZadniyBuffer->Canvas->
CopyToScreen();
if(IsShipBreaked())
{
Timer1->Enabled=false;
ShowMessage("Корабль взорван");
StartNew();
Timer1->Enabled=true;
}
if(Asteroids->Count==0)
{
Timer1->Enabled=false;
ShowMessage("Уровень пройден");
StartNew();
Timer1->Enabled=true;
}
}
//----------------------------
void __fastcall TForm1::DrawShip()
{
ZadniyBuffer->Canvas->Pen->
int tA=0;
int tx=cos(RADIAN*(ShipAngle+tA))*
int ty=sin(RADIAN*(ShipAngle+tA))*
ZadniyBuffer->Canvas->MoveTo(
int l;
for(int i=0;i<4;i++,tA+=120)
{
if((i==0)||(i==3))l=15;else l=10;
int tx=cos(RADIAN*(ShipAngle+tA))*
int ty=sin(RADIAN*(ShipAngle+tA))*
ZadniyBuffer->Canvas->LineTo(
}
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_LEFT) LEFT=true;
if(Key==VK_RIGHT)RIGHT=true;
if(Key==VK_UP)UP=true;
if(Key==VK_SPACE)
{
Bullet*b=new Bullet();
b->CreateBullet();
Bullets->Add((void*)b);
}
}
//----------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_LEFT) LEFT=false;
if(Key==VK_RIGHT)RIGHT=false;
if(Key==VK_UP)UP=false;
}
//----------------------------
void __fastcall TForm1::MoveShip()
{
if(UP)
{
ShipSpeed+=0.01;
if(ShipSpeed>2)ShipSpeed=4;
}
else
{
ShipSpeed-=0.01;
if(ShipSpeed<0)ShipSpeed=0;
}
ShipPosX+=cos(RADIAN*
ShipPosY+=sin(RADIAN*
if(ShipPosX>410)ShipPosX=-10;
if(ShipPosX<-10)ShipPosX=410;
if(ShipPosY>408)ShipPosY=-10;
if(ShipPosY<-10)ShipPosY=410;
}
void __fastcall TForm1::MoveAndDrawBullets()
{
Bullet*b;
for(int i=0;i<Bullets->Count;i++)
{
b=(Bullet*)Bullets->Items[i];
b->x += b->dx;
b->y += b->dy;
if((b->x>410)||(b->x<-10)||(b-
{
delete b;
Bullets->Delete(i);
b=NULL;
}
if(b!=NULL)b->Draw();
}
}
TForm1::MoveAndDrawAsteroids()
{
CRock*r,*r2;
Bullet*b;
for(int i=0;i<Asteroids->Count;i++)
{
r=(CRock*)Asteroids->Items[i];
if(r!=NULL)
for(int j=0;j<Bullets->Count;j++)
{
b=(Bullet*)Bullets->Items[j];

- Астраханский обласной социально-реабилитационный центр для детей и подростков в системе реабилитационной деятельности дезадаптированны
- Астрологічний прогноз
- Астрометрия
- Астрономическое обеспечение судна по маршруту перехода
- Астрономия және ғарыштық болашақ
- Астрономия и человек
- Астық массасын белсенді желдету режимдері
- Ассоциированная торговля как способ объединения малых предприятий
- Ассоциированная торговля как способ объединения малых предприятий. Формы ассоциаций
- Ассоциированная торговля как способ объединения малых предприятий. Формы ассоциаций
- Ассоциированная торговля как способ объединения малых предприятий. Формы ассоциаций
- Ассоциированная торговля как способ объединения малых предприятий. Формы ассоциаций
- Астана қаласындағы қуаттылығы 30 мың м3 әрлеу керамикалық бұйымдарды өндіретін зауыт
- Астана қаласындағы қуаттылығы 30 мың м3 әрлеу керамикалық бұйымдарды өндіретін зауыт