Розробка гри «Тетріс» у середовищі C++ Builder 6
При нарахуванні очок за лінії кількість очок зазвичай залежить від того, скільки ліній прибрано за один раз: 1 лінія — 100 очок, 2 лінії — 300 очок, 3 лінії — 700 очок, 4 лінії (тобто, зробити Тетріс) — 1500 очок. Тобто, чим більше ліній забирається за один раз, тим більше відношення кількості очок до кількості ліній. Цікаво, що тетріс в багатьох версіях гри також називається дія, після якого… Читати ще >
Розробка гри «Тетріс» у середовищі C++ Builder 6 (реферат, курсова, диплом, контрольна)
АНОТАЦІЯ У даному курсовому проекті представлено розробку гри «Тетріс». При розробці була використана об'єктна-орієнтована мова програмування С++ у середовищі C++ Builder 6. Для проекту було розроблено пояснювальну записку, яка складається з опису предметної області, проекту програми, висновків та результатів з додатками. Робота оформлена українською мовою на __ сторінках машинописного тексту, містить 17 рисунків, 9 використаних джерел та включає 2 додатки.
АННОТАЦИЯ В данном курсовом проекте представлен разработку игры «Тетрис». При разработке была использована объектно-ориентированный язык программирования С++ в среде C++ Builder 6. Для проекта была разработана пояснительная записка, которая состоит из описания предметной области, проекта программы, выводов и результатов с приложениями. Работа оформлена на украинском языке на __ страницах машинописного текста, содержит 17 рисунков, 9 использованных источников и включает 2 приложения.
ANOTATION
The game «Tetris was development in this course project. In the development has been used object-oriented programming language C++ environment in C++ Builder 6. For the project was developed explanatory memorandum, which consists of describing the subject area, the draft program, findings and results of applications. The work is framed in Ukrainian of __ pages of typewritten text, contains 17 drawings,, 9 sources used and includes 2 applications.
ЗМІСТ ВСТУП
1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ
1.1 Опис гри
1.2 Опис гри «Тетріс»
1.3 Постановка задачі
2. ПРОЕКТ ПРОГРАМИ
2.1 Опис об'єктів
2.2 Ієрархія об'єктів
2.3 Ієрархія наслідування
2.4 Розробка інтерфейсу користувача
2.5 Алгоритми основних модулів ВИСНОВКИ СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ Додатки
ВСТУП Розвиток обчислювальної техніки в останні роки, дозволяє автоматизувати більшу частину галузей людської діяльності. Слід також зазначити, що протягом останніх 10−15 років у навчальний процес, як активний інструмент навчання й пізнання, стрімко включається не тільки сам комп’ютер, але й мови програмування.
Виконання проекту є завершальним етапом при вивченні дисципліни «Об'єктно-орієнтоване програмування. Тому розробка гри є найбільш прийнятною темою для застосування об'єктно-орієнтованого підходу при розробці програми.
При розробці комп’ютерних ігор варто виділити наступні етапи, наприклад:
— вивчення теоретичного матеріалу;
— визначенні правил ігр;
— складання діаграми об'єктів та наслідування;
— проектування інтерфейсу.
Метою даного курсового проекту є реалізація програмного забезпечення «Гра тетріс».
Для досягнення поставленої мети необхідно виконати:
? дослідження предметної області;
? огляд прототипів;
? розробити архітектуру програмного забезпечення;
? реалізувати програмне забезпечення.
Результатом курсового проекту є розроблене програмне забезпечення.
1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ
1.1 Опис гри У даній роботі розробляється програмне забезпечення гра «Тетріс». Гра — це процес, який направлений не на результат, а на проведення часу. Призначення програми — розвага граючих, вдосконалення їх координації і логічного мислення. Програма може застосовуватися в якості ігрової на різних типах персональних комп’ютерів. За допомогою гри можемо розвивати мислення або просто проводити цікаво час.
Історія гри Тетріс починається в червні 1985 року. Тетріс був винайдений Олексієм Пажитновим, а потім був інтегрований на ПК IBM Вадимом Герасимовим. Після чого ярма Тетріс почала поширюватися по всій Москві, а потім вже і по всьому світу. Спочатку вона була доставлена в Угорщину, де угорські програмісти інтегрували Тетріс для Apple II і Commodore 64.
Існує чи мало видів ігор, наприклад таких, як:
— Броділки — стрелялки;
— Файтінги;
— Слешер;
— Аркада;
— Cтелс-екшн;
— Симулятори;
— Аркадні симуляції;
— Стратегії;
— Спортивні;
— Квести;
— Головоломки;
— Логічні.
Дана гра відноситься до логічного типу ігор.
1.2 Опис гри «Тетріс»
Дана програма здійснює виведення на екран випадковим чином падіння різних фігур. Вхідними даними є введення варіантів швидкості руху фігур зверху вниз і керування падаючими фігурами.
Після запуску програми на екрані з’являються ігрове поле з фігурою, інформація про наступний блок і рахунок. Гра на початку знаходиться в стані паузи. Вверху екрану — меню.
Головне меню містить такі пункти:
— Гра (Game);
— Опис програми (About);
— Вихід (Exit).
Вибрати необхідний пункт можна за допомогою клавіш-стрілок і клавіші:
— Меню 'Игра' дозволяє почати нову гру.
— Меню 'Описание' - проглянути текст опису гри та її правила.
— Меню 'Выход' - дозволяє вийти з гри.
На першому рівні на початку гри стакан порожньої. На наступних рівнях найбільш низькі горизонтальні ряди ігрового поля заповнені.
Якщо у будь-який момент під час гри натиснути клавішу Esc, то викличеться меню. Гру буде припинено. За допомогою пункту Continue її можна буде продовжити.
Для реалізації даного програмного забезпечення потрібно використовувати графічні бібліотеки, які дозволять зобразити сцени гри. Можна використовувати в іграх такі графічні бібліотеки:
— Allegro;
— DirectX;
— GRX;
— BGI;
— OpenGl.
За рівнем задачі та кваліфікацією розробника слід використовувати не складну графічну бібліотеку. До такої можна віднести BGI.
При розробці програми гри «Тетріс» для опису математичної частини алгоритму був використаний двовимірний масив.
Так як гра представляє з себе взаємодію декількох об'єктів, інструмент розробки слід обрати мову програмування C++.
1.3 Постановка задачі
Розробити алгоритм програми, яка виконує переміщення фігур по екрану зверху вниз, координацію їх місце знаходження відповідно до дій того, що грає.
Фігури складаються з квадратів однакового розміру, набір фігур — кінцевий, послідовність випадання фігур — випадкова.
Гравець повинен вкладати фігури на дно стакана по можливості з більшою щільністю (кількість незаповнених квадратів повинна бути мінімальною). При цьому ряд, повністю заповнений квадратами, повинен автоматично зникати із стакану. Квадрати не повинні накладатися один на один.
Гравець може зупинити і продовжити гру. Рівень визначає кількість квадратів і швидкість на початку гри.
Правила Випадкові фігурки тетраміно падають зверху в прямокутний стакан шириною 10 і висотою 20 клітин. У польоті гравець може повертати фігурку і рухати її по горизонталі. Фігурка летить, поки не наткнеться на іншу фігурку або на дно склянки. Якщо при цьому заповнився горизонтальний ряд з 10 клітин, він пропадає і все, що вище за нього, опускається на 1 клітину. Темп гри поступово збільшується. Назва гри походить від кількості клітин, з яких складається кожна фігура. Гра закінчується, коли нова фігурка не може поміститися в склянку. Гравець отримує очки за кожну фігурку, тому його завдання — заповнювати ряди, не заповнюючи сам склянку якомога довше, щоб таким чином отримати якомога більше очок.
Нарахування очок Нарахування очок у різних версіях «Тетріс» досить різноманітне. Очки можуть нараховуватися за прибрані лінії, за скинуті фігурки, за перехід на нову швидкість тощо.
При нарахуванні очок за лінії кількість очок зазвичай залежить від того, скільки ліній прибрано за один раз: 1 лінія — 100 очок, 2 лінії - 300 очок, 3 лінії - 700 очок, 4 лінії (тобто, зробити Тетріс) — 1500 очок. Тобто, чим більше ліній забирається за один раз, тим більше відношення кількості очок до кількості ліній. Цікаво, що тетріс в багатьох версіях гри також називається дія, після якого зникає відразу 4 лінії. Це можна зробити тільки одним способом — скинути «палицю» (фігурку, в якій всі клітини розташовані на одній лінії) в «шахту» ширини 1 і глибини як мінімум 4.
2. ПРОЕКТ ПРОГРАМИ
2.1 Опис об'єктів Виходячи з аналізу предметної області та опису гри, у програмі будуть використовуватись наступні об'єкти:
— фігури:
а) кубик — представляє з себе фігуру, яка показана на рисунку 2.1;
Рисунок 2.1 — Ігрова фігура кубик б) блискавка — представляє з себе фігуру, яка показана на рисунку 2.2;
Рисунок 2.2 — Ігрова фігура блискавка в) балка — представляє з себе фігуру, яка показана на рисунку 2.3;
Рисунок 2.3 — Ігрова фігура балка г) T — фігура — представляє з себе фігуру, яка показана на рисунку 2.4;
Рисунок 2.4 — Ігрова фігура T — фігура
— ігрове поле — представляє собою порожній стакан. Фігури падають з верху вниз, у вільному порядку. Управління грою здійснюється клавішами, які наведено у таблиці 2.1:
Таблиця 2.1 — Опис клавіш управління грою
Назва клавіші | Виконувана функція | |
Стрілка вправо | Зрушення фігури вправо | |
Стрілка вліво | Зрушення фігури вліво | |
Стрілка вгору | Поворот фігури навколо власної осі за годинниковою стрілкою | |
Стрілка вниз | Падіння фігури до дна стакана | |
ESC | Кінець гри | |
— інформаційне поле — представляє собою окремий блок в якому показано нараховані очки, рівень гри та наступна фігура, яка випаде;
— меню — представляє собою такі пункти:
а) Гра (Game) — дозволяє почати нову гру або продовжити почату;
б) Опис програми (About) — проглянути текст опису, правил гри;
в) Вихід (Exit) — дозволяє вийти з гри;
— менеджер гри — модуль, який слідкує за ігровим полем, а саме, аналізує розташування фігур, підраховує очки та завершує гру.
2.2 Ієрархія об'єктів Для побудови ієрархії об'єктів, використаємо відповідний опис, що наведено вище. Головним об'єктом, який буде організовувати роботу програми, є «Меню». Воно складається з елементів: гра, опис та вихід. Розглянемо детально елемент гра, який організовує процес взаємодії користувача та програми. Даний елемент включає такі об'єкти, як «Менеджер гри». Основні задачі даного об'єкту слідкувати за зміною розташування елементів ігрової сцени та виконувати аналіз побудови фігур. Об'єкти «Ігрове поле» та «Інформаційне поле» слідкують, відповідно, за зміну розташування фігур та елементів «Наступна фігура» та «Очки».
На рисунку 2.5 показано ієрархію об'єктів.
Рисунок 2.5 — Ієрархія об'єктів
2.3 Ієрархія наслідування Розглянемо з яких методів складається кожен клас та які властивості вони мають. Нижче перелічені класи:
Виходячи з вище описаного можна побачити, що деякі класи мають спільні властивості та методи. Беручи це до уваги можна виконати побудову ієрархію наслідування.
При побудові діаграми класів будемо використовувати такий вид класів, абстрактний клас. Абстрактний клас в об'єктно-орієнтованому програмуванні - базовий клас, об'єкти якого ніколи не будуть реалізовані, який не передбачає створення екземплярів. Абстрактні класи реалізують на практиці один з принципів ООП — поліморфізм. Абстрактний клас може містити (і не містити) абстрактні методи і властивості. Абстрактний метод не реалізується для класу, в якому описаний, однак повинен бути реалізований для його неабстрактних нащадків. Абстрактні класи являють собою найбільш загальні абстракції, тобто мають найбільший обсяг і найменше зміст.
Такий клас може існувати з єдиною метою-бути батьківським по відношенню до довільних класів, об'єкти яких будуть реалізовані. Ще він може служити ланкою для створення ієрархічної структури класів.
В одних мовах створювати екземпляри абстрактних класів заборонено, в інших це допускається (наприклад, Delphi), але звернення до абстрактного методу об'єкта цього класу в процесі виконання програми призведе до помилки. У багатьох мовах допустимо оголосити будь-який клас абстрактним, навіть якщо в ньому немає абстрактних методів (наприклад, Java), саме для заборони створення екземплярів. Абстрактний клас можна розглядати в якості інтерфейсу до сімейства класів, породженому ним, але, на відміну від класичного інтерфейсу, абстрактний клас може мати певні методи, а також властивості.
Властивості: Х, У — координати розміщення.
Методи: Show () — відображає вікно.
Hide () — метод за допомогою якого можна сховати вибраний елемент.
MoveObject — абстрактний клас для рухомих об'єктів.
Властивості: dx, dy — зміщення відносно початкового стану.
Методи: move () — виконує зсув на величини dx, dy.
Rotate () — повертає об'єкт.
Unmove_Object — абстрактний клас для не рухомих об'єктів.
Методи: get Info () — отримує статус.
resetInfo () — обнулює статус.
На рисунку 2.6 показано ієрархію наслідування об'єктів.
Рисунок 2.6 — Ієрархія наслідування
2.4 Розробка інтерфейсу користувача Для роботи з програмою реалізуємо інтерфейс користувача. Після запуску гри, користувач повинен мати можливість вибрати потрібний йому модуль. Як було визначено раніше, а саме на рисунку 2.5, до основних модулів відносяться:
— гра;
— опис;
— вихід.
Покажемо за допомогою ескізу вигляд головного меню, який наведено на рисунку 2.7.
Рисунок 2.7 — Вигляд головного меню програми Для отримання додаткової інформації про правила гри та опис, як нею користуватися, потрібно розробити форму, яка буде надавати необхідну інформацію. Вигляд форми показано на рисунку 2.8.
Рисунок 2.8 — Вигляд форми опису
Для того щоб почати гру, вивести очки та рівень потрібно розробити форму ігрове поле. Вигляд форми гри показано на рисунку 2.9.
Рисунок 2.9 — Вигляд форми гри
2.5 Алгоритми основних модулів У даному підрозділі розглянемо основні алгоритми, які будуть реалізовані у даному проекті. Основний алгоритм роботи головної форми показано на рисунку 2.10. Він є не складним і показує розгалуження виконання команд в залежності від вибору користувача.
Наступний алгоритм, що реалізується у даному проекті, це алгоритм переміщення фігури униз. Основна ідея, яка лежить в його основі, полягає у наступному. Усі елементи сітки, які мають значення 1, потрібно перемістити на одну позицію униз, при умові, що комірка має значення 0. Якщо переміщення не вдається, то елемент зупиняється і йому присвоюється значення 2. Алгоритм показано на рисунку 2.12.
Алгоритм аналізу можливості переміщення представляє з себе цикл, в якому перевіряється сусідні елементи сітки на можливість переміщення. Якщо сусідній елемент має значення 2, то переміщення забороняється. Інакше продовжуємо перевірку. Алгоритм показано на рисунку 2.13.
Рисунок 2.10 — Алгоритм роботи основної форми тетріс гра алгоритм Представлення ігрового поля. Для аналізу стану використаємо масив
int field[20][10]= {0};
0- порожня комірка;
1-рухома комірка;
2-нерухома комірка.
Рисунок 2.11 — Алгоритм ігрового поля
Рисунок 2.12 — Блок-схема алгоритму переміщення фігури вниз
Рисунок 2.13 — Блок-схема алгоритму перевірки можливості зміни розташування фігури
ВИСНОВКИ В даній курсовій роботі було розроблено програмне забезпечення гра «Тетріс». Результати розробки наведені у додатку Б. Для досягнення поставленої цілі були розкриті наступні етапи:
— аналіз та опис предметної області;
— проект програми, який включає розробку діаграми об'єктів та наслідування, проектування інтерфейсу та розробку алгоритмів;
— кодування гри;
— аналіз результатів.
До недоліків роботи можна віднести наступне:
— для організації гри були використані стандартні засоби візуального програмування TImage, які є слабкими у порівнянні з спеціалізованими графічними бібліотеками. Через що у грі, при переміщенні об'єктів, відбуваються сильні мерехтіння;
— не реалізовані функції обертання фігур та повідомлення про наступну фігуру.
Зазначені зауваження не є принциповими до дисципліни «Обєктно-орієнтоване програмування» і тому у цілому можна вважати, що всі поставлені задачі виконано.
За допомогою цієї програми можна приємно провести час, удосконалювати координацію і розвивати логічне мислення. Програма не займає багато місця, не вимоглива до встановленого програмного забезпечення.
При оформленні курсового проекту були одержані навики написання програмного забезпечення, а також великий практичний досвід роботи з мовою програмування C++ у середовищі Borland C++ Builder.
Теоретичні відомості були закріплені практичними заняттями.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. C++Builder 6. Справочное пособие. Книга Классы и компоненты.
2. Работа с базами данных в C++ Builder
3. C++Builder 6. Справочное пособие. Книга 1. Язык C++.
4. Borland C++ Builder. Освой самостоятельно
5. Культин Н. Б. Самоучитель C++ Builder
6. Программирование в С++ Builder 6 и 2006
7. C++ Builder 5. Руководство разработчика.
8. C# Builder. Быстрый старт
9. http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%82%D1%80%D0%B8%D1%81
Додаток, А — Текст програми Лістинг А.1 — фрагмент модулю game. cpp
//—————————————————————————————————————;
#include
#pragma hdrstop
#include «game.h»
//—————————————————————————————————————;
#pragma package (smart_init)
#pragma resource «*.dfm»
TForm3 *Form3;
//—————————————————————————————————————;
__fastcall TForm3: TForm3(TComponent* Owner)
: TForm (Owner)
{
}
//—————————————————————————————————————;
void __fastcall TForm3: Timer1Timer (TObject *Sender)
{
// перерисовывать сцену
if (fld->isEmpty ())
{
fld->newFigure ();
}
fld->Hide (Image2->Canvas);
fld->moveDown ();
fld->Show (Image2->Canvas);
}
//—————————————————————————————————————;
void __fastcall TForm3: Button1Click (TObject *Sender)
{
// fld->Show (Image2->Canvas);
}
//—————————————————————————————————————;
void __fastcall TForm3: Button2Click (TObject *Sender)
{
Timer1->Enabled = false;
}
//—————————————————————————————————————;
void __fastcall TForm3: Label4Click (TObject *Sender)
{
Timer1->Enabled = true;
fld = new fieldFigures (Image2->Width / 10, Image2->Height / 20);
}
//—————————————————————————————————————;
void __fastcall TForm3: Label5Click (TObject *Sender)
{
Timer1->Enabled = false;
}
//—————————————————————————————————————;
void __fastcall TForm3: FormKeyDown (TObject *Sender, WORD &Key,
TShiftState Shift)
{
switch (Key)
{
case 37: fld->Hide (Image2->Canvas);
fld->moveLeft ();
fld->Show (Image2->Canvas);
break;
case 39:
fld->Hide (Image2->Canvas);
fld->moveRight (); break;
fld->Show (Image2->Canvas);
}
}
//—————————————————————————————————————;
Лістинг А.2 — модуль field. cpp
//—————————————————————————————————————;
#pragma hdrstop
#include «field.h»
//—————————————————————————————————————;
#pragma package (smart_init)
fieldFigures: fieldFigures (int w, int h)
{
width = w;
height = h;
empty = true; // признак того, что поле не занято
fig = new Figures ();
//инициализируем массив поля
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
matr[i][j] = 0;
}
}
}
void fieldFigures: moveDown () // блок-схема 1
{
if (!canMove ()) // если не можем опустить фигуру
{
empty = true; // освобождаем поле, а 1 превращаем в 2
for (int i = N — 1; i > 0; i—)
{
for (int j = 0; j < M; j++) if (matr[i][j] == 1) matr[i][j] = 2;
}
}
else
{
for (int i = N — 1; i > 0; i—)
{
for (int j = 0; j < M; j++)
if (matr[i — 1][j] == 1)
{
matr[i][j] = matr[i — 1][j];
matr[i — 1][j] = 0;
}
}
}
}
void fieldFigures: moveLeft () // блок-схема 1
{
if (canMoveLeft ()) // если не можем опустить фигуру
{
for (int i = N — 1; i > 0; i—)
{
for (int j = 0; j < M — 1; j++)
if (matr[i][j+1] == 1)
{
matr[i][j] = matr[i][j+1];
matr[i][j+1] = 0;
}
}
}
}
void fieldFigures: moveRight () // блок-схема 1
{
if (canMoveRight ()) // если не можем опустить фигуру
{
for (int i = N — 1; i > 0; i—)
{
for (int j = M — 1; j > 0; j—)
if (matr[i][j — 1] == 1)
{
matr[i][j] = matr[i][j — 1];
matr[i][j — 1] = 0;
}
}
}
}
bool fieldFigures: isLine ()
{
return false;
}
int fieldFigures: isDraw (int i, int j)
{
return matr[i][j] == 0? false: true;
}
void fieldFigures: Show (TCanvas *can)
{
can->Pen->Color = clBlack;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
if (isDraw (i, j))
{
can->Rectangle (j * getWidth (), i * getHeight (),
(j + 1) * getWidth (), (i + 1) * getHeight ());
}
}
}
void fieldFigures: Hide (TCanvas *can)
{
can->Pen->Color = clWhite;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
if (isDraw (i, j))
{
can->Rectangle (j * getWidth (), i * getHeight (),
(j + 1) * getWidth (), (i + 1) * getHeight ());
}
}
}
void fieldFigures: newFigure ()
{
empty = false;
int Num = fig->getRand (MAX_FIG);
for (int i = 0; i < 3; i++)
{
for (int j = 3; j < 6; j++)
{
if (matr[i][j] + figArr[Num][i][j — 3] <= 1) // если можно вставить фигуру
{
matr[i][j] += figArr[Num][i][j — 3];
}
else gameOver ();
}
}
}
void fieldFigures: gameOver ()
{
// ShowMessage («Game Over!!!»);
}
bool fieldFigures: canMove () // блок-схема 2
{
bool res = true;
// сначала проверяем нижнюю строку на наличие 1
for (int j = 0; j < M; j++)
if (matr[N-1][j] == 1)
{
res = false; break;
}
if (!res) return res;
else
{
// проверяем весь массив на 2
for (int i = N — 2; i >= 0; i—)
{
for (int j = 0; j < M; j++)
{
if ((matr[i][j] == 1) && (matr[i+1][j] == 2))
{
res = false;
break;
}
}
}
return res;
}
}
bool fieldFigures: canMoveLeft () // блок-схема 2
{
bool res = true;
// сначала проверяем 0 столбец на наличие 1
for (int i = 0; i < N; i++)
if (matr[i][0] == 1)
{
res = false; break;
}
if (!res) return res;
else
{
// проверяем весь массив на 2
for (int i = N — 1; i >= 0; i—)
{
for (int j = 1; j < M; j++)
{
if ((matr[i][j] == 1) && (matr[i][j-1] == 2))
{
res = false;
break;
}
}
}
return res;
}
}
bool fieldFigures: canMoveRight () // блок-схема 2
{
bool res = true;
// сначала проверяем M столбец на наличие 1
for (int i = 0; i < N; i++)
if (matr[i][M-1] == 1)
{
res = false; break;
}
if (!res) return res;
else
{
// проверяем весь массив на 2
for (int i = N — 1; i >= 0; i—)
{
for (int j = 0; j < M — 1; j++)
{
if ((matr[i][j] == 1) && (matr[i][j+1] == 2))
{
res = false;
break;
}
}
}
return res;
}
}
Додаток Б — Результати роботи програми Нижче показані знімки екранних форм, які було отримано у даному проекті.
Рисунок Б.1 — Головна форма Рисунок Б.2 — Форма гри Рисунок Б.3 — Форма опис Рисунок Б.4 — Форма правила
Додаток В — Календарний план виконання курсового проекту
КАЛЕНДАРНИЙ ПЛАН виконання курсового проекту Тема: розробка програмного забезпечення гра «Тетріс»
№ | Найменування роботи | Початок | Закінчення | Примітки | |
дослідження предметної області; | 20.01.2012 | 03.02.2012 | |||
огляд прототипів; | 03.02.2012 | 17.02.2012 | |||
розробити архітектуру програмного забезпечення; | 17.02.2012 | 29.02.2012 | |||
реалізувати програмне забезпечення; | 01.03.2012 | 10.04.2012 | |||
Розробив студент Єлік Ольга Андріївна
(прізвище, ім'я, по батькові студента) Керівник роботи Мартиновський Іван Михайлович
(посада, прізвище, ім'я, по батькові)