Астероиды на 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 Объектно-ориентированное  программирование

        Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

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

        Первым  языком программирования, в котором  были предложены принципы объектной  ориентированности, была Симула. В  момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

        В  настоящее время количество прикладных  языков программирования (список  языков), реализующих объектно-ориентированную  парадигму, является наибольшим  по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мульти платформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++.

        Структура данных «класс», представляющая собой объектный тип данных, внешне похожа на типы данных процедурно-ориентированных языков, такие как структура в языке Си. При этом элементы такой структуры (члены класса) могут сами быть не только данными, но и методами (то есть процедурами или функциями). Такое объединение называется инкапсуляцией.

        Наличие  инкапсуляции достаточно для  объектности языка программирования, но ещё не означает его объектной  ориентированности — для этого  требуется наличие наследования.

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

      

 

         По мнению Алана Кея, создателя  языка Smalltalk, которого считают одним  из «отцов-основателей» ООП, объектно-ориентированный  подход заключается в следующем  наборе основных принципов (цитируется  по вышеупомянутой книге Т. Бадда).

 

 

    1. Всё является объектом.
    2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
    3. Каждый объект имеет независимую память, которая состоит из других объектов.
    4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).
    5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
    6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

          Таким  образом, программа представляет  собой набор объектов, имеющих состояние и поведение. Объекты взаимодействуют посредством сообщений. Естественным образом выстраивается иерархия объектов: программа в целом — это объект, для выполнения своих функций она обращается к входящим в неё объектам, которые, в свою очередь, выполняют запрошенное путём обращения к другим объектам программы. Естественно, чтобы избежать бесконечной рекурсии в обращениях, на каком-то этапе объект трансформирует обращённое к нему сообщение в сообщения к стандартным системным объектам, предоставляемым языком и средой программирования.

         Устойчивость  и управляемость системы обеспечивается  за счёт чёткого разделения  ответственности объектов (за каждое  действие отвечает определённый  объект), однозначного определения  интерфейсов межобъектного взаимодействия и полной изолированности внутренней структуры объекта от внешней среды (инкапсуляции).

 

 

 

1.2 Объект

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

         Объект  в объектно-ориентированном программировании  — это модель или абстракция  реальной сущности в программной  системе. Предмет моделирования  при построении объекта в ООП  может быть различным. Например, могут существовать следующие типы абстракции, используемые при построении объекта:

    • абстракция понятия: объект — это модель какого-то понятия предметной области;
    • абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;
    • абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;
    • случайная абстракция: объект объединяет не связанные между собой операции.

1.3 Класс

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

             Структура класса.

Class  имя_класса  [ от кого унаследован]

{

private:

. . . . . . .

public:

. . . . . . .

protected:

. . . . . . .

}

            Класс должен иметь уникальное  имя. Если он наследован из  другого, то надо указать имя  родительского(их) класса(ов). Обычно  у класса бывают три раздела: private, public, protected. Указание на начало раздела private часто опускается и, если не объявлено начало ни одного из других разделов описания класса, считается, что данные относятся к разделу private.

           Методы  в классе могут быть объявлены  как дружественные (friend) или виртуальные (virtual). Иногда встречается объявление перегружаемых (overload) функций.

           Private(частный) раздел описания класса обычно  находится вначале описания класса  и содержит данные, доступ к  которым закрыт из внешнего  мира. Это и есть та самая "строго охраняемая" зона класса, доступ к которой можно получить только из методов самого класса. Она скрыта от внешнего мира глухой непробиваемой стеной и доступ к данным раздела private обеспечивается только с помощью, специально описанных в других разделах, методов. Скрытые в этом разделе данные также не доступны для всех производных классов.

             Protected(защищенный) - раздел описания  класса содержит данные и методы, доступ к которым закрыт из  внешней среды, но они напрямую  доступны производным классам.

             Таким образом, раздел protected используется  для описания данных и методов, которые будут доступны только  из производных классов. А в  производных классах эти данные  и методы воспринимаются, как  если бы они были описаны  в самом производном классе.

             Раздел public – публичный, открытый раздел. Методы описанные в разделе public доступны в пределах области видимости объекта и для производных классов. Таким образом, можно получить свободный доступ к методам, описанным в разделе public, из любого места программы (объект должен быть виден) и из любого производного класса. Методы, входящие в этот раздел, образуют интерфейс класса, с помощью которого и осуществляется взаимодействие экземпляра класса с внешним миром. Это единственный раздел, доступ к которому из внешней среды никак не ограничен.

            Методы (methods)- это функции (процедуры), принадлежащие классу.

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

1.4 Инкапсуляция

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

          Итак, зачем  же нам нужна инкапсуляция ? Ответ  прост, мы - люди. А человеку свойственно  ошибаться. Никто не застрахован от ошибок. Применяя инкапсуляцию, мы, как бы, возводим крепость, которая защищает данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это на много упрощает процесс поиска и исправления этих ошибок.

         Можно сказать, что инкапсуляция подразумевает  под собой скрытие данных (data hiding), что позволяет защитить эти  данные.

        Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов(операций).

        Это существенно  ограничивает возможность введения  объекта в недопустимое состояние  и/или несанкционированное разрушение этого объекта.

          Хорошим  примером применения принципа  инкапсуляции являются команды  доступа к файлам. Обычно доступ  к данным на диске можно  осуществить только через специальные  функции. Вы не имеете прямой  доступ к данным, размещенным на диске. Таким образом, данные, размещенные на диске, можно рассматривать скрытыми от прямого Вашего вмешательства. Доступ к ним можно получить с помощью специальных функций, которые по своей роли схожи с методами объектов. При этом, хотелось бы отметить два момента, которые важны при применении этого подхода. Во-первых, Вы можете получить все данные, которые Вам нужны за счет законченного интерфейса доступа к данным. И, во-вторых, Вы не можете получить доступ к тем данным, которые Вам не нужны. Это предотвращает случайную порчу данных, которая возможна при прямом обращении к файловой системе. Кроме того, это предотвращает получение неверных данных, т.к. специальные функции обычно используют последовательный доступ к данным.

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

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++