МІНІСТЕРСТВО ОСВІТИ І НАУКИ
РОСІЙСЬКОЇ ФЕДЕРАЦІЇ
МІНІСТЕРСТВО АГЕНСТВО ДО ОСВІТИ
Курганський ДЕРЖАВНИЙ УНІВЕРСИТЕТ
Кафедра автоматизації виробничих процесів
Курсова робота
Розрахунково-пояснювальна записка.
Дисципліна: Програмування і основи алгоритмізації
В«Розробка гри В«Хрестики-нуликиВ»
Студент: Іванов П. С.
Група: Т-2144
Керівник: Скобелєв І. В.
Коміссія__________________
Оценка____________________
Дата защіти_______________
Курган, 2006
Введення
Стрімкий розвиток комп'ютерної техніки в останні роки, поява найпотужніших графічних прискорювачів і центральних процесорів сприяло не менш бурхливому розвитку індустрії комп'ютерних ігор. Видатні розробки цієї галузі - це складні програми, як правило, з дуже високими вимогами до апаратної частини комп'ютера. Однак для можливості відпочити в перерві від виконання небудь роботи оператору комп'ютера не завжди потрібно новітня комп'ютерна гра, а часто використовувати її не дозволяє малопотужне обладнання офісного комп'ютера. Саме цій меті - відпочинку від монотонної роботи служить розроблена в рамках даного курсового проекту програма.
1. Технічне завдання
Ігрове поле представлено 25 клітинами, як показано на рис.1.
Рис. 1. Ігрове поле після запуску гри
Гра розрахована на 2-х гравців, які по черзі наводять покажчик миші на відповідну клітку ігрового поля і клацанням лівої кнопки миші ставлять в ній хрестик або нулик. Перший хід робить користувач, який грає хрестиками. Перемога присуджується гравцеві, який вибудує в лінію послідовність чотирьох значків Х або О - по горизонталі, вертикалі або діагоналі, про що виводиться відповідне повідомлення. Також є можливість зберігати і завантажувати розпочаті гри (файли збережень мають свій значок і розширення *. xvo). Початок нової гри - команда меню File-> New (або значок, збереження гри - File -> SaveAs ... або File -> Save (або значок, відкриття збереженої гри - File -> Open ... (або значок), роздруківка розпочатої гри File -> Print ... (або значок).
2. Блок-схема алгоритму
3. Опис роботи програмного продукту
У даному пункті слід привести опис роботи програми з приведенням необхідного коду, розповісти про основних і допоміжних функціях, про призначення масивів і методів, структурі алгоритму програми.
Структура програми будується на п'яти класах, кожний з яких створений на основі свого базового класу, взятого з MFC, це класи:
В· CXvsOv1App ставиться до роботи самої програми;
В· CXvsOv1Doc займається обробкою робочих документів;
В· CXvsOv1View здійснює відображення документів в робочому вікні;
В· CMainFrame обслуговує роботу базового вікна програми;
В· CAboutDlg забезпечує роботу діалогового вікна About (Про програму).
У програмі дані зберігаються в об'єкті document, а за їх відображення відповідає об'єкт view. Фактичним же місцем виведення відображуваних даних є вікно перегляду. Для SDI-програм дане вікно перекриває видиму клієнтську частину базового вікна, яке з'являється після компановки підготовленої в AppWizard програми. Те, що виглядає як клієнтська частина вікна - світла область, обрамлена зверху панеллю інструментів, а знизу рядком стану, - фактично є вікном перегляду.
Використовувані в програмі дані зберігається у вигляді масиву полів довжиною 1 байт, кожен з яких описує поточний стан окремої клітини ігрового поля; цей масив являє собою елемент даних (data member) класу document. У будь-який момент клас view може запитати у класу document відомості по кожній клітині і відобразити їх на екрані. Крім того, він додає в клас document відомості про хрестиках і нулики, коли користувач клацає по порожній клітці.
Клітини, що утворюють ігрове поле, задаються матрицею CRect -елементів розмірністю 5х5.
Блок ініціалізації змінної m_rect виглядає так:
CXvsOv1View :: CXvsOv1View ()
{
for (int i = 0; i <5; i + +) {
for (int j = 0; j <5; j + +) {
int x = (i * 70) + 10;
int y = - (j * 70) - 10;
m_rect [i] [j]. SetRect (X, y, x + 60, y - 60);
m_rect [i] [j]. NormalizeRect ();
}
}}
Для відображення гри на екрані використовується система координат з одиницею вимірювання, рівною 0,01 дюйм. Точка (0,0) - початок координат - знаходиться у верхньому лівому куті вікна; вісь X спрямована вправо, вісь Y - вгору. Саме з цієї причини Y-координати клітин, призначувані конструктором, мають негативні значення, а не позитивні. Якби були вказані позитивні значення Y, клітини виявилися б за межами видимої частині вікна.
Промальовування ігрового поля здійснюється в методі OnDraw. Коли Windows-програма робить висновок на екран, принтер або будь-яке інше пристрій виводу, вона це робить з використанням так званого контексту пристрою (device context - DC) - деякої структури даних, що містить важливі відомості про характеристики конкретного вивідного пристрою й про параметри, що застосовуються для виведення в даній програмі. Оскільки специфікація Graphics Device Interface (інтерфейс графічних пристроїв - GDI) системи Windows дозволяє отримати апаратно-незалежну модель виведення, одна і та ж функція буде працювати з будь вивідним пристроєм, для якого є відповідний Windows-драйвер.
Виклик функції CDC :: SetMapMode присвоює схемі відповідності для контексту пристрою значення MM_LOENGLISH, що наказує, що одиницею виміру служить 0,01 дюйм (мається на увазі логічний дюйм). Розмір логічного дюйма визначається деяким прийнятим кількістю пікселів, необхідним дл відображення реального дюйма на конкретному вивідному пристрої. Наприклад, при виведенні на принтер один логічний дюйм дорівнює одній фізичній (реальному). При виведенні на екран розмір логічного дюйма, як правило, коливається від 1 до 1,5 фізичних.
Вкладений цикл for спочатку перемальовує квадрати, а потім, якщо від функцій CXvsOv1Doc :: GetSquare отримано ненульове значення, звертається до функції DrawX або DrawO (про функції класу Doc і функціях DrawX або DrawO буде сказано пізніше). Отже, метод OnDraw виглядає наступним чином (функція GetSquare, мова про яку піде нижче, здійснює тут повторну промальовування вікна після згортання):
void CXvsOv1View :: OnDraw (CDC * pDC)
{
CXvsOv1Doc * pDoc = GetDocument ();
ASSERT_VALID (pDoc);
//
// Задати режим відображення MM_LOENGLISH,
// в якому за одиницю вимірювання товщини приймається 0,01 дюйма:
//
pDC-> SetMapMode (MM_LOENGLISH);
//
// Промальовувати ігрове поле:
//
for (int i = 0; i <5; i + +) {
for (int j = 0; j <5; j + +) {
// цикл спочатку перемальовує квадрати, а потім, якщо від функцій
// CXvsOv1Doc :: GetSquare отримано ненульове значення, звертається до функції DrawX або DrawO
pDC-> Rectangle (M_rect [i] [j]);
BYTE bVal = pDoc-> GetSquare (i, j);
if (bVal == 1)// Проставити Х
DrawX (pDC, & M_rect [i] [j]);
else if (bVal == 2)// Проставити Про
Draw0 (pDC, & M_rect [i] [j]);
}
}
}
Далі слід розповісти про блок, що відповідає за малювання хрестиків і нуликів після клацань миші на клітинах поля.
Kогда гравець клацає лівою клавішею і покажчик миші знаходиться в межах клієнтської області вікна, воно отримує повідомлення WM_LBUTTONDOWN. Для відстеження подібних подій використовується що належить класу view функція OnLButtonDown . На початку модуля XvsOv1View знаходиться карта повідомлень - особлива таблиця, в якій встановлюються відпові...