Гра Більярд

Автор: Пользователь скрыл имя, 03 Апреля 2012 в 23:00, курсовая работа

Описание работы

Дана курсова робота є прикладом реалізації завдання про гру в більярд, написаної із застосуванням об'єктно-орієнтованого програмування на мові високого рівня С++.

Содержание

Вступ
1. Опис моделі більярду
2. Основні класи моделі
2.1. Клас CRect (прямокутник)
2.2. Клас CWall (стінка більярдного столу)
2.3. Клас CHole (луза більярдного столу)
2.4. Клас CBall (більярдна шкуля)
3. Реалізація динамічної поведінки моделі
Висновки
Список літератури

Работа содержит 1 файл

Курсова.doc

— 91.00 Кб (Скачать)

{

hptr-> HitBy (this);

hptr = NULL;

}

Else

hptr = hptr-> GetLink ();

}

/ / Перевірка на потрапляння в стінку

CWall * wptr = listOfWalls;

while (wptr)

{

CRect is = region.IntersectRect (wptr-> GetRegion ());

if (! is.IsRectEmpty ())

{

wptr-> HitBy (this);

wptr = NULL;

}

else

wptr = wptr-> GetLink ();

}

/ / Перевірка на потрапляння в іншу кулю

CBall * bptr = listOfBalls;

while (bptr)

{

if (bptr! = this)

{

CRect is = region.IntersectRect (bptr-> GetRegion ());

if (! is.IsRectEmpty ())

{

bptr-> HitBy (this);

break;

}

}

bptr = bptr-> GetLink ();

}

}

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

void CBall :: HitBy (CBall * pBall)

{

/ / Зменшуємо енергію ударившегося кулі вдвічі

pBall-> SetEnergy (pBall-> GetEnergy () / 2.0);

/ / і додаємо її до власної енергії

energy + = pBall-> GetEnergy ();

/ / Розрахунок нового напряму для поточного кулі

int cx1, cy1, cx2, cy2;

GetCenter (& cx1, & cy1);

pBall-> GetCenter (& cx2, & cy2);

SetDirection (HitAngle (cx1 - cx2, cy1 - cy2));

/ / Модифікація напрямку ударившої кулі

double da = pBall-> GetDirection () - GetDirection ();

pBall-> SetDirection (pBall-> GetDirection () + da);

}

/ / Розрахунок кута між віссю OX і вектором (dx, dy). Функція повертає

/ / значення кута радіанах у діапазоні (0, PI) або (-PI, 0)

double CBall :: HitAngle (double dx, double dy)

{

double na;

if (fabs (dx) <0.05)

na = PI / 2;

else

na = atan (fabs (dy / dx));

if (dx <0)

na = PI - na;

if (dy <0)

na =-na;

return na;

}


3. РЕАЛІЗАЦІЯ ДИНАМІЧНОЇ ПОВЕДІНКИ МОДЕЛІ

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

В обробнику події миші MouseButtonDown () імітується удар києм по білій кулі. Цій кулі приписується деяка початкова енергія і напрям руху "на вказівник миші".

 

void CALLBACK MouseButtonDown (AUX_EVENTREC * event)

{

/ / Запам'ятовування координат покажчика миші в правій системі координат,

/ / пов'язаної з нижнім лівим кутом вікна (тому що в структурі event

/ / вони зберігаються в лівій системі координат, пов'язаної з лівим

/ / верхнім кутом вікна)

int mouse_x = event-> data [0];

int mouse_y = WINDOW_HEIGHT - event-> data [1];

/ / Білій кулі передається деяка початкова енергія

pCueBall-> SetEnergy (20.0);

/ / і присвоюється напрямок руху "на вказівник"

int cx, cy;

pCueBall-> GetCenter (& cx, & cy);

pCueBall-> SetDirection (pCueBall-> HitAngle (mouse_x-cx, mouse_y-cy));

/ / Прапор наявності хоча б одної рухомої кулі

fBallMoved = true;

}

 

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

 

/ / Фонова функція

void CALLBACK Idle ()

{

/ / Положення куль оновлюється, тільки якщо є хоча б

/ / одна рухома куля

if (! fBallMoved)

return;

/ / Оновлення положення куль

fBallMoved = false;

CBall * bptr = listOfBalls;

while (bptr)

{

bptr-> Update ();

bptr = bptr-> GetLink ();

}

Display (); / / Відображення сцени

Sleep (25); / / Затримка на 25 мс

}

Функція відображення сцени реалізована досить прямолінійно: в режимі подвійної буферизації малюються всі графічні об'єкти.

void CALLBACK Display ()

{

glClear (GL_COLOR_BUFFER_BIT);

/ / Малювання стінок столу

CWall * pWall = listOfWalls;

while (pWall)

{

pWall-> Draw ();

pWall = pWall-> GetLink ();

}

/ / Малювання луз

CHole * pHole = listOfHoles;

while (pHole)

{

pHole-> Draw ();

pHole = pHole-> GetLink ();

}

/ / Малювання куль

CBall * pBall = listOfBalls;

while (pBall)

{

pBall-> Draw ();

pBall = pBall-> GetLink ();

}

auxSwapBuffers ();

}


Висновки

Об'єктно-орієнтоване програмування (ООП) - це сукупність понять (клас, об'єкт, інкапсуляція, поліморфізм, спадкування), прийомів їх використання при проектуванні програм, а Сі+ + - інструмент цієї технології.

Центральними в ООП є поняття класу та об'єкта. Образно кажучи, ООП полягає не стільки у використанні класів і об'єктів у програмі, скільки в заміні принципу програмування "від функції до функції" принципом програмування "від класу до класу".

Технологія ООП насамперед накладає обмеження на способи представлення даних у програмі. Будь-яка програма відображає в них стан фізичних предметів або абстрактних понять, для роботи з якими вона призначена. Всі дані про об'єкт програмування і його зв'язки з іншими об'єктами можна об'єднати в одну структуровану змінну. У першому наближенні її можна назвати об'єктом. Крім того, з об'єктом зв'язується набір дій, інакше званих методами. З точки зору мови програмування це функції, які отримують в якості обов'язкового параметра покажчик на об'єкт. Технологія ООП забороняє працювати з об'єктом інакше, ніж через методи, тобто внутрішня структура об'єкта прихована від зовнішнього користувача. Опис безлічі однотипних об'єктів називається класом.

В даній курсовій роботі описується програмний продукт, що реалізує гру в «Більярд».

Для користувача більярдний стіл являє собою вікно, що містить прямокутник з лузами по кутках, 15 чорних куль і 1 білу кулю. Натисненням кнопки миші користувач імітує удар києм по кулі, повідомляючи йому деяку енергію.

Об'єкт куля може самостійно пересуватися, виявляти перед собою іншу кулю, лузу, повертати, відбиваючи від стінки, і т.і. Куля рухається в сторону, протилежну вказівником миші. Отримавши енергію, куля починає котитися, відскакуючи від стінок, б'ючи інші кулі, і, нарешті, потрапляє в лузу. Коли одна куля стикається з іншою, частина енергії першої передається другій і в результаті напрямок руху обох куль змінюється.


СПИСОК ЛІТЕРАТУРИ

1.   C + + для чайників (+ CD-ROM): Стефан Р. Девіс - Санкт-Петербург, Діалектика, Вільямс, 2009 р. - 336 с.

2.   C + +. Майстер-клас в задачах і прикладах : Максим Кузнєцов, Ігор Сімдянов - Москва, БХВ-Петербург, 2007 р. - 480 с.

3.   C + +. Об'єктно-орієнтоване програмування. Практикум: Т. А. Павловська, Ю. А. Щупак - Москва, Пітер, 2008 р. - 272 с.

4.   C / C + +. Структурний і об'єктно-орієнтоване програмування. Практикум: Т. А. Павловська, Ю. А. Щупак - Санкт-Петербург, Пітер, 2010 р. - 352 с.

5.   Об'єктно-орієнтоване моделювання на С + +: Ілля Труб - Санкт-Петербург, Пітер, 2006 р. - 416 с.

6.   Об'єктно-орієнтоване програмування в С + +: Р. Лафоре - Санкт-Петербург, Пітер, 2011 р. - 928 с.

7.   Об'єктно-орієнтоване програмування на С + +: Айра Пол - Москва, Не вказано, Біном, Невський Діалект, 2001 р. - 464 с.

24

 



Информация о работе Гра Більярд