Розробка програмного забезпечення з використанням засобів WinAPI на прикладі гри "Три стакани"(або "Наперстки")

Загальні факти про комп’ютерні ігри. Розгляд основ розробки програмного (джерельного) коду, контенту (малюнки, моделі, музика) та ігрових механік гри "Три стакани". Правила використанням засобів WinAPI. Створення математичної моделі алгоритму програми.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 09.06.2015
Размер файла 405,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Міністерство освіти і науки України

Харківський національний університет радіоелектроніки

Факультет Прикладна математика та менеджмент

Кафедра Інформатика

Напрямок Прикладна математика

Пояснювальна записка до курсової роботи

Розробка програмного забезпечення з використанням засобів WinAPI на прикладі гри "Три стакани" (або "Наперстки")

Виконав:

студент гр. ІНФ-14-1

О.Д. Дев'ятов

Перевірив:

доц. В.А. Любченко

2015 р.

Завдання на курсовий проект (роботу)

Студенту Дев'ятову Олександру Дмитровичу

1. Тема проекту (роботи) розробка програмного забезпечення з використанням засобів WinAPI на прикладі гри "Три стакани" (або "Наперстки")

2. Строк здачі студентом закінченого проекту (роботи) 02.06.2015.

3. Вихідні данні проекту (роботи)

1. Відомості про предметну область: ігри.

2. Перелік використовуваних програмних засобів: середовище програмування Code::Blocks, мова С++, засоби WinAPI.

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

1. Огляд основних методів розробки забезпечення.

2. Математичні моделі алгоритму моделі програми.

3. Комп'ютерна модель гри "Три стакани".

5. Перелік графічного матеріалу (з точним зазначенням обов'язкових креслень): блок схема(рис. 2.3), UML-діаграма (рис. 3.1)

6. Дата видачі завдання 03.02.2015

Календарний план

Найменування етапів курсового проекту

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

Примітки

1

Пошук необхідної літератури

03.02.15 - 15.02.15

Виконано

2

Пошук необхідного програмного забезпечення

15.02.15 - 05.03.15

Виконано

3

Ознайомлення з можливостями візуального програмування

05.03.15 - 15.03.15

Виконано

4

Розроблення алгоритму для вирішення поставленої задачі

15.03.15 - 28.03.15

Виконано

5

Створення комп'ютерної моделі по розробленому алгоритму

28.03.15 - 10.04.15

Виконано

6

Оформлення пояснювальної записки

10.04.15 - 15.05.15

Виконано

7

Захист курсового проекту

15.05.2015 - 02.06.2015

Реферат

Пояснювальна записка: 26 с., 11 рис., 1 додаток, 5 джерел.

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

Гра, winapi, класси наслідування, повідомлення стакани.

Зміст

Вступ

1. Огляд проблеми

1.1 Загальні факти про комп'ютерні ігри

  • 1.1.1 Розвиток

1.1.2 Напрямки

1.2 Гра "Наперстки"

1.3 Постановка задачі

2. Аналіз методів та моделі алгоритму програми

2.1 Аналіз обраних засобів створення графічного інтерфейсу

2.2 Алгоритм роботи

2.3 Блок схема

3. Комп'ютерна модель гри "Три стакани"

3.1 Обґрунтування вибору мови С++

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

3.3 Інструкція користувача

Висновки

Перелік посилань

Додаток

Вступ

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

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

1. Огляд проблеми

1.1 Загальні факти про комп'ютерні ігри

1.1.1 Розвиток

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

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

В 1971 році з'явилася перша комп'ютерна гра Computer Space,а в 1972 році на ринок вийшла перша ігрова приставка Odissey, яку випустила фірми Magnavox. У цьому ж році була розроблена комп'ютерна гра Pong, по сторонах екрана знаходилися дві палички, які відбивали квадратний м'ячик - перший комп'ютерний теніс.

Першим переломним моментом в історії комп'ютерних ігор варто назвати 1981 рік, саме цього року компанія IBM представила свій перший IBM PC. З появою персонального комп'ютера комп'ютерні ігри стали стали розроблятися з величезною швидкістю й до сьогоднішнього часу вдосконалюються. Другим переломним періодом був кінець 1996-го року, у даний період почали розробляти "комп'ютерне залізо", призначене саме для ігор, ігри стали досконаліші. Очевидний приклад - вийшов в 1997 році Quake2 від компанії id Software.

Трохи пізніше, в 1998 році компанія Epic MegaGames випустила свій знаменитий Unreal, що довго знаходився в стадії розробки ( уперше згаданий в 1995 році). Довга розробка пояснюється відсутністю попередніх навичок роботи з іграми подібного масштабу. До розробки Unreal, Epic MegaGames створювала "демки" - маленькі програми, які демонструють мистецтво кодування, а також цікаві звукові й графічні ефекти й т.п. Гра претендувала на самий незакінчений продукт за всю ситуацію софтверній промисловості за разюче гігантську кількість багів (помилок). Але проте Unreal приваблював своїй на той час прекрасно зробленою графікою.

Після виходу Unreal багато хто заявляв , що id Software"відстали" і т.п., хоча із зовсім іншої сторони небувала криза даного жанру (3D-Action), коли новим іграм ставало тісно . Компанії прийняли власні рішення: id перенесли провідні титанічні зусилля на відточування multiplayer, не надаючи грандіозної цінності цікавості single-player режиму й сподіваючись безпомилково захопити частину серверів в Інтернеті для власних ігор, Epic же виготовили велику "демку", і вона радувала око гравця й змусила витратитися потенційним клієнтам на технології. І саме цікаве, обидві компанії своїх намірів досягли.

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

1.1.2 Напрямки

Комп'ютерні ігри можуть бути класифіковані за кількома ознаками:

Жанр:

Пригодницька гра (Adventure) - гра, що володіє повноцінним літературним сюжетом, і гравець в процесі гри сам розкриває всі перипетії цього сюжету.

Бойовик (Action) - гра, яка полягає, в основному, з бойових сцен, бійок і перестрілок. Бойовики поділяються на: "Шутери" (від англ. Shoot - стріляти), "Файтинг" (від англ. Fight - битися), "Жахи", "Стелс" (від англ. Stealth - потайний).

Рольова гра (RPG - англ. Role Playing Game) - гра, відмітною особливістю якої є наявність у персонажів певних навичок і характеристик, які можна знайти, а згодом розвивати, виконуючи будь-які дії.

Стратегічна гра (Strategy) - гра, що представляє собою управління масштабними процесами, як, наприклад, будівництво міст, ведення бізнесу, командування армією і т.д.

Комп'ютерний симулятор (Simulator) - гра, повністю імітує яку-небудь область реальному житті, наприклад, імітація управління гоночним автомобілем або літаком.

Головоломка (Puzzle) - гра, повністю або більш ніж наполовину складається з вирішення різних логічних завдань і головоломок.

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

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

Кількість гравців і спосіб їх взаємодії: гра може бути однокористувальницької, або багатокористувацької;

Візуальне подання: гра може як використовувати графічні засоби оформлення, так і навпаки, бути текстової. Гра також може бути двомірної або тривимірної. Є й звукові гри - в них замість візуального представлення використовуються звуки.

Платформа: гра може належати як до однієї платформі, так і бути мультиплатформенної.

1.2 Гра "Наперстки"

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

Гра в наперстки була відома ще в Стародавній Греції. Назва гра в наперстки з'явилося в 1790-і роки, в Англії, де для гри стали використовувати швейні наперстки. Раніше замість наперсток використовувалися шкаралупа волоського горіха і кришечки від пляшок.

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

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

1.3 Постановка задачі

Таким чином, необхідно розробити метод і алгоритм реалізації гри. Для цього необхідно вирішити наступні задачі:

- зробити максимально зручний інтерфейс користувача;

- розробити алгоритм руху склянок;

- розробити алгоритм обміну склянок з урахування некоректної праці функції рандому для 3 чисел;

- розробити методи відрисовки склянки та м'ячика;

- скорегувати роботу програми для зручності користувача;

- реалізувати перевірку, чи вгадав користувач обраний ним стакан;

- реалізувати розроблені методи й алгоритми у вигляді комп'ютерної моделі гри.

2. Аналіз методів та моделі алгоритму програми

2.1 Аналіз обраних засобів створення графічного інтерфейсу

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

Windows API (application programming interfaces) -- загальне найменування для цілого набору базових функцій інтерфейсів програмування застосунків операційних систем сімейства Windows корпорації Майкрософт. Є найпрямішим способом взаємодії застосунків з Windows. Для створення програм, що використовують Windows API, Майкрософт випускає SDK, який називається PlatformSDK і містить документацію, набір бібліотек, утиліт і інших інструментальних засобів. За допомогою WinAPI можна створювати різні віконні процедури, діалогові вікна, програми і навіть ігри.

Windows API спроектований для використання в мові Сі для написання прикладних програм, призначених для роботи під управлінням операційної системи MS Windows. Робота через Windows API - це найбільш близький до операційної системи спосіб взаємодії з нею з прикладних програм. Більш низький рівень доступу, необхідний тільки для драйверів пристроїв, в поточних версіях Windows надається через Windows Driver Model.

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

WinAPI можна назвати найнизкорівневишем засобом для створення графічного користувацького інтерфейсу, однак не можна вважати це тільки за мінус, адже його простота дає можливість для креативу та не створює нічого зайвого у программі, зменшуючи кількість додаткових бібліотек до однієї. Більшість об'єктів створюється завдяки рендерингу. Рендеринг -- це процес, за допомогою якого комп'ютер створює зображення з моделей. Ці моделі або об'єкти будуються з геометричних примітивів -- точок, ліній і полігонів, які в свою чергу, визначаються своїми вершинами (вершин).

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

Вагома кількість типів даних в WinAPI має префікс "h", що позначає "HANDLE", або дескриптор об'єкта, наприклад, "HWND" - HandleWiNDow.

2.2 Алгоритм роботи

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

Рисунок 2.1 - початковий вигляд програми

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

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

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

Останні два абзаці виконуються поки змінна-лічильник на дійде до певного числа.

Після зупинки стаканів користувач може натиснути на один з стаканів та отримати повідомлення про правильну відповідь(рис.2.2).

Рисунок 2.2 - повідомлення

Також реалізовані рівні складності, що регулюють швидкість руху стаканів.

2.3 Блок схема

Рисунок 2.3 - блок схема логіки програми

3. Комп'ютерна модель гри "Три стакани"

3.1 Обґрунтування вибору мови С++

C++ (Сі-плюс-плюс) -- мова програмування високого рівня з підтримкою декількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Розроблена Б'ярном Страуструпом (англ. Bjarne Stroustrup) в AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та початково отримала назву "Сі з класами". Згодом Страуструп перейменував мову у C++ у 1983 р. Базується на мові С.

Перевагами С++ є:

- швидкодія. Швидкість роботи програм на С++ практично не поступається програмам на С, хоча програмісти отримали в свої руки нові можливості і нові засоби;

- масштабованість. На мові C++ розробляють програми для найрізноманітніших платформ і систем;

- можливість роботи на низькому рівні з пам'яттю, адресами, портами; (Що, при необережному використанні, може легко перетворитися на недолік.)

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

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

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

Першим етапом розробки був базовий класс MDot, що мав protected змінні-позиції int xp, yp та методи: MDot(),void ChangeX(int, bool, bool&, int), virtual void MPaint(HWND, HDC), де конструктор пустий, друга функція змінювала певну змінну уперед або назад відносно булевої змінної з кроком, що передавався останнім параметром, а, коли об'єкт классу доходить до точки, значення якої передається першим, друга булева змінна становиться брехнею , а остання функція малює точку, можна зазначити, що цей метод віртуальний, адже наслідники відрисовуються по-іншому.

Наступним кроком був класс наслідник MDot - класс MCircle, на якому була спроектована і відпрацьована модель обміну, на той час, м'ячиків. До цього классу добавилося багато допоміжних змінних, що теж зберігалися у protected: int mas [3] - масив позицій об'єкту, int xc - змінна для запам'ятовування позиції перед обміном, int level - коефіцієнт важкості гри, bool side - змінна сторони руху, bool move - змінна перевірки руху, bool bobj1, bobj2 - змінні перевірки, який побічний м'ячик рухається, bool obj_side - змінна сторони руху іншого м'ячику, int k - допоміжна змінна для визначення рандомної позиції головного м'яча, int change_x - змінна зі старою позицією головного, а також public: int count - кількість ітерацій, bool circ - змінна видимості м'ячика у фінальному проекті. Останні змінні мені потребувалося змінювати не у функціях.

Також новим у цьому классі є методи: void Level(int) - зміни рівня важкості, void Size(int, int, int) - запам'ятовування розміру, void Timer(HWND, MCircle&, MCircle&) - головна логіка гри, до якої звертається головний таймер программи, спочатку функцією рандому обирається одна з позицій м'ячика для обміну при умови перевірки, що це не позиція, у якій зараз знаходиться м'ячик. Якщо це не так, то механічним шляхом обирається інший м'ячик, тому що переобирання рандомного значення дало не коректну роботу програми. Далі визначається напрям руку м'ячика відносно його положення, а змінна. На кожному з пунктів також визначаються змінні для осьового руху інших м'ячиків. Так як було обрано інший м'яч, враховані данні переходу та інші уточнювання, цей метод тепер заходить до іншої умови - до руху м'ячів. М'ячі взаємно та рівномірно рухаються відносно умовної осі між ними. А virtual void MPaint(HWND, HDC) - тепер малює коло.

Далі був розроблений класс наслідник MCircle - класс MGlass. Його нововведеннями стали три методи: virtual void MPaint(HWND, HDC) - запуск, знищення таймеру програми та повна від рисовка стакану, де задається структура з точок, по якій відрисовуються два чотирикутники та один шестикутник, а потім домальовується прямокутник, усе це утворює стакан, який підрисовується при кожному виклику методу, void Check(int, int, HWND) - використовуються для перевірки правильності кліку.

І нарешті головна частина програми: функція int WINAPI WinMain, що є головною функцією у структурі программ на WINAPI, яка регіструє класс вікна, створює кнопку та утворює петлю з повідомлень, що передаються до функції LRESULT CALLBACK WindowProcedure, яка обробляє усі повідомлення за допомогою конструкції switch case. У цьому фрагменті є створення контекстного меню для регулювання рівня складності, обробка даних щодо розміру вікна та подальше обробка цієї інформації методами, обробка виклику таймеру з обробкою методів Timer та Level, обробка малювання з викликами відповідних методів, обробка кліку на екран з відповідним викликом методу для перевірки правильності кліку та обробка натиску на кнопку чи об'єкт меню.

Рисунок 3.1 - діаграма классів

3.3 Інструкція користувача

Рисунок 3.2 - Початок

Спочатку вас зустріне вікно програми рис. 3.2. Після чого ви зможете обрати рівень складності рис. 3.3, натиснувши на праву клавішу миші.

Рисунок 3.3 - Рівень важкості

Після чого обирайте рівень та натискайте на кнопку рис.3.4 і чекайте завершення циклу рис. 3.5.

Рисунок 3.4 - Початок

Рисунок 3.5 - Гра

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

Рисунок 3.6 - Виграш

комп'ютерний гра програмний winapi

Рисунок 3.7 - Програш

Якщо ви виграли, то натискайте на кнопку початку гри, якщо програли, то шукайте правильний стакан, та натискайте на кнопку.

Якщо ви не хочете більше, то виходьте, натиснувши на червону кнопку рис. 3.8.

Рисунок 3.8 - завершення

Висновки

У рамках даної курсової роботи була розроблена і реалізована гра "Три стакани" за допомогою засобів WinAPI та середовища програмування Code::Blocks.

У роботі приведені скріншоти з гри, у додатку міститься код, а в архіві разом з текстовим документом сама гра у розширенні .exe.

Таким чином, було закріплено матеріал з курсу програмування першого курсу. А за допомогою гри можна гарно проводити час, коли Інтернет не працює.

Перелік посилань

1. Страуструп Б. Язык программирования С++. Часть 1 [Текст] / Б. Страуструп; перевод с англ. - К.: ДиаСофт, 1993. - 264 с.

2. Страуструп Б. Язык программирования С++. Часть 2 [Текст] / Б. Страуструп; перевод с англ. - К.: ДиаСофт, 1993. - 296 с.

3. Форум WinAPI [Електронный ресурс]. ? Режим доступу: http://www.cyberforum.ru/win-api/

4. Электронні уроки по WinAPI [Електронный ресурс]. ? Режим доступу: http://www.progs.biz/winapi/winapi.aspx

5. Графический интерфейс GDI в Microsoft Windows [Електронный ресурс]. ? Режим доступу: http://www.frolov-lib.ru/books/bsp/v14/ch2_3.htm

Додаток

Dot.h

#include <windows.h>

class MDot

{

protected:

int xp, yp;

public:

MDot(){};

void ChangeX(int, bool, bool&, int);

virtual void MPaint(HWND, HDC);

};

void MDot::ChangeX(int x, bool side, bool& move, int level)

{

if(!side)

{

if(xp<x)

xp+=level;

}

else if(side)

{

if(xp>x)

xp-=level;

}

if(xp<(x+level+1)&&xp>(x-level-1))

{

xp=x;

move=false;

}

}

void MDot::MPaint(HWND hwnd, HDC hdc)

{

KillTimer(hwnd, 1);

SetTimer(hwnd, 1, 100, NULL);

SetPixel(hdc, xp, yp, RGB(0xff, 0, 0));

}

Circle.h

#include "Dot.h"

class MCircle: public MDot

{

protected:

int mas[3];

int xc,level;

bool side, move, bobj1, bobj2, obj_side;

int k;

int change_x;

public:

int count;

bool circ;

MCircle();

void Level(int);

void Size(int, int, int);

void Timer(HWND, MCircle&, MCircle&);

virtual void MPaint(HWND, HDC);

};

MCircle::MCircle()

{

move=false;

side=false;

obj_side=false;

bobj1=false;

bobj2=false;

circ=true;

count=1000;

k=0;

level=1;

}

void MCircle::Level(int l)

{

level=l;

}

void MCircle::Size(int x , int y, int n)

{

for(int i =0; i<3; ++i)

mas[i]=x/4+i*x/4;

xp=mas[n-1];

yp=y/2;

}

void MCircle::Timer(HWND hwnd, MCircle &obj1, MCircle &obj2)

{

srand(time(NULL));

if(count<25&&!move)

{

circ=false;

bobj1=false;

bobj2=false;

xc=mas[k];

int c=k;

k=rand()%3;

if(k==c && k%2==0 && count%2==0)

k=1;

else if(k==c && k%2==0 &&count%2==1)

k=3;

else if(k==c && k%2==1 && count%2==0)

k=2;

count++;

if(xc>=mas[k])

side=true;

else

side=false;

move=true;

if(obj1.xp==mas[k])

{

change_x=xc;

bobj1=true;

}

if(obj2.xp==mas[k])

{

change_x=xc;

bobj2=true;

}

}

if(move)

{

ChangeX(mas[k], side, move, level);

if(side)

obj_side=false;

else

obj_side=true;

if(bobj1)

obj1.ChangeX(change_x, obj_side, move, level);

if(bobj2)

obj2.ChangeX(change_x, obj_side, move, level);

InvalidateRect(hwnd, NULL, TRUE);

}

}

void MCircle::MPaint(HWND hwnd, HDC hdc)

{

if(circ)

{

KillTimer(hwnd, 1);

SetTimer(hwnd, 1, 1, NULL);

HBRUSH hBrush;

hBrush=CreateSolidBrush(RGB(0,200,0));

SelectObject(hdc,hBrush);

Ellipse(hdc, xp+15, yp+15, xp-15, yp-15);

}

}

Glass.h

#include "Circle.h"

class MGlass : public MCircle

{

public:

virtual void MPaint(HWND, HDC);

void Check(int, int, HWND);

};

void MGlass::MPaint(HWND hwnd, HDC hdc)

{

KillTimer(hwnd, 1);

SetTimer(hwnd, 1, 1, NULL);

POINT six[]={{xp+30, yp-60},//a

{xp+15, yp-75},//b

{xp-15, yp-75},//c

{xp-30, yp-60},//d

{xp-15, yp-45},//p

{xp+15, yp-45}};//l

POINT man1[]={{xp-30, yp-60},//d

{xp-40, yp+30},//e

{xp-15, yp+45},//f

{xp-15, yp-45}};//p

POINT man2[]={{xp+30, yp-60},//a

{xp+40, yp+30},//k

{xp+15, yp+45},//g

{xp+15, yp-45}};//l

Rectangle(hdc, xp-15, yp+45, xp+15, yp-45);

Polygon(hdc,six, 6);

Polygon(hdc,man1, 4);

Polygon(hdc,man2, 4);

}

void MGlass::Check(int x, int y, HWND hwnd)

{

if (xp-40<x && x<xp+40 && yp-45<y && y<yp+40)

MessageBox(hwnd,"You win!", "Congratulate!", MB_OK);

else

MessageBox(hwnd,"You lose!", "Haha", MB_OK);

}

Main.cpp

#include <windows.h>

#include <time.h>

#include "..\Glass.h"

/* Declare Windows procedure */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */

char szClassName[ ] = "CodeBlocksWindowsApp";

MGlass glass, glass2, glass3;

MCircle circle;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nCmdShow)

{

HWND hwnd; /* This is the handle for our window */

MSG messages; /* Here messages to the application are saved */

WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */

wincl.style = CS_DBLCLKS; /* Catch double-clicks */

wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

wincl.lpszMenuName = NULL; /* No menu */

wincl.cbClsExtra = 0; /* No extra bytes after the window class */

wincl.cbWndExtra = 0; /* structure or the window instance */

/* Use Windows's default colour as the background of the window */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */

if (!RegisterClassEx (&wincl))

return 0;

/* The class is registered, let's create the program*/

hwnd = CreateWindowEx (

0, /* Extended possibilites for variation */

szClassName, /* Classname */

"Three glasses", /* Title Text */

WS_OVERLAPPEDWINDOW, /* default window */

600, /* Windows decides the position */

400, /* where the window ends up on the screen */

544, /* The programs width */

375, /* and height in pixels */

HWND_DESKTOP, /* The window is a child-window to desktop */

NULL, /* No menu */

hThisInstance, /* Program Instance handler */

NULL /* No Window Creation data */

);

CreateWindow("button",

"Go",

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

10, 10, 80, 30,

hwnd,

(HMENU)1001,

hThisInstance,

NULL);

/* Make the window visible on the screen */

ShowWindow (hwnd, nCmdShow);

/* Run the message loop. It will run until GetMessage() returns 0 */

while (GetMessage (&messages, NULL, 0, 0))

{

/* Translate virtual-key messages into character messages */

TranslateMessage(&messages);

/* Send message to WindowProcedure */

DispatchMessage(&messages);

}

return messages.wParam;

}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

static int level=1;

switch (message) /* handle the messages */

{

case WM_CONTEXTMENU :

{

HMENU hMenu = CreatePopupMenu();

AppendMenu( hMenu, MFT_STRING, 10, "&Легко" );

AppendMenu( hMenu, MFT_STRING, 20, "&Средне" );

AppendMenu( hMenu, MFT_STRING, 30, "&Трудно" );

TrackPopupMenu( hMenu, TPM_RIGHTBUTTON |

TPM_TOPALIGN |

TPM_LEFTALIGN,

LOWORD( lParam ),

HIWORD( lParam ), 0, hwnd, NULL );

DestroyMenu( hMenu );

}

break;

case WM_SIZE:

//Запоминаем текущие размеры окна.

glass.Size(LOWORD(lParam),HIWORD(lParam), 1);

circle.Size(LOWORD(lParam),HIWORD(lParam), 1);

glass2.Size(LOWORD(lParam),HIWORD(lParam), 2);

glass3.Size(LOWORD(lParam),HIWORD(lParam), 3);

break;

case WM_TIMER:

glass.Timer(hwnd, glass2, glass3);

glass.Level(level);

break;

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

glass.MPaint(hwnd,hdc);

glass2.MPaint(hwnd,hdc);

glass3.MPaint(hwnd,hdc);

if(glass.circ)

circle.MPaint(hwnd,hdc);

EndPaint(hwnd, &ps);

break;

case WM_LBUTTONDOWN:

glass.Check(LOWORD(lParam),HIWORD(lParam), hwnd);

break;

case WM_COMMAND:

if(LOWORD(wParam)==1001)

{

glass.count=0;

glass.circ=true;

Sleep(1000);

}

if(LOWORD(wParam)==10)

level=1;

if(LOWORD(wParam)==20)

level=6;

if(LOWORD(wParam)==30)

level=10;

break;

case WM_DESTROY:

PostQuitMessage (0); /* send a WM_QUIT to the message queue */

break;

default: /* for messages that we don't deal with */

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.