Астероиды на C++

Автор работы: Пользователь скрыл имя, 08 Марта 2014 в 18:14, курсовая работа

Описание работы

C++ — это попытка решения разработчиками языка С задач объектно-ориентированного программирования (Object Oriented Programming, OOP). Построенный на твердом фундаменте С, C++ помимо OOP поддерживает множество других полезных инструментов, не жертвуя при этом ни мощью, ни элегантностью, ни гибкостью С. C++ уже стал универсальным языком для программистов всего мира, языком, на котором будет написано следующее поколение высокоэффективного программного обеспечения. Это единственный серьезный язык, который просто обязан знать любой уважающий себя профессиональный программист.

Содержание работы

Введение
1. Теоретическая часть
1.1 Объектно –ориентированное программирование
1.2 Объект
1.3 Класс
1.4 Инкапсуляция
1.5 Наследование
1.6 Полиморфизм
2. Практическая часть
2.1 Постановка задачи
2.2 Интерфейс программы
Заключение
Список используемой литературы

Файлы: 1 файл

Курсовая ООП.doc

— 152.50 Кб (Скачать файл)

           Как  известно, ни что в этом мире не дается даром. Применение этого метода ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов(переменных) объекта. Однако, при современном уровне развития вычислительной техники, эти потери в эффективности не играют существенной роли.

1.5 Наследование

           Наследование - это процесс, посредством которого, один объект может наследовать  свойства другого объекта и  добавлять к ним черты, характерные  только для него.

           Смысл  и универсальность наследования  заключается в том, что не надо  каждый раз заново (с нуля) описывать  новый объект, а можно указать  родителя(базовый класс) и описать  отличительные особенности нового  класса. В результате, новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.

            В описаниях языков ООП принято  класс, из которого наследуют  называть родительским классом (parent class) или основой класса(base class). Класс, который получаем в результате наследования называется порожденным классом (derived or child class). Родительский класс всегда считается более общим и развернутым. Порожденный же класс всегда более строгий и конкретный, что делает его более удобным в применении при конкретной реализации.

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->Color=clYellow; //цвет

        ZadniyBuffer->Canvas->MoveTo(x,y);

        ZadniyBuffer->Canvas->LineTo(x+dx,y+dy);

        }

};

Класс 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)/10.0)-2;

        YSpeed=random(4)+(random(9)/10.0)-2;

 

 

        Spin=random(10)-5;

        for(int i=0;i<20;i++)

                {

                if(Tip==1)Figure[i]=random(10)+25;

                if(Tip==2)Figure[i]=random(10)+10;

                if(Tip==3)Figure[i]=random(5)+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->Color=clBlue;

        float tAng=0;

                int tx=cos(RADIAN*(Angle+tAng))*Figure[0]+x;

                int ty=sin(RADIAN*(Angle+tAng))*Figure[0]+y;

                ZadniyBuffer->Canvas->MoveTo(tx,ty);

        for(int i=0;i<20;i++,tAng+=19)

                {

                int tx=cos(RADIAN*(Angle+tAng))*Figure[i]+x;

                int ty=sin(RADIAN*(Angle+tAng))*Figure[i]+y;

                ZadniyBuffer->Canvas->LineTo(tx,ty);

                }

        }

};

 

 

 

 

 

 

 

 

 

 

Интерфейс программы выглядит следующим образом:

 

 

 

 

 

 

                                                              

 

 

 

 

 

 

 

 

 

                                                

 

 

 

            

 

Заключение

 

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

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

         В результате выполнения проекта была реализована игра «Астероиды», используя объектно ориентированное программирование. Программное средство разработано в среде программирования – С++.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                 Список использованной литературы

 

    1. Герберт Шилдт – Самоучитель С++ .pdf.
    2. Семакин- Основы программирования.
    3. Ишкова С++ Начала программирования.Третье издание.2011г.
    4. Справочное руководство по С++.
    5. Иванова П.С. Объектно-ориентированное программирование:

Учебник для ВУЗов. – М : Изд. МГТУ им Н.Э. Баумана. 2001г. – 320: ил.

    1. Павловская Л.А. C/++. Программирование на языке высокого уровня Санкт-Петербург,2002 г.
    2. Архангельский А.Я. Решение типовых задач в С++Builder 6. – М:ЗАО «Издательство БИНОМ», 2003г.
    3. Основы программирования: Учеб. Для сред. проф. образования /И.Г.Семакин, А.П.Шестаков. – М., 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*ZadniyBuffer;

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->Color=clYellow;

        ZadniyBuffer->Canvas->MoveTo(x,y);

        ZadniyBuffer->Canvas->LineTo(x+dx,y+dy);

        }

};

 

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)/10.0)-2;

        YSpeed=random(4)+(random(9)/10.0)-2;

        Spin=random(10)-5;

        for(int i=0;i<20;i++)

                {

                if(Tip==1)Figure[i]=random(10)+25;

                if(Tip==2)Figure[i]=random(10)+10;

                if(Tip==3)Figure[i]=random(5)+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->Color=clBlue;

        float tAng=0;

                int tx=cos(RADIAN*(Angle+tAng))*Figure[0]+x;

                int ty=sin(RADIAN*(Angle+tAng))*Figure[0]+y;

                ZadniyBuffer->Canvas->MoveTo(tx,ty);

        for(int i=0;i<20;i++,tAng+=19)

                {

                int tx=cos(RADIAN*(Angle+tAng))*Figure[i]+x;

                int ty=sin(RADIAN*(Angle+tAng))*Figure[i]+y;

                ZadniyBuffer->Canvas->LineTo(tx,ty);

                }

        }

};

 

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

randomize();

ZadniyBuffer=new Graphics::TBitmap();

ZadniyBuffer->Width =400;

ZadniyBuffer->Height=400;

ZadniyBuffer->Canvas->Pen->Color=clWhite;

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->Color=clBlack;

        ZadniyBuffer->Canvas->FillRect(Rect(0,0,400,400));

}

 

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->Color=clWhite;

ZadniyBuffer->Canvas->TextOutA(5,5,"Астероидов : "+IntToStr(Asteroids->Count));

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->Color=clWhite;

       int tA=0;

       int tx=cos(RADIAN*(ShipAngle+tA))*10+ShipPosX;

       int ty=sin(RADIAN*(ShipAngle+tA))*10+ShipPosY;

       ZadniyBuffer->Canvas->MoveTo(tx,ty);

       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))*l+ShipPosX;

                int ty=sin(RADIAN*(ShipAngle+tA))*l+ShipPosY;

                ZadniyBuffer->Canvas->LineTo(tx,ty);

                }

}

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*ShipAngle)*ShipSpeed;

        ShipPosY+=sin(RADIAN*ShipAngle)*ShipSpeed;

        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->y>410)||(b->y<-10))

                     {

                     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];

Информация о работе Астероиды на C++