
- •Звіт з навчальної практики: «Конструювання програмного забезпечення»
- •План контролю якості
- •Задіяні документи:
- •Управління:
- •Документація
- •Мінімальні вимоги до документації:
- •Стандарти, практики, домовленості і метрики.
- •6. Огляди та аудити
- •6.1. Мета
- •План управління конфігураціями (scmp)
- •2.1. Організація
- •2.2.2. Лідер проекту
- •2.2.3. Розробники
- •2.3. Застосовувані політики, директиви та процедури
- •3.2. Контроль конфігурації
- •3.2.1. Запит на зміни
- •3.2.3. Схвалення або несхвалення змін
- •3.2.4. Реалізація змін
- •3.3. Визначення статусу конфігурації
- •3.4. Аудити та огляди конфігурації
- •3.5. Управління інтерфейсом
- •3.6. Контроль постачальників та субпідрядників
- •Розклад
- •5. Ресурси
- •6. Супровід
- •План управління програмним проектом (spmp) для відеогри Final Fantasy
- •1. Введення
- •1.1. Огляд проекту
- •1.2. Результуючі артефакти проекту
- •1.3. Розвиток spmp
- •1.4. Посилальні матеріали
- •1.5. Абревіатури
- •2. Організація проекту
- •2.1. Модель процесу
- •2.2. Організаційна структура
- •3.4. Механізми моніторингу та контролю
- •3.5. План розстановки кадрів
- •8.Звіти про проблеми і корекційна діяльність
- •9.Інструменти, технології та методики
- •10. Контроль програмного коду
- •11. Контроль носіїв
- •12. Контроль постачальників
- •13. Збір, супровід та зберігання протоколів
- •14. Навчання
- •15. Управління ризиками
- •Специфікація вимог до програмного забезпечення (srs) для відеоігри Final Fantasy, частина 1
- •Введення
- •Загальний опис
- •3.2.1.1. Case-діаграма героя
- •3.2.1.2. Case-діаграма монстра
- •5. Проектна документація
- •1.1. Мета
- •1. Введення
- •1.1. Мета
- •1.2. Опис проекту
- •5.1.2. Інтерфейс пакету Персонажі FinalFantasy
- •6.1.3. Клас Зовнішніх персонажів(монстрів)
- •6.1.4 Клас артефактів
- •6.2. Детальне проектування даних
- •Розробка коду програми.
- •7. Документація по тестуванню програмного продукту гри «Final Fantasy».
- •8. Експлуатаційна документація
- •Характеристика програмного засобу
- •2.3. Робота з програмним засобом
- •3.4 Повідомлення користувачу
- •Висновок:
6.2. Детальне проектування даних
Ніяких структур даних, окрім згаданих при описі класів в розділі 6.1, немає.
Розробка коду програми.
Код був розроблений з урахуванням всіх вимог і стандартів приведених вище в документах. Були розроблені всі заплановані функції а саме, рух персонажів, взаємодію між ними, підрахунок зібраних артефактів, взаємодію з артефактами, підрахунок життів та взаєможію з додатковими життями, розпочинання нової гри а також вихід з неї.
Лістинг програми:
Finction.h
//клас героя
class Hero{
int x,y,nlife;
public:
int get_x(){return x;};
int get_y(){return y;};
int get_nlife(){return nlife;};
void set_x(int c){x=x+c;};
void set_y(int d){y=y+d;};
void set_hero(int o,int f){x=o;y=f;};
void set_nlife(int l){nlife=nlife+l;};
Hero(){
x=100;
y=100;
}
};
//Клас монстра
class Monster{
int a,b;
public:
int get_a(){return a;};
int get_b(){return b;};
void set_a(int c){a=a+c;};
void set_b(int d){b=b+d;};
Monster(){
srand(time(0));
a=300+rand()%400; ;
b=rand()%350; ;
}
};
//--------------------------------------------------------------------------
//клас артефакту
class Art{
int xart,yart,flag;
public:
int get_xart(){return xart;};
int get_yart(){return yart;};
int get_flag(){return flag;};
void set_flag(int fl){flag=fl;};
Art(){
xart=rand()%750; ;
yart=rand()%500+10;
flag=1;
}
};
class Life{ // жизні
int xl,yl,flagl;
public:
int get_xl(){return xl;};
int get_yl(){return yl;};
int get_flagl(){return flagl;};
void set_ko(int xn,int xm){xl=xn; xl=xm;};
void set_flagl(int fl1){flagl=fl1;};
Life(){
xl=rand()%750; ;
yl=rand()%500+10; ;
flagl=1;
}
};
Location_1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Location_1.h"
#include "Function.h"
#include <stdlib.h>
#include <time.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int wp,hp; //розмір поля
//int x=100,y=100; // координати героя,
int const nmonster=4,nart=10,
nliferand=2; // к-ть рендомних життів;
//int nlife=3; // початкове значення жизнів
int kilkart=0;
Monster mas[nmonster];
Art masart[nart];
Life maslife[nliferand];
Hero Hero1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
wp=800;
hp=520;
Timer1->Interval=50; // частота руху монстрів
Timer1->Enabled = true;
Timer2->Interval=25; //Частота оновлення форми
Timer2->Enabled = true;
Form1->DoubleBuffered=true;
monster= new Graphics::TBitmap(); //завантаження зображення монстра
monster->LoadFromFile("monster.bmp");
monster->Transparent = true;
hero = new Graphics::TBitmap(); //завантаження зображення героя
hero->LoadFromFile("hero1.bmp");
hero->Transparent = true;
fon = new Graphics::TBitmap(); //завантаження зображення фону
fon->LoadFromFile("fon.bmp");
imgart = new Graphics::TBitmap(); //завантаження зображення фону
imgart->LoadFromFile("art.bmp");
imgart->Transparent = true;
imglife=new Graphics::TBitmap(); //завантаження зображення фону
imglife->LoadFromFile("life.bmp");
imglife->Transparent = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Hero(int x, int y) // Зображення героя
{
Canvas->Draw(x,y,hero);
hero->FreeImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Fon() //завантаження фону
{
// Canvas->StretchDraw(Form1->Canvas->ClipRect,fon);
Canvas->Draw(0,0,fon);
fon->FreeImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MStatic(int a,int b) //вивід монстра
{
Canvas->Draw(a,b,monster);
monster->FreeImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Artf(int xart,int yart) //вивід артефакту на форму
{
Canvas->Draw(xart,yart,imgart);
imgart->FreeImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Life(int xl,int yl) //малювання жизнєй рендомних
{
Canvas->Draw(xl,yl,imglife);
imglife->FreeImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
switch(Key) //визначення натискання клавіші та перемальовка зображення
{
case VK_DOWN: if(Hero1.get_y()<=480)
Hero1.set_y(10);
break;
case VK_UP: if(0<Hero1.get_y())
Hero1.set_y(-10);
break;
case VK_LEFT: if(0<Hero1.get_x())
Hero1.set_x(-10);
break;
case VK_RIGHT: if(Hero1.get_x()<=760)
Hero1.set_x(10);
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int w;
/*time_t t; // используется ГВЧ
srand((unsigned) time(&t)); // ініціалізація ГВЧ */
srand(time(0));
for(int i=0;i<nmonster;i++)
{
w=rand()%5;
switch(w) //визначення напрямку руху монстра
{
case 1:
for(int k=0;k<1;k++){
if(mas[i].get_b()<=460)
{
mas[i].set_b(10);
}
else break;
}
break;
case 2:
for(int k=0;k<1;k++){
if(0<mas[i].get_b())
{
mas[i].set_b(-10);
}
else break;
}
break;
case 3:
for(int k=0;k<1;k++){
if(0<mas[i].get_a())
{
mas[i].set_a(-10);
}
else break;
}
break;
case 4:
for(int k=0;k<1;k++){
if(mas[i].get_a()<=730)
{
mas[i].set_a(10);
}
else break;
}
break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
//Form1->Repaint();
Fon();
for(int i=0;i<nart;i++)
{
if(masart[i].get_flag()==1)
Artf(masart[i].get_xart(),masart[i].get_yart());
}
for(int i=0;i<nart;i++)
{
if(maslife[i].get_flagl()==1)
Life(maslife[i].get_xl(),maslife[i].get_yl());
}
Hero(Hero1.get_x(),Hero1.get_y());
for(int i=0;i<nmonster;i++)
{
MStatic(mas[i].get_a(),mas[i].get_b());
}
bool f; //визначення колізії героя і монстрів
for(int i=0;i<nmonster;i++){
f=(((mas[i].get_a()>=Hero1.get_x())&&(mas[i].get_a()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=mas[i].get_b())&&(mas[i].get_b()<=(Hero1.get_y()+30))));
f=f||((((mas[i].get_a()+60)>=Hero1.get_x())&&((mas[i].get_a()+60)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(mas[i].get_b()+50))&&((mas[i].get_b()+50)<=(Hero1.get_y()+30))));
f=f||((((mas[i].get_a()+60)>=Hero1.get_x())&&((mas[i].get_a()+60)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=mas[i].get_b())&&(mas[i].get_b()<=(Hero1.get_y()+30))));
f=f||(((mas[i].get_a()>=Hero1.get_x())&&(mas[i].get_a()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(mas[i].get_b()+50))&&((mas[i].get_b()+50)<=(Hero1.get_y()+30))));
if(f)
{
Sleep(1000);
Hero1.set_hero(100,100);
Hero1.set_nlife(-1);
if(Hero1.get_nlife()==-1){
Timer1->Enabled=false;
Timer2->Enabled=false;
ShowMessage("Ви програли!");
Hero1.set_nlife(1);}
}
}
bool l; //визначення колізії героя і артефактів
for(int i=0;i<nart;i++){
l=(((masart[i].get_xart()>=Hero1.get_x())&&(masart[i].get_xart()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=masart[i].get_yart())&&(masart[i].get_yart()<=(Hero1.get_y()+30))));
l=l||((((masart[i].get_xart()+30)>=Hero1.get_x())&&((masart[i].get_xart()+30)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(masart[i].get_yart()+22))&&((masart[i].get_yart()+22)<=(Hero1.get_y()+30))));
l=l||((((masart[i].get_xart()+30)>=Hero1.get_x())&&((masart[i].get_xart()+30)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=masart[i].get_yart())&&(masart[i].get_yart()<=(Hero1.get_y()+30))));
l=l||(((masart[i].get_xart()>=Hero1.get_x())&&(masart[i].get_xart()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(masart[i].get_yart()+22))&&((masart[i].get_yart()+22)<=(Hero1.get_y()+30))));
if(l)
{
masart[i].set_flag(0);
}
}
bool u=0;
for(int i=0;i<nart;i++)
u=u||masart[i].get_flag();
if(u==0)
{
Timer1->Enabled=false;
Timer2->Enabled=false;
ShowMessage("Ви виграли!");
}
bool g; //визначення колізії героя і життів
for(int i=0;i<nliferand;i++){
g=(((maslife[i].get_xl()>=Hero1.get_x())&&(maslife[i].get_xl()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=maslife[i].get_yl())&&(maslife[i].get_yl()<=(Hero1.get_y()+30))));
g=g||((((maslife[i].get_xl()+30)>=Hero1.get_x())&&((maslife[i].get_xl()+30)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(maslife[i].get_yl()+22))&&((maslife[i].get_yl()+22)<=(Hero1.get_y()+30))));
g=g||((((maslife[i].get_xl()+30)>=Hero1.get_x())&&((maslife[i].get_xl()+30)<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=maslife[i].get_yl())&&(maslife[i].get_yl()<=(Hero1.get_y()+30))));
g=g||(((maslife[i].get_xl()>=Hero1.get_x())&&(maslife[i].get_xl()<=(Hero1.get_x()+25)))&&((Hero1.get_y()<=(maslife[i].get_yl()+22))&&((maslife[i].get_yl()+22)<=(Hero1.get_y()+30))));
if(g)
{
Hero1.set_nlife(1);
maslife[i].set_flagl(0);
maslife[i].set_ko(570,830);
}
}
kilkart=0;
for(int i=0;i<nart;i++)
{
if(masart[i].get_flag()==0)
kilkart++;
}
StatusBar1->Panels->Items[0]->Text="Зібрано: "+IntToStr(kilkart);
StatusBar1->Panels->Items[1]->Text="Кількість життів:"+IntToStr(Hero1.get_nlife());
}
//--------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
ShellExecute(0,0,"FinalFantasy.exe",0,0,0);
Close();
//Form1->FormActivate(Sender) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Close();
}