Розробка гри Відбивання кульки

Курсова робота

Розробка гри “Відбивання кульки”


















 Зміст

Завдання_________________________________________________________2

Зміст____________________________________________________________3

Вступ___________________________________________________________ 4

 Розробка і обґрунтування технічного завдання______________6

       1.1. Вимоги користувача___________________________________6

       1.2. Вимоги до програмної реалізації________________________  6

       1.3 Функціональні можливості програми_____________________ 7

       1.4. Можливі зміни програми з метою вдосконалення__________ 7

      1.5. Варіантний аналіз і вибір методу вирішення основної задачі_ 7    

 Розробка структури програмної системи___________________8

      2.1. Початок загального алгоритму вирішення задачі___________8

      2.2. Структурні зв’язки між функціями програми______________9

Програмна реалізація___________________________________ 9

 Тестування і перевірка програми________________________ 10

     4.1. Розробка тестів_______________________________________10

     4.2. Аналіз результатів роботи  програми_____________________10

 Висновки ____________________________________________11

 	Список  використаної літератури_________________________12

	Додатки______________________________________________13

     Додаток А. Текст програми гри “Відбивання кульки”

   (Kurs.cpp)________________________________________________14

      Додаток Б. Вікно програми________________________________26


Вступ

Розвиток обчислювальної техніки супроводжується створенням нових і вдосконаленням існуючих мов програмування—засобів спілкування програмістів з ЕОМ. Під мовою програмування розуміють правила подання даних і запису алгоритмів їх обробки, що автоматично виконуються ЕОМ. У більш абстрактному вигляді, – це засіб створення програмних моделей об’єктів і явищ зовнішнього світу. На сьогодні вже створено десятки різних мов (як примітивних, так і близьких до мови людини).

Їх розвиток невпинно йшов від першої мови асемблера до мов високого рівня і до систем автоматизованого проектування. Під час розробки мов програмування за мету ставилося розробити мову, яка могла б виконувати всі необхідні для роботи функції і при цьому не була б складною у використанні.

З часом мови програмування ставали все ефективнішими та зрозумілими навіть для рядових користувачів. За їх допомогою стало можливим одним рядком описувати функції, для опису яких мовами молодших поколінь потрібно було б сотні-тисячі рядків початкового коду.



C++ – універсальна мова програмування, що належить до високорівневих, трансльованих, об’єктно-орієнтованих мов. Була розроблена Бьярном Страуструпом у 1983 році. Базується на мові Сі. У 1990-х роках С++ стала однією з найуживаніших мов програмування загального призначення. 

Нововведенням С++ в порівнянні з С є: підтримка об’єктно-орієнтованого програмування через класи, підтримка узагальненого програмування через шаблони, доповнення до стандартної бібліотеки, додаткові типи даних, виключень, простору імен, вбудовувані функції, посилання і оператори керування вільно розподілюваною пам’яттю.

Мова С++ має достатньо шиpокi гpафiчнi можливостi. Всi необхiднi визначення для графiчного модуля мови С++ дано в файлi graphics.h . При виборi вiдповiдного режиму вiн повинен бути включеним в програму за допомогою директиви #include<graphics.h>, а перед використанням графічних функцій повинна бути проініціалізована графічна система (вказаний графічний драйвер та режим його роботи).


1 Розробка і обґрунтування технічного завдання



1.1 Вимоги користувача

Необхідно розробити програму, що відтворює гру “Відбивання кульки”, в якій приймають участь двоє гравців.

Після запуску програми на екрані повинне з’явитися меню, з пунктами для початку гри, виведення підказки, інформації про автора гри та для виходу з меню.

Пункти меню:

“Нова гра” – запуск гри. Після натискання даної клавіші у робочому вікні з’являється одне за одним меню для вибору кількості ігор (партій) (3, 5, 10) та швидкості руху кульки (3 швидкості), а за ними і ігрове поле. Ігрове поле розділено на дві частини. Зліва та справа присутні лопатки гравців у вигляді прямокутників для відбивання кульки. Знизу ведеться рахунок вдалих ударів для кожного гравця;

„Допомога” – виводить список клавіш, які використовуються у грі;

„Про автора” – виводить інформацію про розробника даної програми;

„Вихід” – дозволяє вийти з програми після її завершення.



1.2. Вимоги до програмної реалізації

Програма повинна відповідати вимогам користувача.

Гра програмується на мові С++. Програміст може використовувати стандартні функції даної мови програмування, а також створювати свої власні, підключати заголовочні файли даного компілятора.

Програма має бути реалізована графічно. Вибір відповідних пунктів меню здійснюється за допомогою клавіш курсора та клавіші ENTER. Програма має витримувати усі тести користувача. На кожній сторінці повинна бути доповнена коментарями.

Програмний комплекс повинен містити стандартні модулі, а також модулі користувача (за наявності), процедури і функції користувача.

Програма повинна відтворювати гру “Відбивання кульки”.



1.3 Функціональні можливості програми

В програмі міститься меню, до пунктів якого можна звертатися у довільному порядку. Вибір конкретного пункту здійснюється за допомогою клавіш курсору та клавіші ENTER. Є можливість вибору кількості партій та швидкості руху кульки для ускладнення гри. За вдалі удари очки нараховуються гравцю, за промахи – супернику. Після того, як сума очок досягає обраної кількості партій, визначається переможець.  



1.4 Можливі варіанти зміни та вдосконалення програми

Для зміни реалізації основної задачі можна внести зміни у функції new_game(), speed(), num(). Наприклад, для зміни інтервалу можливих швидкостей можна змінити параметр функції delay(), що використовується в new_game() для затримки руху кульки, а також розширити можливі варіанти вибору швидкостей у меню з функції speed(). У функції num() можливо збільшити кількість партій. Можна також змінити в new_game() діаметр кульки, розміри лопаток, швидкість їх руху тощо. 

aftvin

1.5 Варіантний аналіз і вибір методу вирішення основної задачі

При розробці даної курсової роботи, основною задачею було зобразити рух об’єкта (кульки), що рухається по полю, відбиваючись від стінок та лопаток гравців, а також здійснення управління самими лопатками доверху та вниз.  

Для цього були розроблені клас point (клас точки на екрані) та клас spot (для роботи з плямою на екрані), що наслідує компоненти класу point: функції void show() – функція зображення плями на екрані, void hide() – функція прибирання плями з екрану, та функція void move(int xn, int yn) – переміщення зображення.

void show() – функція, що малює коло, заповнює її кольором та запам’ятовує його бітовий образ в пам’яті;

void hide() – стирає зображення з екрану;

void move(int xn, int yn) – містить в собі функції hide() та show(). Після стирання зображення змінює координати центру плями та виводить її у новому місці з центром у точці (xn, yn).

Аналогічно до процедур роботи з плямою були створені процедури для роботи з прямокутниками (лопатками): void showr() – малювання прямокутника; void hider() – процедура стирання прямокутника; 

void mover(int xn, int yn) – переміщення прямокутника, де xn, yn – координати його верхнього лівого кута в новій позиції.

Функція new_game() об’єднує роботу всіх вище переглянутих функцій. Основною задачею цієї функції є узгодження роботи всіх інших функцій і перехоплення і оброблення нажатих користувачем клавіш. 



2. Розробка структури програмної системи

2.1. Початок загального алгоритму вирішення задачі

Початок;

Ініціалізація і об’явлення змінних;

Ініціалізація графіки;

Виведення на екран головного меню гри;

Перевіряємо, яка кнопка натиснута:

Якщо натискаємо кнопку “Нова гра”, викликається функція new_game(), а в ній викликаються одна за одною функції num() (повертає значення кількості ігор), speed() (повертає значення швидкості), після завершення двох останніх функцій починається сама гра; 

При натисканні кнопки “Допомога” викликається функція help() з підказкою про використання клавіш у грі;

Якщо натиснута кнопка “Про автора”, то запускається функція about(), яка виводить прізвище, імя розробника програми та деяку інформацію про нього;

Якщо ж натиснути кнопку (Вихід), це приведе до виходу з програми.

Кінець.



2.2. Структурні зв’язки між функціями програми

На початку програми робимо доступними бібліотеки з допомогою заголовних файлів: graphics.h; conio.h; stdlib.h; dos.h.  Потім описуємо функції і підключаємо графічний режим. 

Далі йде виклик функції menu(). Виводиться головне меню гри з чотирма кнопками: 1.Нова гра, 2.Допомога, 3.Про автора, 4.Вихід.

При виборі 1-го пункту запускається функція new_game(), яка виконує головне завдання. В ній викликаються функції num() i speed(), після чого на екран виводиться ігрове поле, малюється в центрі кулька, лінія, що розділяє поле навпіл, два прямокутника по бокам. І після натиснення ENTER кулька починає рухатися по полю, а гравці повинні керувати лопатками та відбивати її.

При натисканні кнопки 2 спрацьовує функція help().

Якщо натиснута кнопка 3, то спрацьовує функція about(), яка при використанні стандартних функцій графічної бібліотеки:	setcolor(), outtextxy(), виводить інформацію, тобто прізвище, імя, та номер групи розробника даної програми.

Коли  натиснута кнопка 4, командою break переривається цикл перевірки і програма закінчує свою роботу.



3. Програмна реалізація

Директива #include<…> призначена для включення в текст програми тексту файла із каталогу “заголовочних файлів”, що постачаються разом зі стандартними бібліотеками компілятора. На початку програми відбувається 

підключення бібліотек graphics.h; conio.h; stdlib.h; dos.h.

graphics.h – використовується для графічної реалізації програми;

stdlib.h – включений в програму для виклику стандартних бібліотечних функцій randomize(), itoa(), random();

conio.h – для стандартної функції getch() та kbhit();

dos.h – для стандартної функції delay().  

В головній функції програми int main() визиваються наступні функції:

initgraph(&dr, &mod,””) – ініціалізація графіки;

menu() – виклик головного меню гри;

closegraph() – закриває графічний режим і переводить систему в текстовий режим.



Тестування і перевірка програми

4.1. Розробка тестів

Тестування  направлене на знаходження та виправлення помилок у програмах. Один з методів тестування базується на спостереженні за роботою програми. Відомо, що помилки у програмному забезпеченні мають схильність групуватися (принцип Парето). В програмі завжди є модулі, які є більш проблематичними, ніж інші. Для даної програми таким модулем є функція new_game(), що виконує в програмі провідну роль.

Отож, запустимо програму і будемо вести спостереження. При тестуванні нас цікавитимуть: 

Чи є помилки у графічній реалізації;

Чи правильно відбивається кулька від стінок та лопаток;

Ситуація, коли кулька пролітає поза лопаткою: чи можемо ми не влучити і чи правильно ведеться рахунок. Для цього необхідно випробувати ряд випадків відбивання кульки в різних положеннях лопаток, а також, спеціально не влучити і впевнитись у тому, що супернику було нараховано очко на його рахунок.



4.2. Аналіз результатів роботи програми

Під час перевірки та тестування було проведено ряд тестів, які було описано вище, і в результаті вияснено, що програма працює більш-менш надійно і злагоджено, помилок виявлено не було.



Висновки

В результаті виконання даної курсової роботи засобами мови програмування С++ було розроблено програму, що реалізує гру “Відбивання кульки”. Виконані всі умови розробки програми.

Під час розробки даного курсового проекту, мною було вдосконалені деякі навички програмування на мові С++.


Список використаної літератури

В.В. Подбельский. Язык С++. М.: Финансы и статистика, 2005.

Шилдт Г. Искусство программирования на С++. СПб.: БХВ-Петербург, 2005

htpp://www.codenet.ru/






























ДОДАТКИ


































Додаток А:



#include <graphics.h>

#include <conio.h>

#include <dos.h>

#include <stdlib.h>

short num()//функцiя вибору кiлькостi iгор

 {

   int x,y,i,key;

   x=212;y=77;

   setcolor(BLUE);

   setlinestyle(0,0,3);

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   settextstyle(0,HORIZ_DIR,2);

   outtextxy(x+45,y+38,"3 гри");

   outtextxy(x+46 ,y+39,"3 гри");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+45,y+38,"5 iгор");

   outtextxy(x+46 ,y+39,"5 iгор");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+45,y+38,"10 iгор");

   outtextxy(x+46 ,y+39,"10 iгор");



   x=212;y=120;i=0;

   setfillstyle(1,4);

   setlinestyle(0,0,0);

   setcolor(4);

   circle(x+24,y+i*90,9);

   floodfill(x+24,y+i*90,4);



   while(!kbhit())

     {

       key=getch();if(key==13) break;//вихiд з функцii

       key=getch();

       //управлiння клавiшами курсора

       switch(key)

        {

          case 72:

            i--;

            if(i<0) i=2;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==2){circle(x+24,y,9);

                floodfill(x+24,y,0);}

            else {circle(x+24,y+(i+1)*90,9);

                floodfill(x+24,y+(i+1)*90,0);}

            break;

          case 80:

            i++;

            if(i>2)i=0;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==0){

                circle(x+24,y+2*90,9);

                floodfill(x+24,y+2*90,0);}

            else {circle(x+24,y+(i-1)*90,9);

                floodfill(x+24,y+(i-1)*90,0);}

            break;

     }

 }

   setlinestyle(0,0,0);

   settextstyle(0,HORIZ_DIR,0);

   setcolor(15);

   setfillstyle(0,14);

   cleardevice();

   if(i==0)return 3;

   if(i==1)return 5;

   if(i==2)return 10;

   return 0;

 }



short speed()//функцiя вибору швидкостi руху плями (кульки)

 {

   int x,y,i,key;

   x=212;y=77;

   setcolor(BLUE);

   setlinestyle(0,0,3);

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   settextstyle(0,HORIZ_DIR,2);

   outtextxy(x+41,y+38,"Швидкiсть 1");

   outtextxy(x+42 ,y+39,"Швидкiсть 1");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+41,y+38,"Швидкiсть 2");

   outtextxy(x+42 ,y+39,"Швидкiсть 2");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+41,y+38,"Швидкiсть 3");

   outtextxy(x+42 ,y+39,"Швидкiсть 3");



   x=212;y=120;i=0;

   setfillstyle(1,4);

   setlinestyle(0,0,0);

   setcolor(4);

   circle(x+24,y+i*90,9);

   floodfill(x+24,y+i*90,4);



   while(!kbhit())

    {

      key=getch();if(key==13) break;//вихiд з функцii

      key=getch();

      //управлiння клавiшами курсора

      switch(key)

        {

          case 72:

            i--;

            if(i<0) i=2;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==2){circle(x+24,y,9);

                floodfill(x+24,y,0);}

            else {circle(x+24,y+(i+1)*90,9);

                floodfill(x+24,y+(i+1)*90,0);}

            break;

          case 80:

            i++;

            if(i>2)i=0;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==0){

                circle(x+24,y+2*90,9);

                floodfill(x+24,y+2*90,0);}

            else {circle(x+24,y+(i-1)*90,9);

                floodfill(x+24,y+(i-1)*90,0);}

            break;

        }

 }

   setlinestyle(0,0,0);

   settextstyle(0,HORIZ_DIR,0);

   setcolor(15);

   setfillstyle(0,14);

   cleardevice();

   return 3-i+1;

 }

void help()//процедура виводу пiдсказки

 {

   settextstyle(0,HORIZ_DIR,2);

   setcolor(RED);

   outtextxy(25,25,"Клавiшi керування:");

   setcolor(GREEN);

   settextstyle(1,HORIZ_DIR,0);

   outtextxy(30,50,"Enter-початок гри");

   setcolor(BLUE);

   outtextxy(30,75,"ПЕРШИЙ ГРАВЕЦЬ:");

   setcolor(GREEN);

   outtextxy(30,100,"W - рух лопатки доверху");

   outtextxy(30,125,"S - рух лопатки донизу");

   setcolor(BLUE);

   outtextxy(30,150,"ДРУГИЙ ГРАВЕЦЬ:");

   setcolor(GREEN);

   outtextxy(30,175,"Up - рух лопатки доверху");

   outtextxy(30,200,"Down - рух лопатки донизу");

   settextstyle(0,HORIZ_DIR,0);

   setcolor(15);

   outtextxy(30,250,"Для виходу натиснiть будь-яку клавiшу...");

   getch();

 }

void about()//процедура виводу iнформацii про автора

 {

   settextstyle(0,HORIZ_DIR,2);

   setcolor(RED);

   outtextxy(25,25,"Автор:");

   setcolor(GREEN);

   settextstyle(1,HORIZ_DIR,0);

   outtextxy(30,50,"студент групи 1IС-05 ТКАЧУК АНДРIЙ");

   settextstyle(0,HORIZ_DIR,0);

   setcolor(15);

   outtextxy(30,100,"Для виходу натиснiть будь-яку клавiшу...");

   getch();

 }

//Клас точки на екранi

class point

{

 protected:     // Захищенi данi класу:

  int x, y;     //Координати точки

  // Прототипи загальнодоступних компонентних функцiй:

 public:

  // Конструктор з параметрами.

  point(int xi  = 0, int yi  = 0);

  int& givex(void);  // Доступ до х  ???

  int& givey(void);  // Доступ до у  ???

  void show(void);   // Зобразити точку на екранi

  // Перемiстити точку в нове мiсце екрану:

  // (хn=0, уn=0 - замовчуванi значення параметрiв)

  void move(int xn = 0, int yn = 0);

 private:  // Власна функцiя класу:

  void hide();    // Забрати з екрану зображення точки

};

//***************************

// Описання функцiй класу.

//***************************

// Описання конструктора класу.

point::point(int xi, int yi)

 {x=xi; y=yi;} // визначення даних об'екту

// Описання функцiй доступа до координат центру

// Описання функцiй зображення точки на екранi

void point::show(void)

  // зафарбовуе пiксель з координатами

  // X, Y  поточним кольором малюнку

{putpixel(x,y,getcolor());}

//Забрати з екрану зображення точки

void point::hide(void)

  // аналогiчно, але кольором фону

 {putpixel(x,y,getbkcolor());}

// Перемiстити точку на нове мicце екрану

// з координатами XN, YN.

void point::move(int xn, int yn)

 {

  //спочатку забираемо з екрану поточну точку

  hide();

  //встановлюемо новi координати точки

  x=xn; y=yn;

  //Зображаемо на экранi точку на новому мicцi

  show();

 }

// Клас роботи з плямою на екранi.

// 'public'  дозволить зберегти статуси доступу

// для наслiдуемих компонентiв класу POINT:

class  spot:public point

{

//Статус доступностi даних в похiдному класi:

 protected:

  int rad;      // Радiус плями (зображення)

  int vis;      // Видимiсть плями на екранi

  int tag;      // Ознака збереження образу в памятi

  void *pspot;  // показник на область пам'ятi для

                // зображення (для бiтового образу)

 public:

  // Конструктор класу SPOT:

  spot(int xi,  int yi,  int  ri):

  // Виклик конструктора базового класу:

  point(xi,yi)

   {

    vis=tag=0; rad = ri;

    // Визначити розмiри бiтового образу та

    // видiлити пам'ять для нього. Розмiр

    // визначаемо, задавши координати ЛIВИЙ

    // ВЕРХНIЙ та ПРАВИЙ НИЖНIЙ.

    pspot = new char[imagesize(xi-ri,yi-ri,xi+ri,yi+ri)];

   }

  ~spot()       // Деструктор класу SPOT

   {

    hide();     // Забрати з екрану зображення плями

    tag =0;    // скинути ознаку збереження в пам'ятi

    delete pspot; // Звiльнити пам'ять бiтового образу

   }

  // Описання функцii зображення плями на екранi

  void show ()

   {  // Якщо бiтового образу НЕМАЕ в пам'ятi:

    if (!tag)

     { // Намалювати поточним кольором на екранi

       // коло вказаного радiуса та центру:

      circle(x,y,rad);

      // Замалювати вже обмежену зону кольорiв

      // границi, де X,Y - внутрiшнi точки зони

      floodfill(x,y,getcolor()) ;

      // Запам'ятати бiтовий образ в пам'ятi:

      getimage(x-rad,y-rad,x+rad,y+rad,pspot);

      // введення ознаки збереження в пам'ятi

      tag=1;

     }

    // Якщо Е, то

    else

    // Перенести зображення з пам'ятi на екран,

    // починаючи з ЛIВОГО ВЕРХНЬОГО, СКIЛЬКИ,

     putimage(x-rad,y-rad,pspot,XOR_PUT);

    vis=1;

   }

  // Описання функцii прибирання плями з екрану

  void hide()

   {

    // Вихiд, якщо немае чого прибирати

    if (!vis) return;

    //  Iнакше,стерти зображення з екрану:

    putimage(x-rad,y-rad,pspot,XOR_PUT);

    // вводимо ознаку очистки екрану

    vis=0;

   }

  // Перемiстити зображення:

  void move(int xn,  int yn)

   {

    hide(); // Прибрати старе зображення з екрану

    // Змiнити координати центру плями:

    x=xn; y=yn;

    show(); // Вивести зображення в новому мiсцi

   }

   void hider()//Процедура стирання прямокутника

   {

    // Вихiд, якщо немае що прибирати

    if (!vis) return;

    // Инакше стерти зображення з екрану:

    putimage(x,y,pspot,XOR_PUT);

    // взвожу ознаку очистки екрану

    vis=0;

   }

   void mover(int xn,int yn)//Процедура переносу прямокутника

   {

   hider();

   x=xn;y=yn;

   showr();

   }

 void showr ()//Процедура малювання прямокутника

   {  // Якщо бiтового образу НЕМАЕ в пам'ятi:

    if (!tag)

     { // Намалювати поточним кольором на екранi

       // прямокутник в заданому мicцi:

      rectangle(x,y,x+5,y+rad);

      // Замалювати уже обмежену зону кольорiв

      // границi, де X,Y - внутрiшнi точки зони

      floodfill(x,y,getcolor()) ;

      // Запам'ятати бiтовий образ в пам'ятi:

      getimage(x,y,x+5,y+rad,pspot);

      // взвод ознаки збереження в пам'ятi

      tag=1;

     }

    // Якщо Е, то

    else

    // Перенести зображення з пам'ятi на екран

    // починаючи з ЛIВОГО ВЕРХНЬОГО, СКIЛЬКИ,

     putimage(x,y,pspot,XOR_PUT);

    vis=1;

   }

};

void new_game()

 {

  int sc,p1=0,ch,p2=0,kol,i,j,dv=5,i1,j1,i2,j2;

  char s1[10],s2[10];

     kol=num();

     sc=speed();

  setfillstyle(1,15);

   {

     i1=10;//Позиiя прямокутника 1го гравця по осi X

     j1=205;//Початкова позиiя 1го гравця по осi Y

     i2=630;//Позиiя прямокутника 2го гравця по осi X

     j2=205;//Початкова позиiя 2го гравця по осi Y

     i=320;//Початкове положення

     j=240;// плями А

     spot A(i,j,3);  // Створюеться невидима пляма А

     spot P1(i1,j1,50);// Створюеться невидимий прямокутник 1го гравця

     spot P2(i2,j2,50);// Прямокутник 2го гравця

     randomize();

     A.show();     // Виведення плями А на екранi

     P1.showr();//Виведення прямокутника 1го гравця на екран

     P2.showr();//Виведення прямокутника 2го гравця на екран

        setcolor(BLUE);

        outtextxy(10,450,"Гравець 1");

        outtextxy(10,460,"Score:");//Виведення рахунку для 1го гравця

        itoa(p1,s1,10);//Переведення рахунку в строковий параметр

        outtextxy(60,460,s1);//Виведення рахунку на екран

        setcolor(RED);

        outtextxy(550,450,"Гравець 2");

        outtextxy(550,460,"Score:");//Виведення рахунку для 2го гравця

        itoa(p2,s2,10);

        outtextxy(600,460,s2);

        setcolor(GREEN);

        line(320,0,320,480);

     do

     //Визначення поведiнки плями А и ii взаемозалеж. з границями екрану

     {

      if((dv==2)&&(j-1<=5))dv=1;//Вiдбиття вiд

      if((dv==4)&&(j-1<=5))dv=3;//верхньоi границi екрану



      if((dv==1)&&(j+1>=475))dv=2;//Вiдбиття вiд

      if((dv==3)&&(j+1>=475))dv=4;//нижньоi границi екрану



      if((i-1<=i1+5)&&(j>=j1-3)&&(j<=j1+55))//Якщо пляма потрапляе в область

      //прямокутника 1го гравця

      {

      if(dv==3)dv=1;     //Вiдбиття вiд

      if(dv==4)dv=2;     //прямокутника 1го гравця

      }



      if(i-1<=5)//Якщо пляма не влучила в прямокутник 1го гравця

      {

      dv=5; //зупинити рух плями А

      setcolor(BLACK);

      outtextxy(600,460,s2);//Замалювати текст попереднього рахунку

      setcolor(RED);

      p2++;

      itoa(p2,s2,10);

      outtextxy(600,460,s2);//Виведення нового рахунку на екран

      kol--;//Зменшити змiнну кiлькостi iгор

      i=320;        //Помiстити

      j=240;        //пляму А в

      A.move(i,j);  //середину екрану

      if(kol==0)ch=27;//Якщо число iгор рiвне 0, вийти

      }



    if((i+1>=i2-5)&&(j>=j2-3)&&(j<=j2+55))//Спiвставлення прямокутника

    //2го гравця та плями А

      {

      if(dv==1)dv=3;     //Вiдбиття руху

      if(dv==2)dv=4;     //вiд прямокутника 2го граця

      }



      if(i+1>=640)

      {

      dv=5;

      setcolor(BLACK);

      outtextxy(60,460,s1);

      setcolor(BLUE);

      p1++;

      itoa(p1,s1,10);

      outtextxy(60,460,s1);//Вивiд на екран змiненого рахунку

      kol--;//Зменшення кiлькостi iгор

      i=320;             //Повернення

      j=240;             //плями А

      A.move(i,j);       //в центр екрану

      if(kol==0)ch=27;//Якщо уci iгри зiгранi - вихiд

      }



      switch(dv)//Змiнa руху плями А

      {//вiдносно заданого напряму

       case 1: i+=1;j+=1;break;

       case 2: i+=1;j-=1;break;

       case 3: i-=1;j+=1;break;

       case 4: i-=1;j-=1;break;

       Default: break;

      }

     A.move(i,j);// Перемiстити пляму A

     if(kbhit())//Якщо натиснута клавiша

     {

      ch=getch();//Запам'ятати код натиснутоi клавiшi

      //Гравець 1 може рухати лише якщо пляма А

      if((dv==3)||(dv==4)){// рухаеться в його сторону



      if((ch==119)&&(j1-5>=5))j1-=5;//при натисненнi клавiшi W, змiнити

      //координаты

      if((ch==115)&&(j1+5<=425))j1+=5;//при натисненнi клавiшi S

      //змiнити координати

      }

      //Гравець 2 може рухати лише якщо пляма А

      if((dv==1)||(dv==2)){//рухаеться в його сторону



      if((ch==72)&&(j2-5>=5))j2-=5;//вверх

      if((ch==80)&&(j2+5<=425))j2+=5;//вниз

      }



      if ((ch==13)&&(dv==5))dv=random(4)+1;//Якщо натиснутий Enter i

                                           //пляма А без руху, змiнити рух плями

      P1.mover(i1,j1);//Показати на екранi нове положення 1го прямокутника

      P2.mover(i2,j2);//Показати на екранi нове положення 2го прямокутника

     }

     delay(5*sc);//Затримка при перемiщеннi плями А

     }

     while(ch!=27);//Вихiд iз циклу при натисненнi Esc

        setcolor(LIGHTGREEN);

        if(p1>p2)outtextxy(260,200,"Гравець 1 перемiг!");

        if(p2>p1)outtextxy(260,200,"Гравець 2 перемiг!");

        outtextxy(260,150,"<<<GAME OVER>>>");

        delay(3000);

     cleardevice();

 }  }

short menu()//функцiя для виводу головного меню i вибору подальших дiй

 {

   int x,y,i,key;

   x=212;y=77;

   setcolor(BLUE);

   setlinestyle(0,0,3);

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   settextstyle(0,HORIZ_DIR,2);

   outtextxy(x+43,y+38,"Нова гра");

   outtextxy(x+44 ,y+39,"Нова гра");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+43,y+38,"Допомога");

   outtextxy(x+44 ,y+39,"Допомога");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+43,y+38,"Про автора");

   outtextxy(x+44 ,y+39,"Про автора");



   y=y+90;

   rectangle(x,y,x+221,y+86);

   rectangle(x+3,y+3,x+221-3,y+86-3);

   circle(x+25,y+43,10);

   outtextxy(x+43,y+38,"Вихiд");

   outtextxy(x+44 ,y+39,"Вихiд");



   x=212;y=120;i=0;

   setfillstyle(1,4);

   setlinestyle(0,0,0);

   setcolor(4);

   circle(x+24,y+i*90,9);

   floodfill(x+24,y+i*90,4);

   while(!kbhit())

     {

       key=getch();if(key==13) break;//вихiд з функцii

       key=getch();

       //управлiння клавiшами курсора

       switch(key)

        {

          case 72:

            i--;

            if(i<0) i=3;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==3){circle(x+24,y,9);

                floodfill(x+24,y,0);}

            else {circle(x+24,y+(i+1)*90,9);

                floodfill(x+24,y+(i+1)*90,0);}

            break;

          case 80:

            i++;

            if(i>3)i=0;

            setfillstyle(1,4);

            setcolor(4);

            circle(x+24,y+i*90,9);

            floodfill(x+24,y+i*90,4);

            setfillstyle(1,0);

            setcolor(0);

            if(i==0){

                circle(x+24,y+3*90,9);

                floodfill(x+24,y+3*90,0);}

            else {circle(x+24,y+(i-1)*90,9);

                floodfill(x+24,y+(i-1)*90,0);}

            break;

        }

     }

   setlinestyle(0,0,0);

   settextstyle(0,HORIZ_DIR,0);

   setcolor(15);

   setfillstyle(0,14);

   cleardevice();

   switch(i)

     {

        case 0:new_game();cleardevice();menu();break;

        case 1:help();cleardevice();menu();break;

        case 2:about();cleardevice();menu();break;

        case 3:break;

     }



    return i;

 }

void main ()

 {

  int dr=DETECT,mod;

  initgraph(&dr,&mod,"");

  menu();

  closegraph();

 }


Додаток Б:















25