Ім'я файлу: Пример курсового (1).docx
Розширення: docx
Розмір: 376кб.
Дата: 10.07.2022
скачати



РЕФЕРАТ



Пояснювальна записка до курсової роботи містить X розділів, XX с., X рисунків, X використаних джерел.

Об'єкт дослідження – додаток “X”.

Мета роботи – розробка віконної програми, яка повторює правила гри “X”, виводить кількість набраних очок, кількість зруйнованих ліній, рівень.

Метод дослідження – вивчення літератури, складання і налагодження текстової програми на комп'ютері.

Додаток зручно використовувати в розважальних цілях, та в цілях розвитку власних розумових здібностей та реакції.

Програма складена на мові C++ та засобів Win32Api в середовищі

Microsoft Visual Studio.

X, ПАЖИТНОВ, WINAPI, C++, ФІГУРИ, СТАКАН, ПОЛЕ, ГРАФІЧНИЙ ІНТЕРФЕЙС, ВІКОННИЙ ДОДАТОК, БАЛИ, ШВИДКІСТЬ ПАДІННЯ ФІГУР

ЗМІСТ



РЕФЕРАТ 4

ЗМІСТ 5

ВСТУП 6

1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ 9

Рисунок 1.1 – Фігури з додатку X 9

Рисунок 2.1 – Структура проекту 11

3 ОПИС ПРОГРАМИ 14

Приклад 3.1 – Функція setSpeed 15

Приклад 3.2 – Функція addScore 16

Приклад 3.2 – Функція newGame 16

Приклад 3.3 – Функція blinkRows 17

Приклад 3.4 – Функція removeRows 18

Приклад 3.5 – Тіло функції WinProc 18

Приклад 3.7 – Тіло функції CreateMainMenu 20

Рисунок 3.1 – Приклад загального розміщення фігури I 21

Приклад 3.8 – Функція створення фігури класу Piece 21

Приклад 3.9 – Структура piece 22

Приклад 3.10 – Функція deletePiece 22

Приклад 3.11 – Двовимірний статичний масив pieces 22

Приклад 3.13 – Функція rotatePiece 24

Приклад 3.14 – Функція createField 24

Приклад 3.15 – Функція drawField 25

Приклад 3.16 – Структура glassful 25

Приклад 3.17 – Змінні класу Field 25

Приклад 3.18 – Функція fillField 25

Приклад 3.19 – Змінна класу Color 26

Приклад 3.20 – Одновимірний константний масив кольорів colorValue 26

26

Приклад 3.21 – Функція createBrushes 26

Приклад 3.22 – Функція deleteBrushes 26

4 ТЕХНІЧНІ ВИМОГИ І ТЕСТУВАННЯ ПРОГРАМИ 27

5 ІНСТРУКЦІЯ КОРИСТУВАЧА 29

Рисунок 5.1 – Основне поле гри 29

Рисунок 5.2 – Пункти меню 29

Рисунок 5.3 – Видалення рядка з основного поля 30

Рисунок 5.5 – Меню виходу з програми 30

ВИСНОВКИ 31

ПЕРЕЛІК ДЖЕРЕЛ 32


ВСТУП

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

Тому на даний момент існує багато різноманітних ігор, як і підходів до їх створення. Невеликі ігри по бажанню може написати будь-який охочий. Однак, більш складні ігри потребують більше знань та навичок. Якісні ігрові проекти можуть мати реалістичную графіку з використанням мови С++, окремі модулі до них можуть бути написані на інших мовах. Варто зауважити, що вибір програмної мови залежить від вимог до гри, вартості розробки та комп'ютерного заліза.

Комп'ютер, яким його ми зараз бачимо, не завжди був таким. Він став завдяки іншим технологіям. Фукнціонал його настільки різноманітний, що важко собі уявити. Його використовують скрізь: наука, освіта, металургійна промисловість, медицина, а також в сфері розваг.

Метою даної записки є опис розробки додатку “X”. Користувач контролює фігурку, яка рухається вниз по полю (матриці). Заповнивши фігурами повністю рядок, він видаляється, а гравець отримує очки, це і є ціль гравця – набрати якомога більше очок.

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

Була опублікована стаття [1], автор якої доводить, що навіть якщо б гравець реагував миттєво і завжди приймав правильні рішення, то і в цьому випадку він би в кінцевому рахунку програв. Проблемою є S- і Z- образні фігурки. Досить велика кількість S-фігурок змусить гравця залишити дірку в правому нижньому кутку. Досить велика кількість Z-фігурок після цього змусить гравця залишити дірку в лівому кутку наступного ряду, не заповнивши попередню дірку. Якщо після цього знову випаде достатньо багато S-фігурок, досить багато Z-фігурок, і так багато разів, заповниться (з дірками по краях) все поле, і для наступної фігурки місця не залишиться. Якщо генератор випадкових чисел видає дискретний рівномірний розподіл, будь-яка (в тому числі і така) комбінація рано чи пізно випаде.

В процесі розробки додатку “X”, була використана стандартна бібліотека WinApi та мова програмування С++ для створення додатку на операційній системі Windows .

Ця гра реалізована практично на всіх існуючих платформах. Навіть по сьогоднішній день таким досягненням і популярністю може похвалитися дуже невелике коло програм розважального характеру. Існує дуже багато варіантів реалізації цієї гри у всьому світі з різними правилами та видом. Гра була розроблена Сергієм Пажитновим в 1984 році.
1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ



У даній роботі розглядається питання створення додатку “X” за допомогою бібліотеки WinApi та мови програмування С++. Мета завдання – це реалізувати за правилами гру “X” під ОС Windows. Правила гри: поле розміром 10 на 28 клітинок, що розташовується вертикально. В це поле зверху вниз падають фігури, зображені на рисунку 1.1.


Рисунок 1.1 – Фігури з додатку X


“X” являє собою головоломку, яка побудована на використанні геометричних фігур “X” – різновиди полімін, що складаються з чотирьох квадратів. Поліміни в тому чи іншому вигляді використовувалися в настільних іграх і головоломках задовго до створення “X”.

Фігури в грі падають випадково і мають ймовірну позицію обертання: 0, 90, 180, 360 градусів. Під час падіння фігурою можна керувати. Користувач може переміщати її ліворуч та праворуч, але за межі поля не можна виходити. Фігура зупиняє свій рух по полю тільки коли досягла нижньої межі поля або найвищої фігури, розміщеної по тому ж стовбцю. Таким чином, гравець, використовуючи певну сукупність фігур, повинен повністю заповнити певний рядок на полі.

Коли гравець зібрав повністю один рядок, рядок видаляється та додається певна кількість очок до результату гравця. Коли гравець отримує певну кількість зруйнованих ліній, рівень збільшується і швидкість падіння фігури зростає. Головна мета гравця – зібрати якомога більше очок до того, як фігура доторкнеться до найвищого рядку поля.

Сфера використання цього проекту є комп’ютери на базі сімейства операційних систем Windows. Для архітектури процесорів x86 або x64 проблем з перенесенням проекту не буде. Надалі наявна можливість модифікувати проект, додавши новий функціонал, наприклад багатокористувацький режим. Однак створити багатокористувацький режим складно. Справжня перевірка цієї ідеї відбувається, коли в гру приходять гравці. Після запуску проекту в багатьох багатокористувацьких іграх активна взаємодія гравців спостерігається тільки перші кілька тижнів. Людей спочатку занадто багато, а потім їх недостатньо. Гравці заходять лише час від часу, і неможливо бути впевненим в отриманні хороших ігрових вражень. Активні матчі потихеньку сходять нанівець. Традиційні кімнати очікування матчів порожніють назавжди. Багатокористувацький режим в грі з тріском підходить до сумного кінця.

Вважається, що проблема полягає в організації ігрових процесів. Були ті, хто хотів грати, але ігрові механізми об'єднання гравців призвели до утворення слабкої спільноти, яка не могла сама підтримувати своє існування.

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

2 РОЗРОБКА СТРУКТУРИ ТА АЛГОРИТМІВ ПРОГРАМИ

Алгоритм – це точно визначена послідовність дій певного виконавця, які виконуються за певними правилами і які приводять через певну кількість кроків до розв’язання задачі.

В ході проектування даного додатку була обрана наступна структура проекту (рисунок 2.1):

Рисунок 2.1 – Структура проекту


Проект складається з таких файлів: main, в якому основна функціональна частина з функціями класів, Piece, в якому відбувається створення та формування фігури, Field, де створюється дошка для гри, Color, де створються пензли й зберігається інформація про колір, і Sound – в ньому музичне супроводження до гри.

Для реалізації програми, яка виконує поставлене завдання необхідно створити проект Win32 в Visual Studio 2017, який оптимально підходить для реалізації необхідної програми.

Відразу після запуску гри відбувається ініціалізація та прорисовування інформаційного блоку з ігровим полем 10х28. Автоматично ініціалізується двовимірний масив розмірністю поля, тип даних масив – об’єкт типу glassful. Після встановлюється колір ігрового поля (за замовчуванням – чорний).

Для того, щоб почати гру, необхідно перейти в розташоване зверху зліва меню і вибрати пункт меню «New game». Відбудеться генерарація першої фігури та підготування наступної фігури, яка буде відображена в інформаційному блоці.

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

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

Для створення графічної частини програмування використовувалися графічні можливості мови програмування С++ (WinApi).

Тепер треба розглянути розробку структури та алгоритмів програми “X”.

Крок 1: запуск програми. Відбувається ініціалізація ігрового поля (основного поля) з полем інформаційного блока. Ігрове поле – це клієнтська область вікна.

Крок 2: відбувається перевірка коректного створення основного поля з полем інформаційного блока.

Крок 3: йде відображення основного поля та поля інформаційного блока.

Крок 4: користувачу необхідно перейти до меню «Menu», що розташовується зверху зліва основного поля вікна та клікнути на нього.

Крок 5: клікнути на пункт меню «New game» і гра почнеться.

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

Крок 7: користувач починає рухати фігуру по ігровому полю за допомогою стрілок вгору, вниз, вліво, вправо.

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

Крок 9: проводиться перевірка на можливість кроку, тобто перевірка чи гравець не виходить за межі поля.

Крок 10: вносяться координати до відповідної операції перемалювання.

Крок 11: коли фігура досягає нижньої межі ігрового поля, відбувається ініціалізація наступної фігури. За бажанням в будь-який час доки гра триває гравець може ввімкнути/вимкнути музичне супроводження або зупинити/продовжити гру.

Крок 12: повторення кроків 6-11. Якщо гравець заповнює як мінімум одну лінію ігрового поля, то відбувається перехід до кроку 13.

Крок 13: зруйнування цих ліній, таким чином, додаються ігрові очки до існуючих та збільшується лічильник зруйнованих ліній.

Крок 14: повторення кроку 14. Якщо гравець досягає верхньої межі ігрового поля, то відбувається перехід до кроку 15.

Крок 15: завершення поточної гри.

Крок 16: після завершення поточної гри користувачу необхідно перейти до меню «Menu», що розташовується зверху зліва основного поля вікна та клікнути на нього.

Крок 17: у випадку коли користувач має бажання почати гру спочатку, необхідно клікнути на пункт меню «New game», і гра почнеться спочатку (крок 1-15), у іншому випадку – натиснути пункт меню «Quit». Відбудеться генерація повідомлення. Прочитавши повідомлення, гравець може вирішити продовжити гру чи вийти з неї.

Крок 18: гравець закриває гру. В цей час йде знищення всіх даних.

Рівень у грі збільшує своє значення на 1 у тому випадку, коли було зібрано 10 ліній. Для зміни рівня використовуться змінна level. Рівень повинен відображатися на всю клієнтську область ігрового поля. Після ініціалізації ігрового поля, кожна ділянка зафарбовується у чорний колір.

Також був розроблений алгоритм створення фігури. Фігура заноситься в функцію createPiece (piece *currPiece, piece *nextPiece). Перший параметр функції – це поточна фігура, а другий – наступна фігура. Початкові координати появи фігури задаються явно. Форма фігури, поворот фігури, координати, колір задаються в структурі piece. Отже, структура piece необхідна для збереження інформації щодо параметрів фігури. Відповідно існують перевірки щодо генерації фігури, колізії фігури відносно інших об’єктів, досягнення нижньої та верхньої межі ігрового поля, видалення фігури у випадку заповнення рядка. На початку гри відбувається створення екземпляру поточної фігури та готується екземпляр створення іншої фігури. Після завершення гри відбувається видалення інформації.

3 ОПИС ПРОГРАМИ






Курсова робота містить такі файли: main.cpp, Piece.cpp, Piece.h, Field.cpp, Field.h, Color.cpp, Color.h, Sound.cpp, Sound.h.

Файл main.cpp зберігає в собі функції створення віконного додатку та виклику класів для використання їх функцій. За допомогою WinApi було реалізоване меню та вікно повідомлення. Клас Field зберігає в собі функції малювання за допомогою бібліотеки WinApi.

3.1 Клас main слідкує за грою та ініціалізує початкові умови гри.

Наявні індефікатори початкової та мінімальної швидкості, визначення останньої натиснутої клавіши, адаптація під віконний режим пристрою. Також присутне створення спеціальних інформаційних вікон: наступна падаюча фігура, рівень складності, кількість зруйнованих ліній та кількість набраних очок. Наведена інформація про додаткові гарячі клавіши Space та Pause, натиснувши на які виконуються дії зупинки/продовження гри або програвання аудіозапису гри відповідно. Також клас main має функціонал обробки ситуації програшу гравця, що полягає у видаленні поточного об'єкту гри та створення нового екземпляру класу main.

Для того, щоб встановлювати швидкість падіння фігури відносно поточного рівня існує функція setSpeed (int *speed, int level). Це відображено в прикладі 3.1.






Приклад 3.1 – Функція setSpeed

Перехід на інший рівень залежить від кількості зруйнованих ліній (приклад 3.2). При нарахуванні очок за зруйновані лінії кількість очок залежить від того, скільки ліній прибрано за один раз: 1 лінія – 40 очок, 2 лінії – 100 очок, 3 лінії – 300 очок, 4 лінії – 1200 очок. Тобто, чим більше ліній забирається за один раз, тим більше відношення кількості очок до кількості ліній.





















Приклад 3.2 – Функція addScore

Користувач починає гру спочатку функцією newGame(), де відбувається перерисування вікна. Воно містить інтерфейс, очки, рівні, кількість зруйнованних ліній, поле наступної фігури та дошку (приклад 3.2). Перерисування вікна ігрового поля відбувається у чорний колір. В програмі існує змінна gameStarted. Вона приймає два значення: true та false. Якщо ця змінна дорівнює false – це означає, що гра не почалась.

























Приклад 3.2 – Функція newGame

Логіка визначення натиснутої клавіши наявна в функції processInput(). Функція WinApi GetAsyncKeyState визначає чи є клавіша відпущена або утримується під час виклику функції і чи була клавіша взагалі натиснута після попереднього виклику GetAsyncKeyState.

Малювання інформаційного блоку інтерфейса відбувається завдяки функції drawWindow(). Основні задачі – виконання передачі бітових блоків даних про колір, відповідних прямокутних пікселів із заданого вихідного контексту пристрою та переведення рядка в число за допомогою потоків введення-виведення.

Для графічного відображення руйнування лінії у вигляді бліків використовуються послідновно дві функції blinkRows (int y[]) та removeRows (piece *piece). Це відображено у прикладі 3.3 та прикладі 3.4. Для отримання поточного часу оновлення, якому присвоюється системний час, використовується WinApi функція timeGetTime().



























Приклад 3.3 – Функція blinkRows

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












Приклад 3.4 – Функція removeRows

В файлі main.cpp знаходиться виклик усіх потрібних функцій. Для будь-якого додатку під Windows необхідно здійснити наступні кроки: зареєструвати клас вікна, створити вікно, розробити віконну процедуру (приклад 3.5), в якій будуть оброблені повідомлення, що надійшли з циклу повідомлень [2].








































Приклад 3.5 – Тіло функції WinProc

Функція WinProc оброблює повідомлення. В даному додатку спочатку приходить повідомлення WM_CREATE, де створюється вікно. Далі WM_PAINT виконує перемалювання. Повідомлення WM_COMMAND оброблює команди, які стосуються меню. ID_NEW – унікальний ідентифікатор пункту меню «New game». При виклику цього пункту меню відбувається початок нової гри. При виклику ID_QUIT – викликається дочернє вікно, в якому гравцю надається вибір: вийти чи продовжити гру.

Функція setupBackground() відображає текст в певному місці вікна та будується на стандартних функціях: GetDC, CreateCompatibleDC, CreateCompatibleBitmap, SelectObject, SetTextColor, SetBkMode, ReleaseDC, SetRect, FillRect, DrawEdge, TextOut.

Функція CreateCompatibleDC створює контекст пристрою в пам'яті, сумісний з заданим пристроєм. Функція CreateCompatibleBitmap створює точковий рисунок, сумісний з пристроєм, яке пов'язане із заданим контекстом пристрою.

Функція SelectObject вибирає об'єкт в заданий контекст пристрою. Новий об'єкт замінює попередній об'єкт того ж самого типу.

Функція SetTextColor встановлює колір тексту для заданого контексту пристрою. Функція SetBkMode встановлює фоновий режим змішування контексту заданого пристрою, який використовується текстом, кистями для штрихування і стилями пера.

Функція ReleaseDC звільняє контекст пристрою для використання іншими додатками. Функція SetRect встановлює координати заданого прямокутника. Це еквівалентно призначенням лівого, верхнього, правого і нижнього параметрів відповідним членам структури RECT. Функція fillRect рисує в заданій точці зафарбований прямокутник. Перші два параметри задають координати точки, в якій виявиться верхній лівий кут намальованого прямокутника. Функція DrawEdge малює контур прямокутника з обраним стилем, дозволяючи домогтися деяких 3D-ефектів. Цю функцію краще використовувати замість застосування різних рельєфних рамок, панелей та інших елементів управління, так як функція більш ефективна і потребує менше ресурсів комп'ютера. Функція TextOut записує рядок символів в заданому місці. Вона використовує поточний обраний шрифт, колір фону та тексту. Після закінчення роботи програми викликається функція deleteGraphics(), яка видаляє заданий контекст пристрою та звільняє всі системні ресурсі, пов’язані з об’єктом (приклад 3.6).

Приклад 3.6 – Функція deleteGraphics

Загальна логіка програми наявна в функції updateGame(). У ній розписані реакції відносно дій користувача з використанням створених та перечислених вище функцій. Наприклад, створення фігури або перевірки чи впала фігура до низу поля.

Основне меню програми створюється завдяки функції createMainMenu(). Там наявна функція AppendMenu – це випадаюче меню. Воно приєднує в кінець меню новий елемент, стан якого визначається бітовими прапорами: MF_STRING, MF_SEPARATOR, MF_STRING, MF_POPUP (приклад 3.7).

MF_STRING визначає, що пункт меню – текстовий рядок. MF_SEPARATOR рисує горизонтальну розділову лінію. Цей прапорець використовується тільки в випадаючому меню, підменю або контекстному меню. Лінія не може бути недоступною, заблокованою, або виділеною. MF_STRING визначає, що пункт меню – текстовий рядок. MF_POPUP визначає, що пункт меню відкриває випадаюче меню або підменю. Цей прапорець використовується, щоб додати ім'я меню в рядку меню, або пункт меню, який відкриває підміню випадаючого меню.










Приклад 3.7 – Тіло функції CreateMainMenu

3.2 Клас Piece описує кожну із сімох фігур, котрі існують в X: I, S, Z, O, J, L, T.

Фігури представлені як шаблонне 16-бітове ціле число, яке представляє вугол повороту фігури. Всі елементи викладаються на сітку 4х4, де кожна клітина або зайнята – 1, чи ні – 0. Наприклад, фігура І має 4 варіанти розміщення (рисунок 3.1). Також зберігає інформацію про фігуру: структуру piece, де зберігаються поля координат, форми, обертання відносно своєї осі та колір. Цей клас явно зберігає координати клітинок фігур в структурі pieces. Наявні функції перевірки колізії фігури відносно інших об’єктів та функції обертання фігур. Цей клас використовується лише класом main. Клас Piece викликає клас Field, який, у свою чергу, викликає клас Color.


Рисунок 3.1 – Приклад загального розміщення фігури I

У прикладі програми 3.8 описується функція створення фігури класу Piece. Вона викликає поля структуры piece: rotation, shape, color. Поле rotation – це вугол повертання фігури, shape – форма фігури, color – колір фігури. Задається за замовчуванням координати появи наступної фігури в основному полі.






Приклад 3.8 – Функція створення фігури класу Piece



Параметри, з якими працює функція createPiece (piece *piece):

-currPiece – поточна фігура;

-nextPiece – наступна фігура.

При виклику функції присвоюємо полям структури piece пусті клітинки (приклад 3.9).











Приклад 3.9 – Структура piece



Відповідно існує функція видалення фігури deletePiece (piece *piece). Вона наведена у прикладі 3.10.






Приклад 3.10 – Функція deletePiece


Клас Piece зберігає 28 видів фігур, тобто 7 фігур, кожна з яких має 4 положення – 0, 90, 180, 360 градусів відносно її центру. Щоб зберігати всі варіанти фігур використано звичайний двовимірний статичний масив pieces (приклад 3.11), де фігури представлені як шаблонне 16-бітове ціле число [3].

Приклад 3.11 – Двовимірний статичний масив pieces


Кожна фігура має чотири точки в координатній площині, тобто в точки є координати по вісі x та вісі y. При створенні фігури її тіло заноситься до структури piece, а також створюється об’єкт класу Piece. Кожна фігура має випадковий колір, та зберігається в одновимірному масиві colorValue в класі Color.

Функція checkPiece (piece *piece) повертає булеву змінну. Ця функція перевіряє розміщення фігур на полі, а саме чи розміщена інша фігура на позиції в сітці X.

Коли фігури знищуються, викликається функція erasePiece (piece *piece), яка використовується для перерисування клітин поля у колір ігрового поля.

При ініціалізації класу всі фігури записуються в початковому положенні в функції createPiece, але потім присвоються через цикл функції drawPiece (piece *piece) параметри кожній фігурі, відображено це в прикладі 3.12.

Приклад 3.12 – Функція drawPiece

Функція rotatePiece (piece *pieces) обертає фігури в певній послідовності, яка наведена в прикладі 3.11. Графічно це відображено для фігури Z в рисунку 3.2. Коли лічильник має значення 0, то фігура знаходиться в положенні 0 і так далі.



Рисунок 3.2 – Положення фігури Z в залежності від значення лічильника

В функції rotatePiece також наявна перевірка на кількість здійснених обертів (приклад 3.13). Якщо кількість обертів фігури дорівнює 3, то відбувається скидання лічильника вугола повертання фігури, тобто положення, до 0.












Приклад 3.13 – Функція rotatePiece

Функції movePieceLeft (piece *piece), movePieceRight (piece *piece) рухають фігуру з певної сторони, відповідно до назви функцій: з лівої, з правої сторін.

Функція movePieceDown (piece *piece) перевіряє належність точки координатній площині. Якщо точка належить і не досягла верхньої межі поля, тоді повертається значення TRUE, що означає можливість розташування фігури.

3.3 Клас Field використовується для створення ігрового поля.

Клас містить в собі функції створення основного поля createField (int x, int y), що приймає в якості параметрів координати по вісі х та по вісі у (приклад 3.14). Якщо умови, необхідні для створення, виконуються, то виконуються перемалювання області основого поля у відповідний колір, розмежуючи ігрове поле та інформаційний блок.
Приклад 3.14 – Функція createField

Рисування вікна основного поля відбувається за допомогою функції drawField, якій необхідно екземпляр контексту пристрою та масив пензлів (приклад 3.15).






Приклад 3.15 – Функція drawField

Наявна структура glassful (приклад 3.16), яка зберігає ігрову поверхню, тобто стакану.





Приклад 3.16 – Структура glassful

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



Приклад 3.17 – Змінні класу Field

Заповнення кольором основного поля відбувається завдяки функції fillField (int color) у прикладі 3.18.












Приклад 3.18 – Функція fillField

3.4 Клас Color існує для ініціалізації та видалення масиву пензлів з відповідними кольорами та для збереження інформації, пов’язаної з кольором.

В класі індекс масиву пензлів задається в ініціалізації статичного одновимірного константного масиву кольорів colorValue [COLOR_AMOUNT], який використовує аддитивну колірну модель (RGB), що описує спосіб кодування кольорів [5]. Він наведений в прикладі 3.20.



Приклад 3.19 – Змінна класу Color














Приклад 3.20 – Одновимірний константний масив кольорів colorValue

Функція сreateBrushes (HBRUSH brushes[]) та deleteBrushes (HBRUSH brushes[]) приймають у якості параметрів масив пензлів для відповідного задання/видалення кольорів через цикл по індексам (приклади 3.21 та 3.22).



Приклад 3.21 – Функція createBrushes














Приклад 3.22 – Функція deleteBrushes

3.5 Клас Sound містить музичне супровождення гри.

Клас Sound використовується лише класом main. Спочатку відбувається завантаження аудіофайлу. Наявна логіка закриття завантаженого аудіофайлу при виході з гри, таким чином, звільняючи ресурси. Програвання аудіофайлу здійснюється за допомогою гарячої клавіші Р. По бажанню користувач може здійснити зупинку програвання аудіофайлу, натиснувши знову гарячу клавішу Р. Після зупинки програвання аудіофайлу наявна можливість відновлення програвання аудіофайлу, натиснувши ще раз гарячу клавішу Р.
4 ТЕХНІЧНІ ВИМОГИ І ТЕСТУВАННЯ ПРОГРАМИ



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

Першою метою в реалізації додатку “X” – створення віконного додатку. Далі було створене ігрове поле розміром 10 на 28. Наступним етапом було створення фігур. Є декілька напрямів розвитку цієї програми. Було обрано принцип написання програми за допомогою об’єктно-орієнтованого програмування. Був створений клас Piece, який описує фігуру та її зіткнення з іншими об’єктами. На цьому етапі був розроблений алгоритм створення форми фігур з шаблону, який містить координати клітинок фігури (тобто 7 фігур, кожна з яких має 4 положення під час обертання) і структура, яка відповідає за зміст фігури в тому чи іншому положенні. Цей алгоритм не потребував дуже багато пам’яті. В наслідок це дало ще велику перевагу в швидкодії, бо процесору не потрібно порахувати нову позицію фігури. Далі на етапі написання і тестування програми з’явився клас Field, який виконував функції рисування об’єктів. Проблеми були з некоректним відображенням даних. Далі був створений клас main, який відтворював логіку програми: умови нарахування очок, збільшення швидкості падіння фігури, рівню, кількості зруйнованних ліній, програшу, переміщення фігури по полю, перевірки на колізію з іншими об’єктами. Цей етап був найважчий, бо помилки були з логікою відтворення. При запуску програми одразу був програш – приклад логічної помилки в алгоритмі. Клас main виконує ряд перевірок і механізми запуску функцій при певних умовах: функція обробки натискання клавіш, перемалювання екрану, перевірка на програш і запуск функцій, що створювали нову гру.

Також в цьому класі створюється вікно додатку, реалізується виклик об’єктів класів, ініціалізується запуск функцій тощо. На цьому етапі розробки “X” працював справно, але без пришвидшення та підрахунку очок. На даний момент додаток не мав меню. Далі був зроблений підрахунок очок та зміна швидкості зі збільшенням набраних очок. На цьому етапі виникла проблема, яка пов’язана з набранням невеликої кількості очок. Тобто швидкість падіння фігур була надвисокою. Далі дані були виведені на екран в окрему область у віконному додатку. В додаток було додане меню, яке об’єднало в собі додаткові функції додатку: нова гра та вихід з гри. Музичне супроводження допомагає гравцю налаштувати його на хороший настрій. Після проходження перелічених етапів проект набув той вигляд, в якому він існує на даний час.

Програма була протестована на декількох ПК: 4x Core 2 Extreme QX9650, 4 gb ram, Windows 10 x64, 2x Core i3-3240 HT, 4gb ram, Windows 8 x64.

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

5 ІНСТРУКЦІЯ КОРИСТУВАЧА



Користування додатком “X” починається з відкриття програми. Одразу з’являється основне вікно програми. Користувач бачить основне поле (рисунок 5.1).
Рисунок 5.1 – Основне поле гри

Далі треба перейти в меню «Menu», що розташоване зверху зліва. Воно містить такі пункти: «New game», «Quit» (рисунок 5.2).
Рисунок 5.2 – Пункти меню

При виклику пункту меню New game почнеться гра.

Управління фігурою відбувається за допомогою стрілок на клавіатурі. Стрілка вгору – обертання фігури, стрілка вправо – переміщення фігури праворуч, стрілка вліво – переміщення фігури ліворуч, стрілка вниз – збільшення швидкості падіння фігури. Коли рядок поля заповнюється, рядок видаляється з основного поля і кількість набраних очок збільшується

(рисунок 5.2). Рівень збільшується у тому випадку, коли гравець зруйнував 10 ліній.
Рисунок 5.3 – Видалення рядка з основного поля

При заповненні поля по вертикалі, гра закінчується (рисунок 5.4).

Рисунок 5.4 – Закінчення гри

У випадку коли гравець хоче почати спочатку, треба знову перейти в меню «Menu». Далі вибрати пункт меню «New game». Розпочнеться наступна гра.

Якщо гравець хоче залишити гру, треба перейти до меню «Menu» і вибрати пункт меню «Quit». Він викликає діалогове вікно, яке запитує чи хоче користувач вийти з гри. Якщо відповідь позитивна – натиснути Yes, у іншому випадку – No, і таким чином викликає функцію закриття програми

(рисунок 5.5).

Рисунок 5.5 – Меню виходу з програми


За бажанням користувач може увімкнути або вимкнути музичне супроводження гри завдяки гарячої клавіші Р. При натисканні відбувається завантаження аудіофайлу в програму. Якщо користувач хоче зупинити гру, не починаючи спочатку, треба натиснути на гарячу клавішу Space (рисунок 5.6).
Рисунок 5.6 – Гарячі клавіши


ВИСНОВКИ



В ході виконання даної роботи у середовищі розробки Microsoft Visual Studio за допомогою мови програмування C++ та бібліотеки WinApi був зроблений додаток “X”. Він виконує всі функції стандартного X, має красиву графіку, легкий в розумінні і користуванні інтерфейс.

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

Відповідно до концепції повторного використання коду у тексті програми немає однакових блоків, усі вони винесені у окремі функції, які потім викликаються стільки, скільки необхідно. Усі модулі програми дуже гнучко зв’язані між собою, що дозволяє переформатувати текст програми без необхідності зміни тексту модулів. Цією гнучкістю також досягається можливість легко використовувати ці модулі в інших проектах.

На даному етапі розвитку проект повністю робочий і виконує всі задані потреби. Проект у перспективі має розвиток. Можна змінити графіку, зробити її більш анімованою, додати графічні ефекти. Головна ідея розвитку – розробити багатокористувацький режим.
ПЕРЕЛІК ДЖЕРЕЛ

1. Tetris // netlore.ru. URL: http://www.netlore.ru/tetris

2. Синев Л. Как создать оконный интерфейс. Компьютер Пресс.

1991. № 1. С.16–33.

3. Петзольд Ч. Программирование под Windows 95. В двух книгах:

BHV – Санкт-Петербург, 1997, silt.

4. Tetris // codeincomplete.com. URL: https://codeincomplete.com/posts/javascript-tetris/

5. RGB // webgyry.info. URL: https://webgyry.info/rgb-format

6. Страуструп Б. Язык программирования С++: В 2-х кн. – К.: Диасофт, 1993.

7. ….Оформить по гостам, тут неправильно в свое время было
скачати

© Усі права захищені
написати до нас