48672

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

Курсовая

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

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

Русский

2013-12-22

195.5 KB

0 чел.

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

ВлГУ

Кафедра ИВТ

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

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

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

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

                           Выполнил : ст-нт гр. ИВТ-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


 

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

76436. Выявление и учет детей, оставшихся без попечения родителей. Банк детей, оставшихся без попечения родителей 16.73 KB
  Банк детей оставшихся без попечения родителей Существуют различные обстоятельства в результате которых дети остаются без родительского попечения. Сведения о детях оставшихся без попечения родителей учитываются в специальном государственном банке данных в соответствии с Федеральным законом...
76437. Органы, осуществляющие защиту прав и интересов детей и способы устройства детей, оставшихся без попечения родителей 14.2 KB
  Защиту прав и интересов таких детей осуществляют специально уполномоченные государством органы опеки и попечительства. Эти органы ведут учет детей оставшихся без попечения родителей; исходя из конкретных обстоятельств утраты попечения родителей избирают формы их устройства; осуществляют последующий контроль за условиями их содержания воспитания и образования ст. Для своевременного выявления таких детей закон возлагает на должностных лиц учреждений которые непосредственно соприкасаются с детьми детских садов школ детских поликлиник и т.
76438. Усыновление. Понятие, значение, порядок усыновления 16.4 KB
  Понятие значение порядок усыновления Усыновление представляет собой правовой институт призванный создать между усыновителем и усыновленным отношения наиболее близкие к тем которые возникают между родителями и родными детьми. Усыновление или удочерение далее усыновление является приоритетной формой устройства детей оставшихся без попечения родителей п. Усыновление допускается в отношении несовершеннолетних детей и только в их интересах с соблюдением требований абзаца третьего пункта 1 статьи 123 СК РФ а также с учетом возможностей...
76439. Дети, подлежащие усыновлению. Лица которые могут быть усыновителями 20.88 KB
  Поэтому при усыновлении ребенка должны учитываться его этническое происхождение; принадлежность к определенной религии и культуре родной язык возможность обеспечения преемственности в воспитании и образовании а также возможность обеспечить усыновляемым детям полноценное физическое психическое духовное и нравственное развитие п. 124 СК закреплено правило согласно которому усыновление братьев и сестер разными лицами не допускается так как при усыновлении прекращаются правоотношения ребенка не только с родителями но и с другими...
76440. Условия усыновления 18.15 KB
  129 СК специально оговорено что при усыновлении ребенка несовершеннолетних родителей которые не достигли возраста шестнадцати лет требуется также согласие их родителей или опекунов попечителей а при отсутствии родителей или опекунов попечителей согласие органа опеки и попечительства. Если законные представители несовершеннолетних родителей не выразили согласия на усыновление ребенка то усыновление не может состояться...
76441. Тайна усыновления и меры по ее обеспечению 13.95 KB
  Тайна усыновления ребенка должна соблюдаться лишь по желанию усыновителей что главным образом касается случаев усыновления малолетних детей новорожденных детей и иных случаев когда целесообразность обеспечения тайны усыновления не вызывает сомнений. Иногда усыновители по какимлибо причинам педагогического морального или иного свойства не считают нужным сохранять тайну усыновления и не скрывают от ребенка факта его усыновления. Таким образом тайна усыновления охраняется законом но не всегда является обязательным элементом любого...
76442. Правовые последствия усыновления 15.11 KB
  Если ребенок имеет кровного родителя и усыновлен одним лицом другого пола При усыновлении ребенка не всегда разрываются все его связи с кровными родственниками например мать ребенка вступила в новый брак и ребенка усыновил отчим. Однако закон сохраняет право родителя ребенка на сохранение правовых отношений с ним не только для тех случаях когда ребенка усыновил отчим мачеха а для всех случаев когда ребенок усыновлен только одним лицом и при этом ребенок имеет кровного родителя другого пола чем усыновитель. Закон формулирует это...
76443. Отмена усыновления ребенка 15.27 KB
  Однако могут быть и другие ситуации например не сложились семейные родственные отношения усыновителя и ребенка или тяжелая болезнь усыновителя и т. Во всех случаях суд тщательно изучает все обстоятельства конкретного дела и вправе отменить усыновление ребенка исходя из его интересов и с учетом его мнения п. Порядок отмены усыновления Отмена усыновления ребенка производится в судебном порядке п.
76444. Правовые последствия отмены усыновления 13.52 KB
  При отсутствии родителей а также если передача ребенка родителям противоречит его интересам ребенок передается на попечение органа опеки и попечительства. Изменение имени отчества или фамилии ребенка достигшего возраста десяти лет возможно только с его согласия. Суд исходя из интересов ребенка вправе обязать бывшего усыновителя выплачивать средства на содержание ребенка.