Допомога у написанні освітніх робіт...
Допоможемо швидко та з гарантією якості!

Розробка алгоритму і програми для варіанту гри «Тетріс»

КурсоваДопомога в написанніДізнатися вартістьмоєї роботи

Інтерфейс користувача — сукупність засобів для обробки та відображення інформації, максимально пристосованих для зручності користувача; у графічних системах інтерфейс користувача реалізовується багатовіконним режимом, змінами кольору, розміру, видимості (прозорість, напівпрозорість, невидимість) вікон, їхнім розташуванням, сортуванням елементів вікон, гнучкими налаштовуваннями як самих вікон, так… Читати ще >

Розробка алгоритму і програми для варіанту гри «Тетріс» (реферат, курсова, диплом, контрольна)

КУРСОВИЙ ПРОЕКТ з «Алгоритми та структури даних»

на тему: Розробка алгоритму і програми для варіанту гри «Тетріс»

Анотація

Курсова робота присвячена розробці логічної гри «Тетріс», у складі: набір об'єктних моделей, програмний код. Виконані усі необхідні роботи з проектування архітектури гри, аналізуються вимоги до неї, описано особливості реалізації, кодування, тестування програми. При написанні програми гри використано об'єктно-орієнтовану мову С++.

Зміст

  • Вступ
  • 1. Техніко-економічне обґрунтування технічного завдання на курсову роботу
    • 1.1 Вимоги користувача
    • 1.2 Аналіз предметної області
    • 1.3 Вибір методу вирішення основної задачі
  • 2. Розробка алгоритмів розв’язку задачі
    • 2.1 Алгоритм побудови робочого поля
    • 2.2 Покроковий алгоритм
    • 2.3 Розробка меню
  • 3. Програмна реалізація
    • 3.1 Вибір мови програмування
    • 3.2 Програмування інтерфейсу
    • 3.3 Розробка і налагодження тексту програми
  • 4. Тестування, перевірка правильності роботи
    • 4.1 Тестування програми
    • 4.2 Аналіз результатів роботи

5. Інструкції з експлуатації

5.1 Програмно-апаратні вимоги

5.2 Порядок роботи з програмою

  • Висновки
  • Література
  • Додаток

Вступ

В даній курсовій роботі реалізується гра «Тетріс». Зміст гри полягає у тому, що випадків фігурки падають зверху в прямокутний стакан висотою 10 і шириною 20 кліток. У польоті гравець може повертати фігурку і рухати її по горизонталі, але не уповільнювати політ. Фігурка летить, поки не натикнеться на іншу фігурку або на підлогу стакана. Якщо при цьому заповнився горизонтальний ряд з 10 кліток, він пропадає і все, що вище за нього, опускається на 1 клітку.

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

Історія гри «Тетріс» починається в червні 1985 року. «Тетріс» був винайдений Олексієм Пажитновим, а потім був інтегрований на ПК IBM Вадимом Герасимовим. Після чого гра «Тетріс» почала поширюватися по всій Москві, а потім вже і по всьому світу. Спочатку вона була розповсюджена в Угорщину, де угорські програмісти інтегрували «Тетріс» для Apple II і Commodore64[1].

Гра ставала все більш відомою в світі, і кілька представників великих компаній зверталися до автора «Тетріса», щоб купити права на розповсюдження гри. Олексій підписує контракт з Mirrorsoft UK і Spectrum Holobyte, надаючи їм права на комп’ютерну версію «Тетріс». Гра набула популярності серед населення і стала самою прибутковою комп’ютерною грою в Англії і США в 1988 році.

Існує безліч способів реалізації даної програми. Їх можна розділити по функціональності:

1) математичний опис руху фігур;

2) графічне відображення руху фігур;

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

Інший спосіб математичного опису руху фігур і заповнення поля «Тетрісу» — створення двовимірної матриці n * k. Через певний проміжок часу буде змінюватися значення, відповідне до положення фігури на площині і вже впалих фігурах. Тобто значення матриці розташоване на n-ому рядку і в k-ому стовпці, буде відповідати частині фігури розташованої на n-ій горизонталі і k-ій вертикалі.

Наведені вище способи не є єдиними. Вони лише найбільш популярні в реалізації програми «Тетріс» серед програмістів.

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

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

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

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

Для кодування гри буде обрана мова С++, що сприяє написанню надійного програмного продукту.

тетріс кодування програмування архітектура

1. Техніко-економічне обґрунтування технічного завдання на курсову роботу

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

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

Користувачу повинно бути доступне ручне налаштування роботи програми, а саме: розміщення фігур тетраміно та вибір рівня швидкості фігур тетраміно — користувач повинен сам вирішувати ці питання на власний розсуд.

Дані про «швидкість» користувача повинні виводитись у діалоговому вікні після завершення гри.

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

1.2 Аналіз предметної області

Метою дано курсової роботи є розробка гри «Тетріс». Вона відноситься до логічних ігор, які допомагають розвинути реакцію, тренують логіку. При тривалій роботі за комп’ютером виникає бажання трохи відпочити. Для цієї мети не підходять ігри типу стратегій, бо для них потрібно багато часу, а для 5−10 хвилинного відпочинку цілком підійде саме «Тетріс». У стандартному пакеті операційних систем даної гри немає, тому виникла необхідність у її створенні.

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

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

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

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

До ігор такого типу пред`являються такі вимоги: використання простих засобів управління; зручний графічний інтерфейс; поступове ускладнення гри при наборі певно кількості очок. Під час виконання програма повинна виконуватися коректно і не приводити до збоїв.

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

При розробці програми гри «Тетріс» для опису математичної частини алгоритму був використаний двовимірний масив, розмірністю 20 * 10. Для створення графічної частини програми використовувалися графічні можливості мови C ++.

Масив — це набір об'єктів однакового типу, розташованих один за одним у пам’яті комп’ютера. Масив можна описати наступним чином:

тип_даних ім'я масиву [розмір_масиву]

Кожний масив має ім'я. Значення індексу повинні знаходитись у діапазоні від нуля до величини, що на одиницю менша розміру масиву, вказаного під час його опису. Тип_даних задає тип елементів масиву. Розмір_масиву — константа чи константний вираз, що задає кількість елементів масиву. Ім'я масиву є вказівником-константою, що дорівнює адресу початку масиву (першого байта першого елемента масиву).

Доступ до окремих елементів масиву може здійснюватись або за допомогою імені масиву та індексу (порядковому номеру) або за вказівником (операція *). 2]

У створенні алгоритму використовувався масив як математичний аналог поля «Тетріс». Кожна комірка масиву відповідає певній області поля гри. Кожна область поля гри може бути заповнена фігурою або бути порожньою. Відповідно, кожна область поля може приймати два значення. Для цих цілей можна використовувати логічні змінні. Кожна фігура має певну форму і займає декілька областей поля гри. Отже в масиві, комірки, які відповідають заповненим областям поля, матимуть логічне значення true. Для комірок, які відповідають порожнім областям, буде присвоєно логічне значення false. Кожна горизонталь поля тетрісу відповідає рядку двовимірного масиву, а вертикаль — стовпцю. Рух фігур проводиться через рівні проміжки часу, тобто відбувається повторення алгоритму через рівні проміжки часу. Рівні проміжки часу можна забезпечити за допомогою використання елементу мови С ++ таймер (який був використаний в даній програмі). Через кожний тік таймера буде відбуватися повторення алгоритму руху фігури.

Щоб гра була працездатною, необхідно кожній комірці масиву кожний тік таймера присвоювати значення, відповідні областям поля. Так як кількість комірок велика (їх 200), зручно було використовувати циклічні конструкції. Це дозволило скоротити програмний код і кількість помилок в ньому. Для цих цілей був використаний оператор for. Короткостроковою метою гри тетріс є повне заповнення фігурами горизонталі для подальшого їх очищення та отримання балів. Для цього необхідно було внести в програму функцію перевірки заповнення горизонталей. Для масиву це представляється як перевірка осередків кожного рядка на однаковість значень, дану задачу вирішує умовна конструкція. У даній роботі був використаний оператор if.

Для зображень фігур тетраміно використовується двохвимірний масив 4×4. Гра тетріс вимагає зображення областей поля у вигляді квадратів. Для цього була використана структура мови C ++ Rectangle (прямокутник). Для її опису необхідні координати верхнього лівого кута прямокутника (що відповідає значенням вертикалі і горизонталі поля гри), а також розміри його сторін.

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

Наведені вище принципи і елементи стали основою алгоритму.

2. Розробка алгоритмів розв’язку задачі

2.1 Алгоритм побудови робочого поля

1. Запуск програми;

2. Оголошення масивів та їх заповнення мулевими значеннями;

3. Запуск таймера;

4. Випадковий вибір фігури;

5. Заповнення перших чотирьох рядків масиву stock одиничними значеннями у відповідності з обраною фігурою;

6. Перевірка вільного місця під фігурою;

6.1 Затримка;

6.2 Здвиг фігури на одну позицію вниз;

6.3 Натиск клавіші вправо;

6.3.1 Якщо відбувся натиск клавіші вправо, виконується здвиг фігури на одну позицію вправо;

6.3.2 Якщо не відбувся натиск клавіші вправо, перехід до п. 6.4;

6.4 Натиск клавіші вліво;

6.4.1 Якщо відбувся натиск клавіші вліво, виконується здвиг фігури на одну позицію вліво;

6.4.2 Якщо не відбувся натиск клавіші вліво, перехід до п. 6.5;

6.5 Натиск клавіші поворот;

6.5.1 Якщо відбувся натиск клавіші поворот, виконується поворот фігури;

6.5.2 Якщо не відбувся натиск клавіші поворот, перехід до п. 6.6;

6.6 Натиск клавіші вниз;

6.6.1 Якщо відбувся натиск клавіші вниз, виконується швидкий рух фігури вниз;

6.6.2 Якщо не відбувся натиск клавіші вниз, перехід до п. 6;

7. Перевірка повного заповнення рядка;

7.1 Якщо рядок повністю заповнений, відбувається його видалення з подальшим зсувом вниз всіх рядків, які знаходяться над заповненим рядом;

7.2 Добавлення до рейтингових балів гри кількість видалених рядків та перехід до п. 4;

8. Перевірка наступного ряду на наявність вільного місця для фігури;

8.1 Якщо місце є, відбувається перехід до п. 4;

9. Зупинка таймера;

10. Вивід на екран результатів гри;

11. Закінчення гри.

2.2 Покроковий алгоритм

2.3 Розробка меню

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

В сучасних операційних системах меню є найважливішим елементом графічного інтерфейсу користувача.

Меню являє собою набір наступних елементів:

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

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

3. пункт меню — окремі опції додатка.

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

Пункти меню в головному і спливаючих меню можуть бути увімкнуті, вимкнені або недоступні. Іноді замість слів «увімкнуто» і «виключено» використовують слова «активно» і «неактивно». Зазвичай пункти, позначені як увімкнуті або вимкнені, для користувача виглядають однаково, а недоступний пункт меню виводиться дещо затемненим, зокрема сірим кольором.

Таким чином меню утворює ієрархічну структуру функціональних можливостей додатка. 3]

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

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

3.1 Вибір мови програмування

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

При створенні С++ прагнули зберегти сумісність з мовою С. Більшість програм на С справно працюватимуть із компілятором С++. С++ має синтаксис, заснований на синтаксисі С.

Нововведеннями С++ порівняно з С є:

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

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

*доповнення до стандартної бібліотеки;

*додаткові типи даних;

*обробка винятків;

*простори імен;

*вбудовані функції;

*перевантаження операторів;

*перевантаження імен функцій;

*посилання і оператори управління вільно розподіленою пам’яттю. 4]

Сі++ додає до Сі об'єктно-орієнтовані можливості. Він вводить класи, які забезпечують три найважливіші властивості ООП: інкапсуляцію, успадкування і поліморфізм. Переваги мови C++ порівняно з іншими мовами: *Швидкодія. Швидкість роботи програм на С++ практично не поступається програмам на С, хоча програмісти отримали в свої руки нові можливості і нові засоби.

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

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

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

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

Саме тому для реалізації гри «Тетріс» була обрана мова С++.

3.2 Програмування інтерфейсу

Інтерфейс користувача (англ. User Interface, UI, дружній інтерфейс) — засіб зручної взаємодії користувача з інформаційною системою.

Інтерфейс користувача — сукупність засобів для обробки та відображення інформації, максимально пристосованих для зручності користувача; у графічних системах інтерфейс користувача реалізовується багатовіконним режимом, змінами кольору, розміру, видимості (прозорість, напівпрозорість, невидимість) вікон, їхнім розташуванням, сортуванням елементів вікон, гнучкими налаштовуваннями як самих вікон, так і окремих їхніх елементів (файли, папки, ярлики, шрифти тощо), доступністю багатокористувацьких налаштувань. 5]

Тетріс — це гра. Тому, при розробці інтерфейсу користувача необхідно врахувати ряд особливостей:

1) Інтерфейс повинен бути інтуїтивно зрозумілий простому користувачеві комп’ютера.

2) Колірна схема не повинна дратувати людину.

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

Що ж стосується другого пункту, тут застосовані «холодні» кольори (відтінки сірого). Вони не несуть жодного психічного навантаження, тому час гри для людини буде приємним.

3.3 Розробка і налагодження тексту програми

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

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

Налагодження — це процес пошуку і усунення помилок. Помилки в програмі поділяють на дві групи: синтаксичні (помилки в тексті) і алгоритмічні. Синтаксичні помилки — найбільш легко усуваються. Алгоритмічні помилки виявити важче. Етап налагодження можна вважати закінченим, якщо програма правильно працює на одному-двох наборах вхідних даних. 6]

4. Тестування, перевірка правильності роботи

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

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

Основні принципи організації тестування:

1) необхідною частиною кожного тесту повинно бути опис очікуваних результатів роботи програми, щоб можна було швидко з’ясувати наявність або відсутність помилки в ній;

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

3) з тих же міркувань організація — розробник програмного забезпечення не повинен «одноосібно» його тестувати (повинні існувати організації, що спеціалізуються на тестуванні програмних засобів);

4) повинне бути правилом вивчення результатів кожного тесту, щоб не пропустити малопомітну на перший погляд помилку в програмі;

5) необхідно ретельно підбирати тест не тільки для правильних (передбачених) вхідних даних, але і для неправильних (непередбачених);

6) при аналізі результатів кожного тесту необхідно перевіряти, чи не робить програма того, що вона не повинна робити;

7) потрібно зберігати використані тести (для підвищення ефективності повторного тестування програми після її модифікації);

8) тестування не повинне плануватися виходячи з припущень, що в програмі не будуть виявлені помилки (зокрема, потрібно виділяти для тестування достатні тимчасові і матеріальні ресурси);

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

10) потрібно завжди пам’ятати, що тестування — творчий процес, а не відноситись до нього як до рутинного заняття.

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

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

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

5. Інструкції з експлуатації

5.1 Програмно-апаратні вимоги

Необхідний обсяг ОЗУ (Оперативний запам’ятовуючий пристрій) 64 Мб і графічний адаптер, що підтримує режим 800×600 і вище, глибина кольору 32 біт. Необхідне місце на жорсткому диску 780 Кб. Клавіатура, миша.

Програмні вимоги:

Операційна система сімейства Windows: 2000;2007/XP (32/64) / Vista (32/64) / 7 (32/64)

5.2 Порядок роботи з програмою

Запускаємо гру Тетріс, нажавши праву клавішу мишки по ярлику гри, а потім вибравши строку «открыть», або подвійним кліком лівої клавіші мишки. З’являється головне вікно програми (Рис.1)

Рисунок 1- Головне вікно програми Для того щоб почати або завершити гру необхідно натиснути на панелі меню Game -> New/Exit (Рис.2).

Рисунок 2- Початок/завершення гри Щоб обрати певний рівень складності гри, потрібно на панелі головного меню натиснути лівою клавішею мишки на Level і обрати бажаний рівень складності. При цьому обраний варіант буде позначатися певною відміткою (Рис.3).

Рисунок 3- Вибір рівня складності

Щоб отримати інформацію про гру потрібно на панелі головного меню натиснути лівою клавішею мишки на Help і обрати About (Рис.4).

Рисунок 4- Інформація про гру Рейтинг користувача виводиться після завершення гри (Рис.5).

Рисунок 5- Рейтинг користувача

Висновки

У цій роботі була виконана поставлена задача — створення програми за темою «Розробка алгоритму і програми для варіанту гри „Тетріс“». За допомогою цієї програми можна приємно провести час, удосконалювати координацію та розвивати логічне мислення. Програма не займає багато місця, не вимоглива до встановленого програмного забезпечення.

Література

1. М. Эллис, Б.Страструп. Справочное руководство по языку С++ с комментариями: Пер. с англ. — Москва: Мир, 2010.

2. Стефенс Д. Р., Диггинс К., Турканис Д., Когсуэлл Д. C++. Пер. с англ. — М.: КУДИЦ-ПРЕСС, 2007. — 624 с.

3. http://uk.wikibooks.org/wiki/C%2B%2B

4. А. Я. Архангельский Программирование в C++ Builder 6. Издательство: Бином, 2008 г.

5. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. Буч Г. … СПб: Питер, 2009 г. — 368 с

6. Власюк В. Х., Круподьорова Л. М. «Програмування мовою Сі, Вінниця, ВДТУ, 2001.

Додаток

Код програми

#include

#include

#include

#include" resource. h"

enum ShapeType { line, square, rightL, leftL, pyramide, leftZ, rightZ};//The type of shape:

#define size 20//size of shape square

// class Shape

class Shape

{

public:

boolcells[4][4]; // 4×4 matrix that conatains the shape

ShapeTypecurType; // current type of shape

voidNewShape (ShapeType);

voidRotate ();

voidClearShape (bool c[4][4]); // clear the 4×4 matrix

};

void Shape: ClearShape (bool c[4][4])

{

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

for (int j=0; j<4; j++)

c[i][j]=false;

}

void Shape: NewShape (ShapeType type)

{

ClearShape (cells);

int i;

curType=type;

switch (type)

{

case line: for (i=0; i<4; i++)

cells[0][i]=true;

break;

case square: for (i=0; i<2; i++)

for (int j=0; j<2; j++)

cells[i][j]=true;

break;

case leftL: for (i=0; i<3; i++)

cells[0][i]=true;

cells[1][2]=true;

break;

case rightL: for (i=0; i<3; i++)

cells[0][i]=true;

cells[1][0]=true;

break;

case pyramide: for (i=0; i<3; i++)

cells[1][i]=true;

cells[0][1]=true;

break;

case leftZ: cells[0][0]=true; cells[1][0]=true;

cells[1][1]=true; cells[2][1]=true;

break;

case rightZ: cells[0][1]=true; cells[1][0]=true;

cells[1][1]=true; cells[2][0]=true;

break;

}

}

void Shape: Rotate ()

{

switch (curType)

{

case line:

{

int k;

if (cells[0][0]==true)

{

ClearShape (cells);

for (k=0; k<4; k++)

cells[k][1]=true;

}

else

{

ClearShape (cells);

for (k=0; k<4; k++)

cells[0][k]=true;

}

}

case square: return;

}

bool tempShape[4][4];

ClearShape (tempShape);

for (int j=3−1, c=0; j>=0; j—, c++)

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

tempShape[c][i]=cells[i][j];

ClearShape (cells);

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

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

cells[f][d]=tempShape[f][d];

}

// Tetris window class

class TetrisWnd: public CFrameWnd

{

public:

TetrisWnd ();

void NewShape (); // appearance of new shape at the top

COLORREF ShapeColor (int color); // some reserved colors

void SetLevel (int);

bool CheckLeft (); // check the possibility to move on the left

bool CheckRight (); // check the possibility to move on the right

void ShowTitle (); // show the window title

void CheckForLine (); // check for the completed line

bool IsAtBottom (); // check the possibility to move on the bottom

void ClearStock (); // clear the field

CRect GetRect (); // get the rectangle of shape’s placement

int color; // current color

private:

CMenumenu;

Shapeshape;

shortstock[20][10];

intcurY;

intcurX;

boolbGame;

intscore;

intlevel;

boollevel1;

boollevel2;

boollevel3;

protected:

//{{AFX_VIRTUAL (TetrisWnd)

protected:

virtual BOOL PreCreateWindow (CREATESTRUCT& cs);

//}}AFX_VIRTUAL

protected:

//{{AFX_MSG (TetrisWnd)

afx_msg void OnPaint ();

afx_msg void OnTimer (UINT nIDEvent);

afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnGameNew ();

afx_msg void OnGameExit ();

afx_msg void OnClose ();

afx_msg void OnLevelLevel1();

afx_msg void OnUpdateLevelLevel1(CCmdUI* pCmdUI);

afx_msg void OnLevelLevel2();

afx_msg void OnUpdateLevelLevel2(CCmdUI* pCmdUI);

afx_msg void OnLevelLevel3();

afx_msg void OnUpdateLevelLevel3(CCmdUI* pCmdUI);

afx_msg void OnHelpAbout ();

//}}AFX_MSG

//{{AFX_DATA_MAP (TetrisWnd)

//}}AFX_DATA_MAP

//{{AFX_DATA (TetrisWnd)

//}}AFX_DATA

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (TetrisWnd, CFrameWnd)

//{{AFX_MSG_MAP (TetrisWnd)

ON_WM_PAINT ()

ON_WM_TIMER ()

ON_WM_KEYDOWN ()

ON_COMMAND (ID_GAME_NEW, OnGameNew)

ON_COMMAND (ID_GAME_EXIT, OnGameExit)

ON_WM_CLOSE ()

ON_COMMAND (ID_LEVEL_LEVEL1, OnLevelLevel1)

ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL1, OnUpdateLevelLevel1)

ON_COMMAND (ID_LEVEL_LEVEL2, OnLevelLevel2)

ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL2, OnUpdateLevelLevel2)

ON_COMMAND (ID_LEVEL_LEVEL3, OnLevelLevel3)

ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL3, OnUpdateLevelLevel3)

ON_COMMAND (ID_HELP_ABOUT, OnHelpAbout)

//}}AFX_MSG_MAP

END_MESSAGE_MAP ()

TetrisWnd:TetrisWnd ()

CS_VREDRAW ,

AfxGetApp ()->LoadStandardCursor (IDC_ARROW),

(HBRUSH)GetStockObject (BLACK_BRUSH),

AfxGetApp ()->LoadIcon (IDI_IC));

Create (s," Tetris");

menu.LoadMenu (IDR_MENU);

SetMenu (&menu);

level=700;

SetLevel (1);

srand (time (0));

ClearStock ();

class MyApp: public CWinApp

{

public:

virtual BOOL InitInstance ()

{

m_pMainWnd = new TetrisWnd;

m_pMainWnd->ShowWindow (SW_SHOWNORMAL);

return TRUE;

}

};

MyApp app;

BOOL TetrisWnd: PreCreateWindow (CREATESTRUCT& cs)

{

cs.style &= ~WS_MAXIMIZEBOX;

cs.style &= ~WS_THICKFRAME;

cs.cx = 210;

cs.cy = 450;

return CFrameWnd: PreCreateWindow (cs);

}

void TetrisWnd: OnPaint ()

{

CPaintDC dc (this);

int i, j;

CBrush brush;

brush.CreateSolidBrush (ShapeColor (color));

dc.SelectObject (&brush);

for (i=0; i<4; i++)

{

for (j=0; j<4; j++)

{

if (shape.cells[i][j]==true)

dc.Rectangle (curX+j*size, curY+i*size, curX+(j+1)*size, curY+(i+1)*size);

}

}

for (i=0; i<20; i++)

{

for (j=0; j<10; j++)

{

if (stock[i][j]≠-1)

{

brush.DeleteObject ();

brush.CreateSolidBrush (ShapeColor (stock[i][j]));

dc.SelectObject (&brush);

dc.Rectangle (j*size, i*size,(j+1)*size,(i+1)*size);

}

}

}

}

CRect TetrisWnd: GetRect ()

{

CRect r;

r.left=curX-size;

r.right=curX+size*5;

r.top=curY-size;

r.bottom=curY+size*5;

return r;

}

void TetrisWnd: OnTimer (UINT nIDEvent)

{

if (nIDEvent==1 && bGame==true)

{

if (IsAtBottom ())

{

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

for (int j=0; j<4; j++)

{

if (shape.cells[i][j]==true)

stock[curY/20+i][curX/20+j]=color;

}

NewShape ();

if (IsAtBottom ())

{

bGame=false;

}

InvalidateRect (GetRect ());

CheckForLine ();

return;

}

curY+=20;

InvalidateRect (GetRect ());

}

else if (bGame==false)

{

KillTimer (1);

CString s;

s.Format («%d», score);

MessageBox («You are lost! rYour score is: «+s);

}

CFrameWnd:OnTimer (nIDEvent);

}

void TetrisWnd: OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch (nChar)

{

case VK_CONTROL:

case VK_UP:shape.Rotate ();break;

case VK_LEFT:if (CheckLeft ()) return; curX-=20; break;

case VK_RIGHT:if (CheckRight ()) return; curX+=20; break;

case VK_DOWN:KillTimer (1); SetTimer (1,20,NULL); break;

}

InvalidateRect (GetRect ());

CFrameWnd:OnKeyDown (nChar, nRepCnt, nFlags);

}

void TetrisWnd: OnGameNew ()

{

ClearStock ();

score=0;

bGame=true;

SetLevel (1);

NewShape ();

ShowTitle ();

Invalidate ();

}

void TetrisWnd: ClearStock ()

{

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

for (int j=0; j<10; j++)

stock[i][j]=-1;

}

bool TetrisWnd: IsAtBottom ()

{

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

{

for (int j=0; j<4; j++)

{

if (shape.cells[i][j]==true)

stock[curY/20+i+1][curX/20+j]≠-1)

return true;

}

}

return false;

}

void TetrisWnd: CheckForLine ()

{

int i, j, k, c=0;

bool flag;

for (i=0; i<20; i++)

{

flag=true;

for (j=0; j<10; j++)

flag &= (stock[i][j]≠-1);

if (flag==true && j≠0)

{

c++;

score++;

ShowTitle ();

for (k=i; k>0; k—)

{

for (j=0; j<10; j++)

{

stock[k][j]=stock[k-1][j];

}

}

}

}

for (k=0; k

for (j=0; j<10; j++)

stock[k][j]=-1;

Invalidate ();

}

void TetrisWnd: ShowTitle ()

{

CString title;

title.Format («Tetris score: %d», score);

SetWindowText (title);

}

bool TetrisWnd: CheckRight ()

{

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

{

for (int j=0; j<4; j++)

{

if (shape.cells[i][j]==true)

}

}

return false;

}

bool TetrisWnd: CheckLeft ()

{

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

{

for (int j=0; j<4; j++)

{

if (shape.cells[i][j]==true)

}

}

return false;

}

// Menu commands

void TetrisWnd: OnGameExit ()

{

OnClose ();

}

void TetrisWnd: OnClose ()

{

KillTimer (1);

CFrameWnd:OnClose ();

}

void TetrisWnd: OnLevelLevel1()

{

SetLevel (1);

}

void TetrisWnd: OnUpdateLevelLevel1(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck (level1);

}

void TetrisWnd: OnLevelLevel2()

{

SetLevel (2);

}

void TetrisWnd: OnUpdateLevelLevel2(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck (level2);

}

void TetrisWnd: OnLevelLevel3()

{

SetLevel (3);

}

void TetrisWnd: OnUpdateLevelLevel3(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck (level3);

}

void TetrisWnd: SetLevel (int lev)

{

level1=level2=level3=false;

switch (lev)

{

case 1: level=700; level1=true; break;

case 2: level=500; level2=true; break;

case 3: level=300; level3=true; break;

}

}

void TetrisWnd: OnHelpAbout ()

{

CDialog dlg (IDD_ABOUT);

dlg.DoModal ();

}

COLORREF TetrisWnd: ShapeColor (int color)

{

switch (color)

{

case 0: return RGB (255,0,0);

case 1: return RGB (0,255,0);

case 2: return RGB (0,0,255);

case 3: return RGB (255,0,255);

case 4: return RGB (0,255,255);

case 5: return RGB (255,255,0);

}

return RGB (255,255,255);

void TetrisWnd: NewShape ()

{

KillTimer (1);

SetTimer (1,level, NULL);

curY=0;

curX=60;

ShapeType t=ShapeType (rand ()%7);

shape.NewShape (t);

color=rand ()%6;

Показати весь текст
Заповнити форму поточною роботою