- •Завдання
- •В якому середовищі програма розроблена
- •Що отримаємо в результаті
- •1. Реалізація курсової роботи
- •1.1 Постановка задачі
- •1.2 Вибір засобів розробки програми
- •1.3 Опис алгоритму
- •2. Опис програми
- •2.1 Структура програми
- •2.2 Опис бібліотек
- •2.3 Опис інтерфейсу користувача
- •2.4 Опис данних
- •2.5 Опис роботи програми
2.3 Опис інтерфейсу користувача
Програма реалізує об'єктно-орієнтований варіант інтерфейсу, в середовищі C++ Builder. Інтерфейс забезпечується повідомленнями користувачеві, зразки яких, джерело виникнення та опис ситуації наведені у таблиці 2.3.
Таблиця 2.3 – Повідомлення користувачеві
Повідомлення |
Джерело |
Опис ситуації |
Игра окончена |
void gameOver (void) {} |
Координати змійки збіглися з границею поля |
Поздравляем, вы прошли уровень!!! |
void Win(void) {} |
Ви пройшли рівень гри |
І
нтерфейс
гри змійка
2.4 Опис данних
У цьому проекті не використовуються вхідні дані тобто користувач нічого не вводить з клавіатури .
Використовуються допоміжні змінні :
int world[25][25] |
Ігрове поле |
int east, south, relativeE, relativeS, wrappedE, wrappedS; |
Змінні, які відповідають за частини ігрового поля |
int snakeE[650], snakeS[650], snakeHeadE, snakeHeadS, snakeTailE, snakeTailS, segment; |
Позиції кожного сегменту змійки |
int snakeLength; |
Довжина змійки |
int direction, lastDirection, reverseDirection; |
Напрямок змійки |
int w=0; |
Кількість пройдених рівнів |
int maxSize = 25. |
Максимальний розмір поля |
Вихідні дані
Повідомлення |
Джерело |
Опис ситуації |
Игра окончена. Размер змеи: |
void gameOver (void) {} |
Координати змійки збіглися з границею поля |
Поздравляем, вы прошли уровень!!! |
void Win(void) {} |
Ви пройшли рівень гри |
2.5 Опис роботи програми
Спочатку з'являється форма, яка відображає меню гри. За меню відповідає функція __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner).
Потім при натисканні клавіші нової гри, об’являються змінні які потім використовуватимуться для роботи програми.
bool ateFood = false; //їжа
// світ
int world[25][25];
// змінні які відповідають за частини ігрового поля
int east, south, relativeE, relativeS, wrappedE, wrappedS;
// позиції кожного сегменту змійки
int snakeE[650], snakeS[650];
int snakeHeadE, snakeHeadS;
int snakeTailE, snakeTailS;
int snakeLength;
int segment;
int direction, lastDirection, reverseDirection; //напрямок
int w=0; //вінрейт
int maxSize = 25; //максимальний розмір поля
Наступною частиною є головна функція
void __fastcall TForm1::Timer1Timer(TObject *Sender){}
яка працює по запуску таймера та повністю відповідає за рух та напрямок змійки , використовуючи допоміжні функції які знаходяться в наступній частині программи :
void music(void) {}
Відповідає за музику на фоні
void render(void) {}
Формує ігрове поле рівня
void makeRandomSnake (void) {}
Генерує випадкову позицію змійки
void clearAll (void) {}
Очищає поле
void Win(void) {}
Функція, яка відповідає за виведення повідомлення про виграш
void gameOver (void) {}
Закінчує гру.
void makeRandomFood (void) {}
Виставляє на полі їжу.
void makeRandomPoison (void) {}
Виставляє стіни.
void Exit(void) {}
Вихід.
void step (void) {}
Відповідає за кожну дію змійки.
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
Прослуховує натиснуті клавіші.
void __fastcall TForm1::N5Click(TObject *Sender)
Пауза (зупинка таймера).
void __fastcall TForm1::N6Click(TObject *Sender)
Продовження гри.
void __fastcall TForm1::N7Click(TObject *Sender)
Виведення інформації.
void __fastcall TForm1::Button1Click(TObject *Sender)
Клавіша, яка відповідає за початок нової гри або за перехід на новий рівень.
Висновок
У ході виконання курсової роботи були вивчені основи програмування мовою С + +. Написання програми сприяло закріпленню теоретичного матеріалу на практиці.
Гра "Змійка" є логічно завершеною грою. Також можливі зміни і удосконалення деяких моментів в геймплеї, такі як мультиплеер і додавання на ігровому полі перешкод.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
C++Builder 6. Справочное пособие. Книга Классы и компоненты.
Работа с базами данных в C++ Builder
C++Builder 6. Справочное пособие. Книга 1. Язык C++.
Borland C++ Builder. Освой самостоятельно
Культин Н. Б. Самоучитель C++ Builder
Программирование в С++ Builder 6 и 2006
C++ Builder 5. Руководство разработчика.
C# Builder. Быстрый старт
Додаток А – Текст програми
#include <vcl.h>
#include <iostream>
#include <time.h>
#pragma hdrstop
#pragma hdrstopFlag
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
bool ateFood = false; //їжа
// світ
int world[25][25];
// змінні які відповідають за частини ігрового поля
int east, south, relativeE, relativeS, wrappedE, wrappedS;
// позиції кожного сегменту змійки
int snakeE[650], snakeS[650];
int snakeHeadE, snakeHeadS;
int snakeTailE, snakeTailS;
int snakeLength;
int segment;
int direction, lastDirection, reverseDirection; //напрямок
int w=0; //вінрейт
int maxSize = 25; //максимальний розмір поля
TForm1 *Form1;
//---------------------------------------------------------------------------
void music(void) {
Form1->MediaPlayer1->FileName = "fon.mp3";
Form1->MediaPlayer1->Open();
Form1->MediaPlayer1->Play();
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
PlaySound("F:\\Labs\\My Game\\music.wav", NULL, SND_ASYNC|SND_LOOP);
Form1->Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void render(void) { //формування поля
for (east=0; east<maxSize; east++) {
for (south=0; south<maxSize; south++) {
switch (world[east][south]) {
case 0: //фон поля
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->Brush->Color=clBlack;
Form1->Canvas->Rectangle
(east*20,south*20,east*20+20,south*20+20);
break;
case 1: //колір змії
Form1->Canvas->Pen->Color=clGreen;
Form1->Canvas->Brush->Color=clGreen;
Form1->Canvas->Rectangle
(east*20,south*20,east*20+20,south*20+20);
break;
case 2: //колір їжі
Form1->Canvas->Pen->Color=clRed;
Form1->Canvas->Brush->Color=clRed;
Form1->Canvas->Ellipse
(east*20,south*20,east*20+20,south*20+20);
break;
case 3: //колір отрави
Form1->Canvas->Pen->Color=clGray;
Form1->Canvas->Brush->Color=clGray;
Form1->Canvas->Rectangle
(east*20,south*20,east*20+20,south*20+20);
break;
}
}
}
}
void clearAll (void) { //очистка поля
for (east=0; east<maxSize; east++) {
for (south=0; south<maxSize; south++) {
world[east][south]=false;
}
}
for (int i = 0; i < 650; i++) {
snakeE[i] = -1;
snakeS[i] = -1;
}
render();
}
void gameOver (void) { //"Кінець гри"
Form1->Timer1->Enabled = false;
Form1->MediaPlayer1->Stop();
Form1->Button1->Caption="Новая игра";
PlaySound("F:\\Labs\\My Game\\go.wav", NULL, SND_ASYNC);
ShowMessage("Игра окончена. Размер змеи: "+IntToStr(snakeLength));
w=0;
}
void makeRandomFood (void) { //розстановка їжі
for (int i = 0; i < 20+w; i++) {
world[random(25)][random(25)] = 2;
}
}
void makeRandomPoison (void) { //розстановка стін
for (int i = 0; i < 20; i++) {
world[random(25)][random(25)] = 3;
}
}
void Exit(void) { //Вихід із програми
Application->Terminate();
}
void Win(void) { //Виграш
Form1->Timer1->Enabled = false;
Form1->MediaPlayer1->Stop();
Form1->Button1->Caption="Новый уровень";
PlaySound("F:\\Labs\\My Game\\win.wav", NULL, SND_ASYNC);
ShowMessage("Поздравляем!!! Вы прошли " + IntToStr(w)+ " уровень! Нажмите Новый уровень, чтобы перейти на новый уровень.");
}
void makeRandomSnake (void) { //установка змійки
Randomize();
// розпочати з направлення вверх чи вниз
lastDirection = 1;
int flip = random(2);
switch (flip) {
case 0:
direction = 0;
break;
case 1:
direction = 2;
break;
}
// розпочати з випадкової позиції голови
snakeHeadE = 1 + random(15);
snakeHeadS = 1 + random(23);
// встановлення розміру змійки
snakeLength = 3;
// розташувати змійку горизонтально
for (int span = 0; span < snakeLength; span++) {
world[snakeHeadE + span][snakeHeadS] = true;
snakeE[span] = snakeHeadE + span;
snakeS[span] = snakeHeadS;
}
snakeTailE = snakeHeadE + snakeLength - 1;
snakeTailS = snakeHeadS;
Form1->Timer1->Enabled = true;
}
void step (void) {
// куди буде переміщатися змійка
switch (direction) {
case 0: // вверх
snakeHeadS--;
if (snakeHeadS < 0) snakeHeadS = 24;
break;
case 1: // вправо
snakeHeadE++;
if (snakeHeadE > 24) snakeHeadE = 0;
break;
case 2: // вниз
snakeHeadS++;
if (snakeHeadS > 24) snakeHeadS = 0;
break;
case 3: // вліво
snakeHeadE--;
if (snakeHeadE <0) snakeHeadE = 24;
break;
}
// якщо з'їсти яд або себе, то гра закінчується
if (world[snakeHeadE][snakeHeadS] == 3) gameOver();
if (world[snakeHeadE][snakeHeadS] == 1) gameOver();
// якщо з'їсти їжу, змійка збільшується
if (world[snakeHeadE][snakeHeadS] == 2) ateFood = true;
world[snakeHeadE][snakeHeadS] = true;
// розміщення кожного сегменту змійки...
for (segment = snakeLength + 1; segment > 0; segment --) {
snakeE[segment] = snakeE[segment - 1];
snakeS[segment] = snakeS[segment - 1];
}
// ... і її голови
snakeE[segment] = snakeHeadE;
snakeS[segment] = snakeHeadS;
// видалити останній сегмент змії, якщо їжа не була з'їдена
if (!ateFood) { //якщо не з'їсти їжу
snakeTailE = snakeE[snakeLength ];
snakeTailS = snakeS[snakeLength ];
}
if (ateFood) { //якщо з'їсти їжу
snakeLength++; //розмір збільшиться
ateFood = false; //їжа зникне з поля
PlaySound("F:\\Labs\\My Game\\eat.wav", NULL, SND_ASYNC);
}
lastDirection = direction; // переміщення змійки
world[snakeTailE][snakeTailS] = false;
render();
// рахування набраних очків, очки відповідають розміру змійки, тобто початкова кількість очків - 3
Form1->EditLength->Text = snakeLength;
if (snakeLength>21+w) {w=w+1; Win();}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PlaySound("F:\\Labs\\My Game\\start.wav", NULL, SND_ASYNC);
music();
Form1->Timer1->Enabled = true;
clearAll();
makeRandomFood();
makeRandomPoison();
makeRandomSnake();
render();
EditLength->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Exit();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
Exit();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
step();
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key == VK_LEFT) direction = 3;
if (Key == VK_RIGHT) direction = 1;
if (Key == VK_UP) direction = 0;
if (Key == VK_DOWN) direction = 2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N7Click(TObject *Sender)
{
ShowMessage("Created by DimonsTools" "\n dimonstools@googlemail.com" "\n 2014 БЧКІ 1-13" "\n @Все права защищены конгломератом беременных бегемотов");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
Form1->Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N6Click(TObject *Sender)
{
Form1->Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
PlaySound("F:\\Labs\\My Game\\start.wav", NULL, SND_ASYNC);
music();
Timer1->Enabled = !Timer1->Enabled;
clearAll();
makeRandomFood();
makeRandomPoison();
makeRandomSnake();
render();
}
//---------------------------------------------------------------------------
Додаток Б – Результати роботи програми
Нижче показані знімки екранних форм, які було отримано у даному проекті.
