48672

Игра Артиллерийская дуэль

Курсовая

Информатика, кибернетика и программирование

Одинаковые кубики лежат в прямоугольной коробке. Каждый кубик окрашен в шесть цветов, по числу граней. Дно коробки разделено на квадраты. В каждом квадрате, кроме одного, лежит по кубику. За счет свободной ячейки кубики можно последовательно перекатывать из квадрата в квадрат. Вынимать и переворачивать кубики не разрешается.

Русский

2013-12-22

195.5 KB

1 чел.

Министерство общего и профессионального образования

ВлГУ

Кафедра ИВТ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОЙ РАБОТЕ

по дисциплине

“Технология программирования”

                           Выполнил : ст-нт гр. ИВТ-1967 

                                                                         Кучин Р.А                                                                                                                                                                                                    

             

                                                    Принял :Дубов И.Р.

Владимир 1998

ОГЛАВЛЕНИЕ

[1] Вариант 11. Игра "Артиллерийская дуэль"

[1.1] 2.3. Программирование

[1.2] 2.4. Тестирование

1.1 Формулировка задания

Вариант 11. Игра "Артиллерийская дуэль"

На поверхности, имеющей ломанный рельеф располагается два артиллерийских орудия. Пользователь может управлять направлением выстрела и начальной скоростью полета снаряда для каждого орудия. Траектория снаряда соответствует простейшим баллистическим соотношениям. Количество снарядов для каждого орудия ограничено. Игра заканчивается при попадании снаряда в одно из орудий, либо когда закончились все снаряды. Снаряды уничтожаются при столкновении между собой, либо при падении на земную поверхность. В цифровой форме фиксируется количество оставшихся снарядов для каждого орудия.Вариант 9. Игра "Кубики-перевертыши"

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

2.21. Системный анализ

Выделим ключевые абстракции из описания задачаи, т.е. составим словарь предметной области: поверхность, орудие, снаряд, направление выстрела, начальная скорость полета снаряда, траектория снаряда, количество снарядов,

       игра, попадание снаряда в одно из орудий, столкновение снарядов между собой,

падение снаряда на земную поверхность игра, шар, белый шар, черный шар, стенка, луза, столкновение двух шаров, столкновение со стенкой, попадание шара в лузу, движение шара, бильярдный стол, поле, направление движения шара, энергия шара, потеря энергии, первоначальная расстановка, начало моделирования, начальная энергия шара, изменение направления движения.

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

Объектами в данном случае являются поверхность, орудие, снаряд.один бильярдный стол, один белый шар, несколько черных шаров, четыре стенки и четыре лузы. Абстракцию "поле" можно опустить, так как она однозначно ассоциируется с абстракцией "бильярдный стол".

Очевидным образом выявляются классы объектов: поверхность (TField), орудие (TGun), снаряд (TShell). стол (TTable), шар (TBall), белый шар (TWhiteBall), черный шар (TBlackBall), стенка (TWall), луза (THole). Следует заметить, что в данном случае понятия белый и черный в отношении шаров характеризуют не стол

 ько сущность (цвет), сколько особенности поведения, например, при взаимодействии с лузой. Однако все шары имеют одноименные характеристики поведения, поэтому классы TWhiteBall и TBlackBall являются подклассами одного класса TBall.

Некоторые понятия из словаря предметной области являются абстракциями сущности (атрибутами). Направление выстрела (Angle), начальная скорость полета снаряда (Speed), количество снарядов (Quantity) являются атрибутами класса орудие.

Совокупность стенок, луз и шаров характеризует состояние бильярдного стола, то есть соответствующие объекты являются атрибутами класса TTable. Направление движения шара (theDirection) и энергия шара (theEnergy) являются атрибутами шара (класса TBall).

Абстракции поведения характеризуют взаимодействие выявленных объектов между собой. Получаем следующие абстракции поведения (операции) например: .

- попадание снаряда в одно из орудий (HitoOnGun) для объекта класса        

        Tshell;

           - столкновение снарядов между собой (HitOnShell) для объекта класса TShell;

 - падение снаряда на земную поверхность (HitOnField) для объекта класса TShell; 

 Получаем следующие абстракции поведения (операции) с заменой их формулировок на глаголы. Операции "ударить шар в другой шар" (HitOnBall), "ударить шар в стенку" (HitOnWall), "попасть в лузу" (HitOnHole), "двигать шар" (Move) задают поведение объектов класса TBall. Абстракции поведения "выполнить начальную расстановку" (Initiate) и "начать моделирование" (Start) относятся к объекту класса TTable.

Строго говоря, моделируемое полемоделируемый бильярдный стол не является замкнутой системой, он входит в состав более широкого понятия - моделируемая действительность. Это проявляется в том, что по условиям задачи на моделируемыйое поле стол оказывается воздействие в форме сообщенияй  Initiate и MoveShellStart от внешнего источника. Поэтому введем понятие "моделируемая действительность" как объект theRealityity класса TRealityity. Об этом объекте известно лишь то, что он генерирует внешние события и воздействует на моделируемое ый бильярдный столполе.

Понятие "начальная энергия шара" является некоторой физической величиной, которую следовало бы предварительной определить из натурного эксперимента. Упрощая задачу примем начальную энергию шара как константу cMaxEnergy = 200.0 условных единиц. Понятие "потеря энергии при движении" указывает как выполняется процесс движения, то есть должно быть учтено при реализации операции Move класса TBall, но при этом не является самостоятельной абстракцией. Здесь следовало бы рассмотреть физику трения качения и привести соответствующие формулы. Учитывая учебный характер примера примем грубое допущение, что за единичный интервал времени энергия шара уменьшается на cDeltaEnergy=0.05 условных единиц не зависимо от скорости. Если в некоторый момент времени энергия оказывается меньше порогового значения cThresholdEnergy = 0.5, то шар далее двигаться не может. Здесь в процессе анализа появляется новая абстракция "скорость", которая должна быть добавлена в словарь предметной области. В реальном мире скорость движения шара пропорциональна его кинетической энергии, в рассматриваемой задаче примем более простую модель. Будем считать, что шар движется с постоянной скоростью cVelocity = 2.0 условных единиц в единицу времени, если его энергия превышает cThresholdEnergy.

Понятие "изменение направления" относится к алгоритму поведения шара и должно быть рассмотрено подробно. Будем определять направление движения шара как угол между некоторым базовым направлением и прямой, по которой движется шар. При столкновении шара, имеющего направление Alpha, со стенкой, имеющей угол theAngle, угол отражения Beta определяется формулой Beta=2*TheAngle-Alpha, где Pi - величина развернутого угла в радианах. Это означает, что для решаемой задачи необходимым атрибутом класса TWall является ее угол theAngle к базовому направлению. Данное понятие также заносится в словарь предметной области.

Для столкновения двух шаров примем приближенную модель, в которой форма шаров, их размеры и другие особенности взаимодействия физических тел не учитываются. Будем считать что каждый из сталкивающихся шаров изменяет направление таким образом, как будто он столкнулся со стенкой, расположенной посередине между направлениями их движения, при этом суммарная энергия шаров перераспределяется между ними поровну.

Абстракция поведения "установить начальную расстановку" предполагает размещение шаров на поле по следующему алгоритму. Белый шар располагается недалеко от центра поля, а остальные шары располагаются рядами, образуя треугольник. Абстракция поведения "начать моделирование" означает, что белому шару сообщаются начальная энергия и случайное направление. Из этого взаимодействия следует, что для класса TBall определены еще две операции: "установить значение энергии" (SetEnergy) и "установить направление" (SetDirection).

Для решаемой задачи важным является отображение формы моделируемых объектов, при этом соотношение размеров следовало бы получить экспериментальным путем. Примем следующие константы в условных единицах измерения: радиус шаров cBallRadius = 5, диаметр лузы cHoleRadius = 6, длина длинных стенок cLongWallLength = 290, длина коротких стенок cShortWallLength = 190, стенки расположены под прямым углом друг к другу.

Необходимость графического отображения влечет расширение словаря предметной области. В класс TBall вводим атрибут "радиус" (theRadius), в класс THole - атрибут "радиус" (theRadius), в класс TWall - "длина" (theLength).

Результатом системного анализа является техническое задание на проектирование, составленное с использованием словаря предметной области и сопровождаемое диаграммой классов (рис.11), диаграммой объектов (рис. 12), обобщенными алгоритмами абстракций поведения. Техническое задание содержит следующие требования.

Эксплуатационные требования:

- технические средства - ПЭВМ IBM PC;

- операционная система - MSDOS;

- процесс моделирования управляется одним оператором.

Функции системы (здесь изложены кратко, чтобы не повторять выше изложенные рассуждения):

  •  - управление моделированием осуществляется при помощи команд, подаваемых с клавиатуры:
  •  начать моделирование (клавиша "S"), выполнить начальную расстановку (клавиша "I"), завершить работу программы (клавиша "ESCQ");

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

Ограничения на процесс разработки:

- сроки выполнения проекта определены в разделе "порядок выполнения работы";

- порядок сдачи системы определен в разделе "порядок выполнения работы".

 2.32 Проектирование

2.32.1. Идентификация классов и объектов

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

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

2.32.2. Идентификация содержания классов

На этом шаге последовательно рассмотрим все классы, полученные в процессе выполнения анализа и синтеза.

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

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

Для изображения фигур необходимо ввести метод определения местоположения фигуры (GetPosition).

Далее рассмотрим классы, которые были "открыты" на стадии системного анализа. Класс TShell. Уточним, что операция MoveShell реализует передвижение снаряда за один дискрет времени и имеет параметры dX и dY – приращения координат положения снаряда при его перемещении. Метод ShellStatus определяет текущее

состояние снаряда.

Классу TGun припишем метод наведения на цельустановки начальных условий (угол, скорость) (TargetSetSettings),

метод показа количества снарядов (ShowQuantity), методы показа скорости и угла вылета снаряда (ShowSpeed) и (ShowAngle). Классы TLeftGun и TRightGun полностью наследуют атрибуты TGun, но по-разному изображаются. Поэтому для этих классов надо ввести замещающее правило Show.

Класс TField. Атрибутами этого класса являются содержащиеся в нем объекты, то есть два орудия (левое и правое), правый и левый снаряды, а также массив точек поверхности. Введем для этого класса  метод FieldShoot, который  возвращает текущее состояние снаряда (т.е. летит он  куда-нибудь или уже прилетел),  

Класс TReality. Объект этого класса содержит в себе поле theField. Кроме создания и уничтожения (соответственно конструктора и деструктора) главной абстракцией поведения объекта класса TReality является операция выполнения моделирования Run.

2.32.3. Идентификация связей между классами и объектами

Класс TFigure. В процессе выполнения моделирования всех отображаемых объектов для определения фактов столкновения необходимо знать, cовпадают ли координаты

снаряда с координатами точки поверхности, координатами другого снаряда или орудия. Поэтому определяем метод GetPosition, который возвращает координаты центра фигуры.

Класс TShell. Объекты  данного класса взаимодействуют между собой, землей (TField) и орудием (TGun). При взаимодействии изменяются атрибуты, поэтому вводим метод доступа и изменения атрибутов SetStatus. 

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

ChangeAngle и ChangePower.   

2.32.4. Реализация классов и объектов

Все разработанные классы и выявленные объекты должны быть включены в проект. Уточненные диаграммы классов и объектов показаны на рис. 13, 14.в приложении 2. Для диаграммы объектов составлена диаграмма взаимодействия (рис. 15), иллюстрирующая порядок взаимодействия шара с другими объектамиобъектов. На рис. 16 представлена диаграмма переходов для объекта класса TBlackBall.

.

Относительно универсальные классы TPoint и TFigure, могут быть использованы в любой графической программной системе. Они составят модуль Figures (рис. 17). +Оставшиеся кКлассы , используемые в программе, относятся к изучаемой предметной области и будут входить в модуль BilliardSolo. Кроме того для графического изображения простейших фигур необходимо использовать стандартный модуль графики Graphics. Головная программа main в данном случае является единственной и содержит инициализацию, выполнение и уничтожение единственного объекта класса TReality. Вся программная система реализуются одним процессом, поэтому нет необходимости составлять диаграмму процессов.

2.3. Программирование 

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

2.4. Тестирование 

Тестирование программного модуля (подпрограммы) рассмотрим на примере метода HitоnGun класса TField.

Спецификация тестируемого метода:

Имя: HitonGun;

Назначение: проверка попадания снаряда в орудие;

Аргументы: TGun *Gun (указатель на орудие), Tshell *Shell (указатель на снаряд);

Квалификация: управление;  

Действия: Если снаряд не попадает в орудие, то возвращается значение False, если же попадает, то возвращается значение True.

N

Входные данные

Выходные данные

1

Координаты X и Y снаряда входят в интервал координат орудия

True

2

Ни X ни Y снаряда не попа дают в

интервал координат орудия

False

3

Координата X снаряда  попа дает,

а координата Y не попадает в

интервал координат орудия

False

4

Координата Y снаряда  попа дает,

а координата X не попадает в

интервал координат орудия

False

Введем обозначения для ветвлений:

A: ((PointShell.x-PointGun.x)<10);

B: ((PointShell.y-PointGun.y)<7) );

Построим диаграмму управления (см. приложение 4) и, руководствуясь ею составим матрицу учета ветвей.

условия

1

2

3

4

A

((PointShell.x-PointGun.x)<10)

T

X

F

X

B

((PointShell.y-PointGun.y)<7) )

T

X

F

X

Циклы и сложные логические условия в тестируемой процедуре отсутствуют, поэтому нет необходимости составлять соответствующие тесты. Драйвер для выполнения тестов и результаты тестирования приводятся в приложениях

ПРИЛОЖЕНИЕ 1. Тексты программы

#include "c:\solo\cpp\Solo.h"

**********Реализация методов класса TFigure**********************

TFigure::TFigure(Point iPoint)

{aPoint=iPoint;};

//******************************************************************

TFigure::~TFigure()

{;};

//******************************************************************

void TFigure::Move(int dX, int dY)             //метод перемещения

{ Hide();aPoint.x+=dX;aPoint.y+=dY;Show(); };  //графического объекта

//******************************************************************

void TFigure::SetPosition(Point iPoint)        //установка координат

{ aPoint=iPoint; };                            //объекта

//******************************************************************

Point TFigure::GetPosition()                   //метод возвращения координат

{ return(aPoint); };                           //фигуры

//*************Реализация методов класса TShell*********************

void TShell::Show()                            //метод показать снаряд

{

Point ptPoint=GetPosition();

putpixel(ptPoint.x,ptPoint.y,WHITE);

};

//******************************************************************

void TShell::Hide()                            //метод спрятать снаряд

{

Point ptPoint=GetPosition();

putpixel(ptPoint.x,ptPoint.y,BLACK);

};

//******************************************************************

Point TShell::MoveShell()                      //метод перемещения снаряда

{

Point ptPoint=GetPosition();

double RadAngle=3.1415*(Angle)/180;              //перевод углов в радианы

FlyTime=FlyTime+0.01;

int x=Speed*cos(RadAngle)*FlyTime;                 //рассчет траектории

int y=Speed*sin(RadAngle)*FlyTime-9.8*FlyTime*FlyTime/2; //снаряда

ptPoint.x-=x;

ptPoint.y-=y;

Hide();

SetPosition(ptPoint);

Show();

return GetPosition();

};

//******************************************************************

Status TShell::GetStatus()

{return (St);};

//******************************************************************

void TShell::SetStatus(Status iSt)

{St=iSt;};

//******************************************************************

TShell::~TShell()

{;};

//******************************************************************

//конструктор

TShell::TShell(Point iPoint,int iAngle, int iSpeed ):TFigure(iPoint)

{

Angle=iAngle;

Speed=iSpeed;

FlyTime=0;

St=Fly;

};

//*************Реализация методов класса TGun***********************

void TGun::Show()                             //метод показать орудие

{

double RadAngle=3.1415*Angle/180;

Point ptPoint=GetPosition();

setfillstyle(1,YELLOW);

fillellipse(ptPoint.x,ptPoint.y-5,5,5);

setcolorRED);
b

ar(ptPoint.x-10,ptPoint.y-5,ptPoint.x+10,ptPoint.y+5);
l

ine(ptPoint.x,ptPoint.y-5,ptPoint.x-1ǐ5*cos(RadAngle),ptPoint.y-15*sin(RadAngle));

ShowQuantity();             //метод изменения скорости снаряда

ShowAngle();

ShowSpeed();

};

//******************************************************************

TGun::~TGun()

{;};

//******************************************************************

void TGun::Hide()                             //метод спрятать орудие

{

double RadAngle=3.1415*Angle/180;

Point ptPoint=GetPosition();

setfillstyle(1,BLACK);

fillellipse(ptPoint.x,ptPoint.y-5,5,5);

setcolor(BLACK);

bar(ptPoint.x-10,ptPoint.y-5,ptPoint.x+10,ptPoint.y+5);

line(ptPoint.x,ptPoint.y-5,ptPoint.x-15*cos(RadAngle),ptPoint.y-15*sin(RadAngle));

};

//******************************************************************

TShell* TGun::SetSettings() //метод установки начальных условий

{

//бесконечный цикл

 while (1){

 while(!kbhit()){};

  Hide();

  switch (getch())

   {

//по клавишам вверх и вниз изменение скорости вылета снаряда

     case 72: Speed++;

       if(Speed==101) Speed=15;

 break;

     case 80: Speed--;

       if(Speed==14)Speed=15;

 break;

//по клавишам влево и вправо изменение угла наклона

     case 77:Angle++;

       if(Angle==181)Angle=0;

 break;

     case 75:Angle--;

       if(Angle==-1)Angle=180;

 break;

// по клавише SPACE выход из метода

     case 32:

if(Quantity==0) return NULL;

Show();Quantity--;

return Shell=new TShell(GetPosition(),Angle,Speed/6);

//по клавише ESC выход из программы

     case  27:exit(1);

     default:;

     };

Show();

};

};

//******************************************************************

void TGun::ShowAngle()             //метод показа угла вылета снаряда

{

Point iPoint=GetPosition();

outtextxy(310,360,"Угол: ");

gotoxy(iPoint.x/10,23);

cout<<"   ";

gotoxy(iPoint.x/10,23);

cout<<Angle;

};

//******************************************************************

void TGun::ShowSpeed()             //метод показа скорости снаряда

{

Point iPoint=GetPosition();

outtextxy(300,370,"Скорость: ");

gotoxy(iPoint.x/10,24);

cout<<"   ";

gotoxy(iPoint.x/10,24);

cout<<Speed;

}

//******************************************************************

void TGun::ShowQuantity()             //метод показа количества снарядов

{

Point iPoint=GetPosition();

outtextxy(300,380," Заряды ");

gotoxy(iPoint.x/10,25);

cout<<"   ";

gotoxy(iPoint.x/10,25);

cout<<Quantity;

}

//******************************************************************

TGun::TGun(Point iPoint):TFigure(iPoint)  //конструктор

{

Angle=90;

Speed=15;

Quantity=20;

Show();

};

//*************Реализация методов класса TField***********************

TField::TField()                          //конструктор

{

randomize();

int A=random(30);            //задание произвольных значений

int T=random(10);            //для формулы поверхности

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

{

Surface[i]=300+A*sin(T*i*3.1415/180);    //формирорвание массива поверхности

setcolor(GREEN);

line(i,Surface[i],i,480);                //рисование поверхности

};

Point iPoint;

iPoint.x=40;

iPoint.y=Surface[40]-5;

LeftGun=new TGun(iPoint);                //создание левого орудия

iPoint.x=600;

iPoint.y=Surface[600]-5;

RightGun=new TGun(iPoint);               //создание правого орудия

LeftShell=NULL;

RightShell=NULL;

};

//******************************************************************

TField::~TField()  //деструктор

{

delete (LeftGun);                      //уничтожаем

delete (RightGun);                     //орудия

delete (LeftShell);                    //  и

delete (RightShell);                   //снаряды

};

//******************************************************************

void TField::SetSettings()            // метод установки начальных условий

{

LeftShell=LeftGun->SetSettings();

RightShell=RightGun->SetSettings();

};

//******************************************************************

Aim TField::FieldShoot()     //метод,возвращающий текущее состояние снаряда

{

Status StRight=Fly;          //правый снаряд летит

Status StLeft=Fly;           //левый снаряд летит

Point PointLeftShell;

Point PointRightShell;

while(StRight==Fly||StLeft==Fly)  //до тех пор пока летят снаряды

{

LeftGun->Show();

RightGun->Show();

StLeft=LeftShell->GetStatus();

StRight=RightShell->GetStatus();

delay(10);

if(StLeft==Fly)

{

PointLeftShell=LeftShell->MoveShell();

if(Surface[PointLeftShell.x]<PointLeftShell.y+4) //проверка на столкновение

         //с поверхностью левого снаряда

  {

  LeftShell->Hide();

  LeftShell->SetStatus(notFly);

  };

if(PointLeftShell.x>640)LeftShell->SetStatus(notFly);

if (HitonGun(RightGun,LeftShell)==True) return(True);

};

if(StRight==Fly)

{

PointRightShell=RightShell->MoveShell();

if(Surface[PointRightShell.x]<PointRightShell.y+4) //проверка на столкновение

         //с поверхностью правого снаряда

  {

  RightShell->Hide();

  RightShell->SetStatus(notFly);

  };

if(PointRightShell.x<0) RightShell->SetStatus(notFly);//проверка на

          //вылет с экрана

if (HitonGun(LeftGun,RightShell)==True) return(True); //проверка на

           //столкновение с орудием

};

if(PointRightShell.x==PointLeftShell.x&&      //проверка на столкновение

  PointRightShell.y==PointLeftShell.y)return(False);//снарядов

};

return(False);

};

//*****************************************************************

Aim TField::HitonGun(TGun *Gun,TShell*Shell)   //метод проверки попадания

           //снаряда в орудие

{

Point PointShell=Shell->GetPosition();

Point PointGun=Gun->GetPosition();

if(abs(PointShell.x-PointGun.x)<10&&

  abs(PointShell.y-PointGun.y)<7)

  {return (True);}

else return False;

};

//*************Реализация методов класса TReal************************

//*****************************************************************

TReal::~TReal() //Деструктор

{

delete(Field); //уничтожаем объект поле

//закрываем графический режим

getch();

closegraph();

clrscr();

gotoxy(37,15);

cout<<"The END"<<endl;

gotoxy(35,18);

cout<<"Made by Solo";

getch();

};

//*****************************************************************

TReal::TReal()    //Конструктор

{

//Инициализация графического режима

int gdrive=DETECT,gmode,errorcode;

initgraph(&gdrive,&gmode,"c:\language\borlandc\\bgi");

errorcode=graphresult();

if (errorcode!=grOk) exit(1);

//Инициализация объекта поле

Field=new TField();

};

//*****************************************************************

void TReal::Run()  //метод запуска программной системы

{

Field->SetSettings();

while(Field->FieldShoot()!=True)

{

Field->SetSettings();

};

};

#ifndef Solo_h

#define Solo_h

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <string.h>

#include <dos.h>

#include <math.h>

#include <stdio.h>

typedef enum Status{Fly,notFly};

typedef enum Aim{True,False};

typedef struct Point        //структура хранения координат точки на экране

{

   int x;

   int y;

};

//*****************************************************************

class TFigure                        //абстрактный класс графическая фигура

{

   private:

   Point aPoint;               //координаты точки на экране

   public:

   TFigure(Point iPoint);      //конструктор

   ~TFigure();                 //деструктор

   virtual void Show()=0;      //Методы показать

   virtual void Hide()=0;      //и спрятать

   void Move(int, int);        //метод перемещения объекта

   void SetPosition(Point ptPoint);     //метод установки координат

   Point GetPosition();        //метод возвращения координат

          //объекта

};

//*****************************************************************

class TShell: public TFigure

{

   private:

   int Angle;                         //угол вылета снаряда

   int Speed;                         //скорость снаряда

   double FlyTime;                    //время полета снаряда

   Status St;

   public:

   Point MoveShell();                 //метод перемещения снаряда

   void Show();                       //переопределенные методы показать

   void Hide();                       //и спрятать

   Status GetStatus();         //методы доступа

   void SetStatus(Status);            //к атрибуту состояния снаряда

   TShell(Point,int,int);             //конструктор

   ~TShell();                         //деструктор

};

//*****************************************************************

class TGun: public TFigure

{

   private:

   int Angle;               //угол вылета снаряда

   int Speed;                         //скорость снаряда

   TShell * Shell;                    //указатель на снаряд

   int Quantity;                      //количество снарядов

   public:

   TGun(Point);                       //конструктор

   ~TGun();                           //деструктор

   void Show();                       //переопределенные методы показать

   void Hide();                       //и спрятать

   TShell* SetSettings();        //метод установки начальных условий

   void ShowQuantity();             //метод показа количества снарядов

   void ShowAngle();             //метод показа угла вылета снаряда

   void ShowSpeed();             //метод показа скорости снаряда

};

//*****************************************************************

class TField

{

   private:

   TShell *LeftShell;                  //левый снаряд

   TShell *RightShell;                 //правый снаряд

   TGun* LeftGun;                      //левое орудие

   TGun* RightGun;                     //правое орудие

   int Surface[640];                  //массив точек поверхности

   public:

   TField();                          //конструктор

   ~TField();                         //деструктор

   Aim FieldShoot();         //метод,возвращающий текущее состояние снаряда

   Aim HitonGun(TGun *Gun,TShell*Shell);

   void SetSettings();

};

//*****************************************************************

class TReal

{

   private:

TField *Field;

   public:

TReal();                        //конструктор

~TReal();                       //деструктор

   void Run();                        //метод зпуска програмной системы
}

;

#

define Solo_h
#

endif

#

include "c:\sÐolo\cpp\Solo.cpp"

//Головная программа

void main()

{

//Создание объекта TReal - реальность

TReal *Real=new TReal();

//Запуск реальности

Real->Run();

//Уничтожение объекта TReal - реальность

Real->~TReal();

}

ПРИЛОЖЕНИЕ 2. Текст программы-драйвера

#include "c:\solo\cpp\Solo.cpp"

Aim HitonGun(TGun *Gun,TShell*Shell)

{

Point PointShell=Shell->GetPosition();

Point PointGun=Gun->GetPosition();

if(abs(PointShell.x-PointGun.x)<10&&

  abs(PointShell.y-PointGun.y)<7)

  {return (True);}

else return False;

};

void main()

{

//Инициализация графического режима

int gdrive=DETECT,gmode,errorcode;

initgraph(&gdrive,&gmode,"c:\language\borlandc\\bgi");

errorcode=graphresult();

if (errorcode!=grOk) exit(1);

Point iPoint,ptPoint;

cout<<"Тест номер 1"<<endl;

iPoint.x=1;

iPoint.y=1;

ptPoint.x=1;

ptPoint.y=1;

TGun *Gun=new TGun(iPoint);

TShell *Shell=new TShell(ptPoint,0,0);

Aim T=HitonGun(Gun,Shell);

cout<<"Ожидаемый результат: True "<<endl;

cout<<"Фактический результат: "<<T<<endl;

cout<<"Тест номер 2"<<endl;

iPoint.x=0;

iPoint.y=1;

ptPoint.x=1;

ptPoint.y=0;

Gun=new TGun(iPoint);

Shell=new TShell(ptPoint,0,0);

T=HitonGun(Gun,Shell);

cout<<"Ожидаемый результат: False "<<endl;

cout<<"Фактический результат:  "<<T<<endl;

cout<<"Тест номер 3"<<endl;

iPoint.x=1;

iPoint.y=1;

ptPoint.x=1;

ptPoint.y=0;

Gun=new TGun(iPoint);

Shell=new TShell(ptPoint,0,0);

T=HitonGun(Gun,Shell);

cout<<"Ожидаемый результат: False "<<endl;

cout<<"Фактический результат:  "<<T<<endl;

cout<<"Тест номер 4"<<endl;

iPoint.x=0;

iPoint.y=1;

ptPoint.x=1;

ptPoint.y=1;

Gun=new TGun(iPoint);

Shell=new TShell(ptPoint,0,0);

T=HitonGun(Gun,Shell);

cout<<"Ожидаемый результат: False "<<endl;

cout<<"Фактический результат: "<<T<<endl;

}

ПРИЛОЖЕНИЕ 3. Листинг тестирования

Тест номер 1

Ожидаемый результат: True

Фактический результат:0

Тест номер 2

Ожидаемый результат: False

Фактический результат:1

Тест номер 3

Ожидаемый результат: False

Фактический результат:1

Тест номер 4

Ожидаемый результат: False

Фактический результат:1

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ  Методические указания к курсовой работе

    Составители: И.Р.Дубов, В.А.Барков, А.Г.Долинин

2. Курс лекций по Технологии программирования

25


 

А также другие работы, которые могут Вас заинтересовать

77003. Порядок рассмотрения и разрешения дела об административном правонарушении, сроки рассмотрения, решения, принимаемые по результатам рассмотрения дела 26.52 KB
  Порядок рассмотрения и разрешения дела об административном правонарушении сроки рассмотрения решения принимаемые по результатам рассмотрения дела. Подготовка к рассмотрению дела об административном правонарушении Судья орган должностное лицо при подготовке к рассмотрению дела об административном правонарушении выясняют следующие вопросы: 1 относится ли к их компетенции рассмотрение данного дела; 2 имеются ли обстоятельства исключающие возможность рассмотрения данного дела судьей членом коллегиального органа должностным лицом; 3...
77004. Содержание постановлений и определений, принятых по результатам рассмотрения дела об административном правонарушении 27.61 KB
  Содержание постановлений и определений принятых по результатам рассмотрения дела об административном правонарушении. По результатам рассмотрения дела об административном правонарушении может быть вынесено постановление. В постановлении по делу об административном правонарушении должны быть указаны: должность фамилия имя отчество судьи должностного лица наименование и состав коллегиального органа вынесших постановление; дата и место рассмотрения дела; сведения о лице в отношении которого рассмотрено дело; обстоятельства...
77005. Обжалование и опротестование постановления по делу об административном правонарушении. Порядок и сроки обжалования (опротестования). Виды принимаемых решений 27.86 KB
  Обжалование и опротестование постановления по делу об административном правонарушении. Пересмотр постановлений и решений по делам об административных правонарушениях Правом на обжалование постановлений по административному делу обладают: лицо в отношении которого ведется административное дело; потерпевший; законный представитель физического лица; законный представитель юридического лица; защитник и представитель Постановление по делу об административном правонарушении может быть обжаловано: вынесенное судьей – в вышестоящий суд;...
77006. Порядок вступления в силу вынесенного постановления. Основные положения исполнения постановления по делу об административном правонарушении 27.28 KB
  Основные положения исполнения постановления по делу об административном правонарушении. На стадии исполнения завершается производство исполняются принятые по делам постановления решения осуществляется карательное воздействие. Поэтому на стадии исполнения появляется много новых участников производства действуют особые принципы специфичны и содержание деятельности субъектов власти и статус наказанного. Отношения возникающие на стадии исполнения постановлений о привлечении виновных юридических и физических лиц к административной...
77007. Особенности исполнения отдельных видов административных наказаний 27.01 KB
  Постановление о назначении административного наказания в виде предупреждения исполняется судьей органом должностным лицом вынесшими постановление путем вручения или направления копии постановления Исполнение постановления о наложении административного штрафа. Административный штраф должен быть уплачен лицом привлеченным к административной ответственности не позднее тридцати дней со дня вступления постановления о наложении административного штрафа в законную силу либо со дня истечения срока отсрочки или срока рассрочки. Сумма...
77008. Отсрочка и рассрочка исполнения постановления по делу об административном правонарушении Случаи прекращения исполнения постановления о назначении административного наказания 26.04 KB
  Отсрочка и рассрочка исполнения постановления по делу об административном правонарушении Случаи прекращения исполнения постановления о назначении административного наказания. При наличии обстоятельств вследствие которых исполнение постановления о назначении административного наказания в виде административного ареста лишения специального права или в виде административного штрафа невозможно в установленные сроки судья орган должностное лицо вынесшие постановление могут отсрочить исполнение постановления на срок до одного месяца....
77009. Законность и дисциплина в сфере государственного управления: понятие, сущность. Виды способов обеспечения законности и дисциплины в управленческой деятельности 27.02 KB
  Виды контрольной деятельности: 1 по субъектам: –контроль осуществляемый Счетной палатой Федерального Собрания РФ; –контроль Министерства по налогам и сборам РФ; –контроль Министерства финансов РФ; –судебный контроль; 2 по методам: –контроль документов издаваемых участниками управленческой деятельности; –проверка непосредственно самой деятельности; 3 по времени осуществления: – предварительные проверки осуществляемые до реализации субъектов административных правоотношений своих прав и обязанностей; –текущие проверки в процессе...
77010. Контроль в государственном управлении: понятие, содержание, виды 29.15 KB
  Сущность контроля за деятельностью органов исполнительной власти заключается в том что уполномоченные на то государственные органы законодательной исполнительной судебной власти и общественные организации используя организационноправовые способы и средства выясняют не допущены ли в деятельности подконтрольных органов исполнительной власти и их должностных лиц какиелибо нарушения законности и если таковые имеются то своевременно их устраняют восстанавливают нарушенные при этом права привлекают виновных к ответственности принимают...
77011. Административный надзор как способ обеспечения законности: понятие, правовые основы, органы осуществляющие, их правовое положение 28.37 KB
  Административный надзор как способ обеспечения законности: понятие правовые основы органы осуществляющие их правовое положение. Административный надзор как способ обеспечения законности представляет собой особый вид государственной деятельности специально уполномоченных органов исполнительной власти и их должностных лиц направленный на строгое и точное исполнение органами исполнительной власти коммерческими и некоммерческими организациями а также гражданами общеобязательных правил имеющих важное значение для общества и...