Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вараніцький.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
129.17 Кб
Скачать

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)

Клавіша, яка відповідає за початок нової гри або за перехід на новий рівень.

Висновок

У ході виконання курсової роботи були вивчені основи програмування мовою С + +. Написання програми сприяло закріпленню теоретичного матеріалу на практиці.

Гра "Змійка" є логічно завершеною грою. Також можливі зміни і удосконалення деяких моментів в геймплеї, такі як мультиплеер і додавання на ігровому полі перешкод.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

  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. Быстрый старт

Додаток А – Текст програми

#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();

}

//---------------------------------------------------------------------------

Додаток Б – Результати роботи програми

Нижче показані знімки екранних форм, які було отримано у даному проекті.