close

Вход

Забыли?

вход по аккаунту

?

Kursova

код для вставкиСкачать
План
Вступ ............................................................................................................................. 3
Програмування комп’ютерних ігор........................................................................... 4
1.1 Загальні відомості про гру «Тетріс»................................................................................ 11
Концепція гри та Розробка інтерфейсу ................................................................... 13
Блок-схема та опис алгоритму програми................................................................ 14
Мова програмування і середовище розробки програми ....................................... 17
Програмний код ......................................................................................................... 29
Висновки та пропозиції ............................................................................................ 39
Література .................................................................................................................. 40
Додатки....................................................................................................................... 41
Діаграма Ганта……………………………26
2
Вступ
Об’єкт – програмування комп’ютерних ігор
Мета: дослідження алгоритмів комп’ютерної гри «Тетріс»
для створення
оптимального програмного продукту за допомогою технологій об'єктноорієнтованого програмування (мова програмування С++)
Предмет – комп’ютерна гра «Тетріс»
допомогою
технологій
у вигляді програмного продукту за
об'єктно-орієнтованого
програмування
(мова
програмування С++)
Завдання :
1) дослідити такі структурні елементи програмного коду С++ як цикли (та
їхні оператори), масиви та функції.
2) Побудова алгоритму комп. гри «Тетрис»
3) Написання програмного коду.
Методи і технології розробки: аналіз алгоритмів пошуку; технологія
автоматизованих баз даних; візуальне і об'єктно-орієнтоване програмування,
абстрагування, порівняння, синтез, спостереження, розрахунок та аналіз на
основі статистичних даних
Результати роботи: Створення комп’ютерної гри з зручним та зрозумілим
користувацьким інтерфейсом
3
Програмування комп’ютерних ігор
Створення комп’ютерної гри – творчий процес, здійснюваний однією
людиною або групою людей, що складається з декількох етапів і дозволяє
реалізувати взаємодію гравця з ігровим світом.
Процес створення гри безпосередньо залежить від обраного жанру, якості
виконання та інших умов. У той час, як створення професіоналами модернової
комп’ютерної гри вимагає чималих коштів і зазвичай займає роки, казуальні і
інді-ігри можуть бути створені аматорами за короткий час без будь-яких
капіталовкладень.
Умовно можна виділити шість основних етапів створення комп’ютерної гри
1) Концепція. Написання сюжету гри, визначення жанру і головних
можливостей геймплея, створення начерків, скетчів, концепт-артів і написання
текстів діалогів. Планування концепції ігрового дизайну є важливою частиною
розробки, оскільки визначає весь вектор подальших робіт. Головним завданням
на даному етапі є чітке уявлення загальної ідеї, яку планується реалізувати.
2) Програмування. Створення та редагування програмної бази та фізики гри.
Сюди входить написання сирцевого коду, створення можливостей для взаємодії
гравця
з
ігровом
середовищем,
підключення
необхідних
бібліотек,
програмування штучного інтелекту, попереднє тестування, налагодження та
багато іншого. Програмна складова гри постійно змінюється протягом всієї
розробки, тому що тісно пов’язана з усіма аспектами ігрового процесу.
3) Дизайн рівнів. Моделювання оточення, визначення об’єктів і деталей,
додавання скриптів і тригерів. Дизайн рівнів часто має найвищий пріоритет при
створенні відеоігор, бо саме цей аспект відображає суть створюваного світу. При
цьому дизайнер рівнів виступає в ролі творця, так як саме він визначає форму
навколишнього середовища, місце розташування персонажів і їх завдання.
4
4) Графіка. Створення графічної складової гри. Одержуване зображення
повинне відповідати задуманій ідеї, тому необхідно витримати обраний стиль, і
комп’ютерна графіка повинна бути виконана грамотно і якісно. Робота
художника додає грі необхідного забарвлення і робить її неповторною та
оригінальною.
5) Звукове оформлення. Підбір саундтреків і звукових ефектів, запис
внутрішньоігрових діалогів і кат-сцен. Звукове оформлення є невід’ємною
частиною ігрової атмосфери і суттєво доповнює антураж. Правильно підібране
звукове супроводження здатне глибше занурити гравця в ігровий світ, а
наявність кінематографічних кат-сцен дозволяє точніше зобразити життя і
внутрішній світ персонажів.
6) Тестування. У процесі тестування виявляються баги і дрібні помилки в грі,
а також гра перевіряється на сумісність з апаратним і програмним
забезпеченням. Це заключний етап створення гри, подібний шліфовці
скульптури і вичитуванні помилок у художньому творі. Після закінчення
основного тестування гра набуває закінченого вигляду.
Звичайно, ці етапи можуть йти як в іншому порядку, так і паралельно, в
залежності від уподобань та можливостей творців. Наприклад, якщо за основу
береться вже готове ігрове середовище, можна приступати безпосередньо до
дизайну рівнів, і проводити тестування з самого початку, відразу після створення
першого рівня, використавши в якості звукового оформлення вже готові
композиції.
Види і різновиди комп'ютерних ігор
Жанр відеогри використовується для класифікації відеоігор відповідно до
інтерактивних ігрових дій гравця. Жанр відеогри не залежить від сценарію або
змісту уявного ігрового світу, на відміну від творів літератури чи кіномистецтва.
Єдиної класифікації жанрів відеоігор не існує, тому в різних джерелах одну й ту
5
саму відеогру можуть відносити до різних. Також можливі змішання жанрів,
коли гру неможливо віднести до одного жанру.
Ігри вмінь та дії (англ. Skill-and-Action) — включає ігри, дії яких відбувають
в реальному часі, активно задіюють графіку та звук для занурення в ігровий
процес і вимагають швидкої реакції гравця. Вони більше поширені на аркадних
ігрових автоматах.
Бойові ігри (англ. Combat Games) — зображають в тому чи іншому вигляді
пряме, жорстоке протиборство. Вимагають від гравця стріляти, руйнувати, при
цьому самому уникати знищення; Ігри-лабіринти (англ. Maze Games) —
вимагають від гравця певним чином рухатися лабіринтом (не обов'язково для
пошуку виходу) для виконання поставленого завдання (уникнути ворогів,
зібрати всі предмети і т. д.); Спортивні ігри (англ. Sports Games) — ігри,
засновані
на
реальних
видах
спорту
(футбол,
теніс,
шахи); Відбивання (англ. Paddle Games) — засновані на концепції пінг-понгу, де
гравець повинен відбивати предмети, щоб виграти; Гоночні ігри (англ. Race
Games) — передбачають змагання без прямих агресивних дій щодо противника
у спробах випередити його в русі; Різне — частину ігор Кріс Кроуфорд не зміг
класифікувати, якDonkey Kong або Frogger. Деякі від називав модифікаціями
інших жанрів, наприклад Frogger модифікацією лабіринту, де рухається не
стільки персонаж гравця, скільки сам «лабіринт».
Стратегічні ігри (англ. Strategy games) — вимагають від гравця більше
мислення, ніж дій. Коли ж дії потрібні, для їх виконання не вимагається
швидкості реакції або вправності. Вони більше поширені на персональних
комп'ютерах.
Пригоди (англ. Adventures) — гравець повинен пересуватися ігровим світом,
застосовуючи певні предмети для вирішення поставлених завдань, як правило
головоломок; D&D-ігри (англ. D&D Games) — засновані на настільній рольовій
грі Dungeons and Dragons. Ці ігри передбачають бої, але в такій формі, де гравець
може їх обдумати, покладатися на свій розум, а не реакцію. Гравець покроково
6
переміщується світом, борючись із противниками для виконання поставленого
завдання;Варгейми (англ. Wargames) — відтворюють бої, орієнтуючись на
тактику. В них так само перемога досягається логічним мисленням, а не
швидкістю дій; Ігри шансу(англ. Games of Chance) — відтворюють азартні ігри,
в яких значну роль відіграє вплив випадковості; Навчальні та дитячі
ігри (англ. Educational and Children's Games) — дозволяють навчитися чомунебудь для подальшого використання отиманих знань і навичок в реальності
через
симуляцію,
поступовий
виклад
інформації;Міжособистісні
ігри (англ. Interpersonal Games) — зосереджуються на взаємодії осіб або їх груп,
симулюють спілкування з різними варіантами його розвитку
Action (трансліт. — «екшен» або «екшн»; з англ. — «дія») — жанр відеоігор,
який вимагає від гравця певних фізичних зусиль, таких як швидкості реакції та
здібності швидко приймати тактичні рішення. Дія таких ігор відбувається дуже
динамічно і потребує в більшій мірі рефлексів, ніж логіки і планування
Цей жанр поділяється на велику кількість піджанрів, серед яких основними
є:

Шутери — вимагають від гравця боротися з противниками шляхом
стрілянини.
Залежно
від
перспективи,
поділяються
на
шутери
від першої (Wolfenstein 3D) читретьої особи (Макс Пейн). Існують різновиди
як тактичні, в яких ігровий персонаж діє у складі команди (SWAT
4), аркади (Alien Shooter), стелс-екшн, метою якого є приховані дії для
виконання завдань, без прямого знищення противників (серія Hitman). Щодо
ігор, де основою ігрового процесу є знищення великих кількостей ворогів, а
сама стрілянина в цьому переважає над тактикою і влучністю, застосовується
термін Shoot 'em up (R-Type, Touhou, Contra).

Файтинги — імітують ближній бій, як правило один на один, на спеціальних
аренах. Приклади: серія Mortal Kombat, Street Fighter.
7

Beat'em up — подібні на файтинги, з тою різницею, що персонажі вільно
переміщуються ігровим світом (а не спеціальною ареною) і борються проти
багатьох противників одночасно. Приклади: Golden Axe, Battletoads, Double
Dragon.

Платформери — персонаж мусить рухатися, стрибаючи по платформах, та
долати перешкоди. Приклади: Mario, Spyro the Dragon, Megaman.

Лабіринти — персонаж рухається лабіринтом з метою знайти вихід, зібрати
предмети і/або уникнути пасток і небезпек. Часто в іграх цього жанру є
обмеження на час. Приклади: Pac-Man, Boulder Dash.
Стратегія
Сенс стратегічних ігор полягає в плануванні дій та виробленні певної стратегії
для досягнення якоїсь конкретної мети, наприклад, перемоги у військовій
операції. Гравець керує не одним персонажем, а цілим підрозділом,
підприємством чи навіть всесвітом. Відповідно до реалізації ігрового часу,
стратегічні відеоігри поділяються на два основних різновиди:

Покрокові стратегічні ігри — гравець та його противник здійснюють дії один
за одним, покроково, маючи змогу за один ігровий хід виконати певну
кількість операцій. Приклади: Heroes of Might and Magic III, Цивілізація.

Стратегічні ігри в реальному часу — і гравець і противник виконують свої дії
одночасно, проте часто часто масштаб часу відрізняється від реального.
Наприклад, будівництво триває кілька секунд, а ігрова година складає кілька
хвилин реального часу. Приклади: StarCraft, Age of Empires III.

Tower Defense — похідний жанр, в якому гравець керує оборонними
баштами аби не пропустити хвилі ворогів.

MOBA — похідний жанр, в якому гравець керує одним персонажем з
метою захистити свою базу від ворогів та знищити ворожу.
8

MMORTS — багатокористувацькі он-лайн стратегії в реальному часі,
орієнтовані на суперництво/співпрацю з іншими реальними гравцями,
щоб досягнути спільної мети.
Рольова гра
Гравець асоціюється з конкретним персонажем або лідером команди, які
діють відповідно до правил своїх ролей. Наприклад, лицар не може того, що
чарівник, кожна роль має свої особливості, а часом від неї залежить і розвиток
сюжету. Мета ігрового процесу полягає у виконанні різноманітних завдань
(квестів) для розвитку одного персонажа або групи. Можливі варіанти дій
залежать від обраного образу персонажа, попередньо визначеного чи
формованого самим гравцем.
Симулятор
В широкому розумінні всі ігри є симуляторами. У вужчому значенні це
відеоігри, призначені для складання уявення про дійсність за допомогою
відображення певних реальних явищ та властивостей у віртуальному
середовищі. Існує чимало піджанрів, як технічні (управління складними
технічними пристроями, авіаційною технікою та інші, наприклад гра Іл-2
Штурмовик), аркадні (відрізняються від аркад наявністю спрощеної фізичної
моделі. Наприклад, X-Wing), спортивні, економічні, побачень та інші.
Пригоди
В пригодницьких відеоіграх гравець керує ігровим персонажем, який
рухається по сюжету та виконує зумовлені сценарієм завдання, покладаючись на
свою уважність та логіку, здійснює пошуки підказок і вирішує загадки.
Всередині
жанру
виділяються
основні
піджанри:
інтерактивна
література, інтерактивні фільми та візуальні романи. Часто за аналогією до
пригодницьких фільмів пригодницькими називаються ті відеоігри, сюжет яких
динамічно розгортається, насичений яскравими подіями, швидкою зміною
9
обстановки, а персонажі проявляють кмітливість та сміливість. Приклади: серія
про Індіану Джонса, Disney's Aladdin in Nasira's Revenge, Syberia.
Інші різновиди

Настільна гра — електронні реалізації настільних ігор. Серед них існують як
реалізації класичних ігор (шахи, преферанс), так і специфічних як Magic: The
Gathering.

Головоломки — вимагають від гравця вирішення логічних завдань,
передбачення можливих ситуацій. Приклади: Тетріс, Angry Birds.

Games with a Purpose — програми, за допомогою яких люди використовують
свої знання для вирішення проблем (передусім у наукових дослідженнях),
при цьому граючись. Такі ігри є різновидом людино-орієнтованого методу
комп'ютерного моделювання. Приклади: Дарвін, C Robots
10
1.1 Загальні відомості про гру «Тетріс»
Тетріс — відеогра-головоломка, розроблена Олексієм Пажитновим та його
колегами.
Олексій Леонідович Пажитнов (нар. 14 березня 1956 р.) — російський
розробник відео-ігор, комп'ютерний інженер. Пажитнов розробив популярну гру
Tetris, працюючи в Обчислювальному Центрі Академії наук СРСР. Він почав
отримувати гонорари від свого творіння тільки в 1996 році, коли він і Хенк
Роджерс створили Компанію Tetris.
Перша версія гри була представлена 6 червня 1984 року, коли він працював в
ОЦ Академії наук СРСР в Москві. Назву гри автор створив поєднавши грецький
префікс «тетра-» зі словом «теніс» — улюбленою грою Пажитнова.
Ця гра, чи один з її варіантів, існує майже для кожної ігрової консолі та
операційної системи, а також для інших електронних пристроїв: мобільних
телефонів, портативних медіаплеєрів, кишенькових комп'ютерів тощо.
Історія
Інтерес до фігур доміно, триміно, тетраміно і пентаміно в СРСР виник завдяки
книзі С. В. Голомба «Поліміно» (видавництво «Мир», 1975). Зокрема, пентаміно
було настільки популярне, що в «Науці і житті» починаючи з 1960-х років був
постійний розділ, присвячений складанню фігурок з набору пентаміно, а
пластмасові набори пентаміно іноді продавалися в магазинах.
«Тетріс» був вперше написаний Олексієм Пажитновим у червні 1984 на
комп'ютері Електроніка-60. В червні 1984 року співробітник Обчислювального
центру Академії наук СРСР Олексій Пажитнов, який займався проблемами
штучного інтелекту і розпізнавання мови, вирішив написати гру-головоломку
для міні-комп'ютера. Передбачалося, що нова гра стане вдосконаленою
варіацією його улюбленої класичної гри Pentomino Puzzle.
7 «цеглинок-тетраміно» тетрісу: I, J, L, O, S, T, Z.
11
У першому варіанті гри, написаної Пажитновим, можна змінювати положення
фігур шляхом повороту їх на 90 градусів щодо їх геометричного центру. Однак
на той час потужність комп'ютерів не дозволяла запустити таку програму. Тоді
розробник вирішив спростити завдання, забравши у кожної з фігур пентаміно по
одному квадратику, зменшивши їх кількість до чотирьох — тетраміно. Так
з'явилася перша версія тетрісу для мікрокомп'ютера Електроніка-60.
Пізніше Вадим Герасимов переписав цю гру для IBM PC. Після чого ця гра
набула великої популярності.
Після появи тетрісу кілька найбільших на той час компаній з розробки
системного забезпечення, комп'ютерних та ігрових застосунків — Spectrum
Holobyte і Mirrorsoft, Bullet-Proof Software і Atari Games, Famicom і його
американський аналог Nintendo Entertainment System — почали тривалу
боротьбу за придбання прав на випуск всіх варіацій і консольних версій тетрісу.
У 1988 році за підтримки Хенке Роджерса Електроніка-60Пажитнов організував
компанію з розробки ігрового програмного забезпечення AnimaTek, а1991 року
було створено компанію Tetris.
12
Концепція гри та Розробка інтерфейсу
Правила гри
Випадкові фігурки тетраміно падають зверху в прямокутний стакан
шириною 10 і висотою 20 клітин. У польоті гравець може повертати фігурку та
рухати її по горизонталі. Також можна «скидати» фігурку, тобто прискорювати
її падіння, коли вже вирішено, куди фігурка повинна впасти. Фігурка летить,
поки не наткнеться на іншу фігурку або на дно склянки. Якщо при цьому
заповнився горизонтальний ряд з 10 кліток, він пропадає і все, що вище нього,
опускається на одну клітку. У спеціальному полі гравець бачить фігурку, яка
буде слідувати після поточної — ця підказка дозволяє планувати свої дії. Темп
гри поступово збільшується. Назва гри походить від кількості клітин, з яких
складається кожна фігура. Гра закінчується, коли нова фігурка не може
поміститися в стакан. Гравець отримує бали за кожну фігурку, тому його задача
— заповнювати ряди, не заповнюючи саму склянку якомога довше, щоб таким
чином отримати якомога більше балів.
Нарахування балів
Нарахування балів в різних версіях «Тетрісу» достатньо різноманітне. Бали
можуть нараховуватися за прибрані лінії, за скинуті фігурки, за перехід на нову
швидкість тощо.
При нарахуванні балів за лінії кількість балів зазвичай залежить від того,
скільки ліній прибрано за один раз. Наприклад, в китайських «Тетрісах»,
популярних в СНД в 1990-х роках, нарахування балів зазвичай було таким: 1
лінія — 100 балів, 2 лінії — 300 балів, 3 лінії — 700 балів, 4 лінії (тобто,
зробити Тетріс) — 1500 балів. Тобто, чим більше ліній прибирається за один
раз, тим більше відношення кількості балів до кількості ліній. Цікаво, що
тетрісом в багатьох версіях гри також називається дія, після якого зникає
одразу 4 лінії. Це можна зробити лише одним способом — скинути «палицю»
(фігурку, в якій всі клітини розташовані на одній лінії) в «шахту» ширини 1 і
глибини як мінімум 4.
13
При нарахуванні балів за скинуті фігурки можуть враховуватися висота, на
якій зупинилася фігурка (наприклад, чим нижче, тим найкраще), відстань, яку
пролетіла фігурка після «скидання» (прискорення падіння). Хоча зазвичай
пріоритетом є лінії, а за фігурки нараховується відносно небагато балів.
3
В цілому концепція гри заснована на ідеї відповідності. Гравцю даються
блоки випадкових форм, що падають з верхньої частини екрану, і у гравця є
можливість обертати їх і рівно розміщувати їх у нижній частині екрана.
Інтерфейс.
Інтерфейс гри представляє собою форму поділену на ліву і праву частину.
Рис.
Блок-схема та опис алгоритму програми
Початок
14
Рухаємо фігуру
Створюємо
фігуру
Є
Дотик?
да
ні
Злиття з полем
Створилась?
Натиснуті
стрілки??
Створює
мо фігуру
так
ні
Рухаємо в бік
Коллапсим
15
Не
створилась?
16
Мова програмування і середовище розробки програми
Комп'ютера гра «Тетрис», яка є об'єктом дослідження курсової роботи,
написана на мові програмування С++ в середовищі розробки програмного
забезпечення «С++ Builder»
++ (Сі-плюс-плюс) — мова програмування високого рівня з підтримкою
декількох
орієнтованої,
парадигм
узагальненої
та
програмування:об'єктнопроцедурної.
Розроблена
Б'ярном
Страуструпом (англ. Bjarne Stroustrup) в AT&T Bell Laboratories (МюррейХілл, Нью-Джерсі) у 1979 році та початково отримала назву «Сі з класами».
Згодом Страуструп перейменував мову у C++ у 1983 р. Базується на мові С.
При створенні С++ прагнули зберегти сумісність з мовою С. Більшість програм
на С справно працюватимуть і з компілятором С++. С++ має синтаксис,
заснований на синтаксисі С (див. список операторів мов С та С++).
Нововведеннями С++ порівняно з С є:

підтримка об'єктно-орієнтованого програмування через класи;

підтримка узагальненого програмування через шаблони;

доповнення до стандартної бібліотеки;

додаткові типи даних;

обробка винятків;

простори імен;

вбудовані функції;

перевантаження операторів;

перевантаження імен функцій;

посилання і оператори управління вільно розподіленою пам'яттю.
17
Переваги мови C++[ред. • ред. код]

Швидкодія. Швидкість роботи програм на С++ практично не поступається
програмам на С, хоча програмісти отримали в свої руки нові можливості і нові
засоби.

Масштабованість.
На
мові
C++
розробляють
програми
для
найрізноманітніших платформ і систем.

Можливість роботи на низькому рівні з пам'яттю, адресами, портами. (Що,
при необережному використанні, може легко перетворитися на недолік.)

Можливість створення узагальнених алгоритмів для різних типів даних, їхня
спеціалізація, і обчислення на етапі компіляції, з використанням шаблонів.

Підтримуються різні стилі та технології програмування, включаючи
традиційне директивне програмування, ООП, узагальнене програмування,
метапрограмування (шаблони, макроси).
Недоліки мови C++

Наявність безлічі можливостей, що порушують принципи типобезпеки
приводить до того, що в С++ програми може легко закрастися важковловима
помилка. Замість контролю з боку компілятора розробники вимушені
дотримуватися вельми нетривіальних правил кодування. По суті, ці правила
обмежують С++ рамками якоїсь безпечнішої підмови. Більшість проблем
типобезпеки С++ успадкована від С, але важливу роль в цьому питанні грає і
відмова автора мови від ідеї використовувати автоматичне управління
пам'яттю (наприклад, збірку сміття). Так візитною карткою С++ стали
вразливості типу «переповнювання буфера».

Погана підтримка модульності. Підключення інтерфейсу зовнішнього
модуля через препроцесорну вставку заголовного файлу (#include) серйозно
уповільнює компіляцію, при підключенні великої кількості модулів. Для
усунення цього недоліку, багато компіляторів реалізують механізм
прекомпіляциі заголовних файлів (англ. Precompiled Headers).
18

Недостача інформації про типи даних під час компіляції (CTTI).

Мова C++ є складною для вивчення і для компіляції.

Деякі перетворення типів неінтуїтивні. Зокрема, операція над беззнаковим
і знаковим числами видає беззнаковий результат.

Препроцесор С++ (успадкований від C) дуже примітивний. Це приводить
з одного боку до того, що з його допомогою не можна (або важко)
здійснювати деякі завдання метапрограмування, а з іншою, в наслідку своєї
примітивності, він часто приводить до помилок і вимагає багато дій з обходу
потенційних
проблем.
Деякі
мови
програмування
(наприклад, Scheme і Nemerle) мають набагато могутніші і безпечніші
системи метапрограмування (також званімакросами, але макроси С/С++ вони
мало нагадують).

З
кінця
1990-х
в
співтоваристві
С++
набуло
поширення
так
зване метапрограмування на базі шаблонів. По суті, воно використовує
особливості шаблонів C++ в цілях реалізації на їхній базі інтерпретатора
примітивної функціональної мови програмування, що виконується під час
компіляції. Сама по собі ця можливість вельми приваблива, але, внаслідкок
вище згаданого, такий код вельми важко сприймати і зневаджувати.
Мови Lisp/Scheme, Nemerle і деякі інші мають могутніші і водночас простіші
для сприйняття підсистеми метапрограмування. Крім того, в мові
D реалізована порівнянна за потужністю, але значно простіша в застосуванні
підсистема шаблонного метапрограмування.
Масив - іменований набір однотипних змінних, розташованих у пам'яті
безпосередньо один за одним, доступ до яких здійснюється за індексом.
Індекс масиву - ціле число, або значення типу, що приводиться до цілого, яке
вказує на конкретний елемент масиву.
Одновимірний масив - масив містить один індекс.
Двовимірний масив - прямокутний масив містить два індекси.
19
В комп'ютерній грі «Тетріс» матричні форми ігрових фігур реалізовані за
допомогою одномірного масиву який містить у собі фігури. В програмному коді
він має такий вигляд:
int FiguraData[7][16]=
{
0,0,0,0,
1,1,1,0,
1,0,0,0,
0,0,0,0,
0,0,0,0,
0,1,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0,
0,1,1,0,
1,1,0,0,
0,0,0,0,
0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0,
0,0,0,0,
0,1,0,0,
1,1,1,0,
0,0,0,0,
20
0,0,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
};
Функція в програмуванні - фрагмент програмного коду (підпрограма), до
якого можна звернутися з іншого місця програми. У більшості випадків з
функцією пов'язується ідентифікатор, але багато мов допускають і безіменні
функції. З ім'ям функції нерозривно пов'язаний адресу першої інструкції
(оператора), що входить у функцію, якої передається управління при зверненні
до функції. Після виконання функції управління повертається назад в адресу
повернення - точку програми, де дана функція була викликана.
Функція може приймати параметри і повинна повертати деяке значення,
можливо пусте. Функції, які повертають порожнє значення, часто називають
процедурами. У деяких мовах програмування оголошення функцій і процедур
мають різний синтаксис, зокрема, можуть використовуватися різні ключові
слова.
Іноді необхідно повторювати одне і те ж дію кілька разів поспіль. Для цього
використовують цикли.
Цикл for
Якщо ми знаємо точну кількість дій (ітерацій) циклу, то можемо
використовувати цикл for.
Алгоритм роботи циклу for зображений на рисунку 4.1
21
Рис.4.1
Ітерацією циклу називається один прохід цього циклу
Лічильник циклу - це змінна, в якій зберігається кількість проходів даного
циклу.
Під час програмування мною «Тетрісу» я дуже часто використовував даний
цикл.
Опис синтаксису
Спочатку присвоюється первинне значення лічильнику, після чого ставиться
крапка з комою.
Потім задається кінцеве кінцеве значення лічильника циклу. Після того, як
значення лічильника досягне вказаної межі, цикл завершиться. Знову ставимо
крапку з комою.
Задаємо крок циклу. Крок циклу - це значення, на яке буде збільшуватися або
зменшуватися лічильник циклу при кожному проході.
Реалізація повороту фігури в грі «Тетріс» з використанням циклу for
void __fastcall TForm1::RotateFigura(int Tip)
22
{
//поворот фігури
int PosX = 3;
int PosY = 0;
int Temp[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for(int j = 0; j < 4; j++, PosX--, PosY = 0)
for(int i = 0; i < 4; i++, PosY++)
{
Temp[PosY*4 + PosX] = FiguraData[Tip][j*4+i];
}
for(int i = 0; i < 16; i++)
FiguraData[Tip][i] = Temp[i];
}
Цикл while
Коли ми не знаємо, скільки ітерацій повинен призвести цикл, нам знадобиться
цикл while або do while
23
while
Цикл do while, поки дуже схожий на цикл while. Єдина їх відмінність в тому,
що при виконанні циклу do while, один прохід циклу буде виконаний незалежно
від умови.
24
Середовище розробки
C++ Builder — програмний продукт, інструмент швидкої
розробки додатків (RAD), інтегроване середовище розробки (IDE), система, яка
використовується програмістами для розробки програмного забезпечення на
мові програмування C++.
Рис. Вигляд C++ Builder (1- Інспектор об'єктів 2 - Менеджер проектів 3- Панелі інструментів
4 – Палітра компонентів)
C++ Builder об'єднує в собі комплекс об'єктних
бібліотек (STL, VCL, CLX, MFC та ін.), компілятор, зневаджувач, редактор
коду та багато інших компонентів. Цикл розробки аналогічний Delphi.
Більшість компонентів, розроблених в Delphi, можна використовувати і в C++
Builder без модифікації, але зворотнє твердження не вірне.
C++ Builder містить інструменти, які за допомогою drag-and-drop дійсно
роблять розробку візуальною, спрощує програмування завдяки
вбудованомуWYSIWYG-редактору інтерфейсу та ін.
Історія
25
C++Builder спочатку створювався тільки для платформи Microsoft Windows.
Пізні версії, які містили крос-платформову компонентну бібліотеку Borland,
підтримують і Windows, і Linux.
В 2003 році Borland випустила C++BuilderX (CBX), написаний за допомогою
тієї ж інфраструктури, що і JBuilder, який при цьому був мало схожим на C++
Builder або Delphi. Цей продукт призначався для розробки великих програм для
великих компаній, але комерційного успіху не мав. В кінці 2004 року Borland
оголосила, що продовжить розвиток класичного C++ Builder і об'єднає його з
середовищем розробки Delphi, припинивши, таким чином, розробку C++
BuilderX. Приблизно через рік після цього оголошення, Borland
випустила Borland Developer Studio 2006, який включав у себе Borland
C++Builder 2006, що пропонував покращене керування конфігурацією та
зневадженням. Borland Developer Studio 2006 — єдиний повноцінний комплект,
який містив Delphi, C++ Builder та C# Builder.
В 2007 році CodeGear випустила C++Builder 2007, в якому реалізувала повну
підтримку API Microsoft Windows Vista, збільшила повноту відповідності
стандарту ANSI C++, збільшила швидкість компіляції і збірки до 500 %,
включила підтримку MSBuild, архітектур баз даних DBX4 і «VCL для Web», які
підтримують AJAX. Підтримка API Microsoft Windows Vista включила в себе
додатки, з самого початку оформлені в стилі Vista, і природну підтримку VCL
для Aero та Vista Desktop. CodeGear RAD Studio 2007 містить C++Builder
2007 і Delphi. Також в 2007 році CodeGear «воскресила» марку «Turbo» і
випустила дві «Turbo» версії C++ Builder: Turbo C++ Professional і Turbo C++
Explorer (безкоштовний), які базуються на Borland C++ Builder 2006.
В кінці 2008 року компанія CodeGear випустила нову версію RAD Studio, в
яку увійшли Delphi 2009 і C++ Builder 2009. В 2009 році у складі RAD Studio
вийшов C++Builder 2010.
Раніше повідомлялося, що наступна версія, CodeGear C++ Builder (кодове
ім'я «Commodore»), буде мати підтримку x86-64 і можливість створювати
26
машинний x86-64 код. Однак в 2010 році у складі RAD Studio XE включена
версія C++ Builder XE без цієї функціональності.
В 2012 році Embarcadero випустила C++ Builder XE3, сумісний з Windows 8.
В 2013 році був випущений C++ Builder XE4.
Дана програма була розроблена в C++ Builder 6.
Рис. Вигляд форми під час розробки інтерфейсу гри Тетріс
Label
Standard
Мітка.
Використовується,
в основному, для
підпису інших
компонентів.
Наприклад, для
назви введеної
величини в Edit.
27
Button
Standard
Використовується
для створення
(командна
кнопок, якими
кнопка)
користувач
виконує команди
у додатку.
Timer
Win32
(таймер)
Використовується
для запуску
процедур, функцій
і подій в зазначені
інтервали часу.
Таблиця
28
Діаграма Ганта
Діаграма Ганта
Подання виконаної роботи на кафедру.
Оформлення загальної структури курсової роботи.
Опис середовища розробки та особливостей…
Виконання практичної частини.…
Підготовка до виконання практичної частини…
Виконання першого пункту плану.Опис загальних…
Підготовка до виконання теоретичної…
Узгодження плану курсової роботи відповідно до…
8/4/2015 8/24/2015 9/13/2015 10/3/201510/23/201511/12/201512/2/2015
Дата початку
29
Тривалість
Програмний код
#include <vcl.h> //бібліотека візуальних компонентів
#pragma hdrstop //директива яка прискорює компіляцію
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int PoleW,PoleH;
Graphics::TBitmap*Buffer; // TBitmap Метод представлення зображення у формі
прямокутної матриці
Graphics::TBitmap*Block;
TPoint BlockPos;
int BlockType;
int NextBlock;
int Pole[10][18];
int Score;
//Тут тут матрицями прописані форми фігур 1 - точка є, 0 - точки немає.
int FiguraData[7][16]= //масив 7 різних фігур, їхня матриця 4 * 4 = 16
{
0,0,0,0,
1,1,1,0,
1,0,0,0,
0,0,0,0,
0,0,0,0,
0,1,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0,
0,1,1,0,
1,1,0,0,
0,0,0,0,
0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0,
0,0,0,0,
30
0,1,0,0,
1,1,1,0,
0,0,0,0,
0,0,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0,
0,1,1,0,
0,1,1,0,
//масив який містить у собі фігури
0,0,0,0,
};
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//підготовка гри
Score=0;
randomize();
//Розміри поля
PoleW=300;PoleH=540;
//обнуляємо поле
//візуальний вигляд грального поля
for(int j=0;j<18;j++)
for(int i=0;i<10;i++)
Pole[i][j]=0;
//Який блок випаде? Випадковий
NextBlock=random(7);
}
//--------------------------------------------------------------------------//Обнуляємо поле по натисканню на кнопку
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Buffer=new Graphics::TBitmap();
Buffer->Width =PoleW;
// межі грального поля відповідають візуальному
вугляду грального поля
Buffer->Height=PoleH;
Block=new Graphics::TBitmap();
Block->Width=30;Block->Height=30;
Block->LoadFromFile("Block.bmp");
CreateFigura();
Timer1->Enabled=true;
}
31
//---------------------------------------------------------------------------
void TForm1::CopyToScreen()
{
Canvas->Draw(0,0,Buffer); //відображає гральний процес на екрані
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//встановлення Таймера
//очищення екрану
ClrScr();
//малюєм картинки на полі
DrawPole();
//малюємо падаючу фігуру
DrawFigura(BlockPos.x,BlockPos.y,BlockType);
CopyToScreen();
int Tx=BlockPos.x,Ty=BlockPos.y;
Ty++;
//Якщо падаюча фігура доторкнулась до інших то...
if(HitTest(Tx,Ty,BlockType))
{
//Виконуємо злиття фігури зі всіма іншими
AddFiguraToPole(BlockPos.x,BlockPos.y,BlockType);
//Створюємо нову фігуру якщо ще є місце
if(!CreateFigura())
{
Timer1->Enabled=false;
ShowMessage("Гра закінчена"); //якщо таймер зупиняється виводиться
повідомлення "гра закінчена"
}
}
else
{
BlockPos=Point(Tx,Ty);
}
TestCompliteLine();
}
//--------------------------------------------------------------------------void __fastcall TForm1::DrawFigura(int x,int y,int tip)
{
for(int j=0;j<4;j++)
32
for(int i=0;i<4;i++)
{
if(FiguraData[tip][j*4+i]!=0)Buffer->Canvas>Draw(x*30+i*30,y*30+j*30,Block);
}
}
void __fastcall TForm1::RotateFigura(int Tip)
{
//поворот фігури
int PosX=3;
int PosY=0;
int Temp[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for(int j=0;j<4;j++,PosX--,PosY=0)
for(int i=0;i<4;i++,PosY++)
{
Temp[PosY*4+PosX]=FiguraData[Tip][j*4+i];
}
for(int i=0;i<16;i++)
FiguraData[Tip][i]=Temp[i];
}
void __fastcall TForm1::ClrScr()
{
//отчистка поля
Buffer->Canvas->FillRect(Rect(0,0,PoleW,PoleH));
}
//Перевірка, чи дотикається падаюча фігура до інших фігур, якщо так - true
інакше false
int __fastcall TForm1::HitTest(int X, int Y, int Tip)
{
for(int j=0;j<4;j++)
for(int i=0;i<4;i++)
{
if((FiguraData[Tip][j*4+i]!=0)&&(Pole[X+i][Y+j]!=0))
return 1;
if(FiguraData[Tip][j*4+i]!=0)
if((Y+j)>=18)
return 2;
}
return 0;
33
}
void __fastcall TForm1::DrawPole()
{
for(int j=0;j<18;j++)
for(int i=0;i<10;i++)
if(Pole[i][j]!=0)Buffer->Canvas->Draw(30*i,30*j,Block);
Canvas->FillRect(Rect(320,20,320+(4*30),20+(4*30)));
for(int j=0;j<4;j++)
for(int i=0;i<4;i++)
{
if(FiguraData[NextBlock][j*4+i]!=0)Canvas->Draw(320+i*30,20+j*30,Block);
}
}
void __fastcall TForm1::AddFiguraToPole(int X, int Y, int Tip)
{
//створення нової фігури
for(int j=0;j<4;j++)
for(int i=0;i<4;i++)
if(FiguraData[Tip][j*4+i]!=0)
Pole[X+i][Y+j]=FiguraData[Tip][j*4+i];
}
bool __fastcall TForm1::CreateFigura()
{
BlockPos=Point(3,0);
BlockType=NextBlock;
NextBlock=random(7);
if(HitTest(BlockPos.x,BlockPos.y,BlockType)==1)return false;
else
return true;
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_DOWN)Timer1->Interval=50; //клавіша вниз = опускання фігури до
нижньої границі поля з інтервалом 50
if(Key==VK_UP)TurnFiguraNaPole(BlockPos.x,BlockPos.y,BlockType);
//Клавіша вверх-фігура обертається навколо своєї осі
if((Key==VK_RIGHT)||Key==VK_LEFT)MoveFigura(Key);//рух фігури в праву та
ліву сторони відносно осі х
ClrScr();
34
DrawPole();
DrawFigura(BlockPos.x,BlockPos.y,BlockType);
CopyToScreen();
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_DOWN)Timer1->Interval=500;
}
//---------------------------------------------------------------------------
TForm1::TurnFiguraNaPole(int X, int Y, int Tip)
{
RotateFigura(Tip);
int LeftLimit=0,RightLimit=0;
int err=0;
for(int i=0;i<4;i++,err=0)
{
for(int j=0;j<4;j++)
{
if(FiguraData[BlockType][j*4+i]!=0)err=1;
}
if(err!=1)LeftLimit++;else break;
}
err=0;
for(int i=3;i>=0;i--,err=0)
{
for(int j=0;j<4;j++)
{
if(FiguraData[BlockType][j*4+i]!=0)err=1;
}
if(err!=1)RightLimit++;else break;
}
if(!HitTest(X,Y,Tip))
{
if((BlockPos.x-RightLimit+4)>9)BlockPos.x-=(BlockPos.x-RightLimit+4)-10;
if((BlockPos.x+LeftLimit)<0)BlockPos.x+=0-(BlockPos.x+LeftLimit);
}
35
if(HitTest(X,Y,Tip))
{
RotateFigura(Tip);
RotateFigura(Tip);
RotateFigura(Tip);
}
}
void __fastcall TForm1::MoveFigura(int Key)
{
int LeftLimit=0,RightLimit=0; //праве поле і ліве поле
int err=0;
for(int i=0;i<4;i++,err=0)
{
for(int j=0;j<4;j++)
{
if(FiguraData[BlockType][j*4+i]!=0)err=1;
}
if(err!=1)LeftLimit++;else break;
}
err=0;
for(int i=3;i>=0;i--,err=0)
{
for(int j=0;j<4;j++)
{
if(FiguraData[BlockType][j*4+i]!=0)err=1;
}
if(err!=1)RightLimit++;else break;
}
if(Key==VK_LEFT)
{
int x=BlockPos.x;
x--;
if(x+LeftLimit>=0)
if(!HitTest(x,BlockPos.y,BlockType))BlockPos.x=x;
}
if(Key==VK_RIGHT)
{
int x=BlockPos.x;
x++;
if(x-RightLimit<7)
if(!HitTest(x,BlockPos.y,BlockType))BlockPos.x=x;
}
}
36
TForm1::TestCompliteLine()
{
TList*ComplitedLine=new TList();
bool err=false;
for(int j=17;j>=0;j--,err=false)
{
for(int i=0;i<10;i++)
if(Pole[i][j]==0)err=true;
if(err==false)ComplitedLine->Add((void*)j);
}
for(int i=0;i<ComplitedLine->Count;i++)
{
CollapseDown((int)ComplitedLine->Items[i]);
}
Score+=ComplitedLine->Count*ComplitedLine->Count;
Label1->Caption="Набрано очок:"+IntToStr(Score);
delete ComplitedLine;
}
void __fastcall TForm1::CollapseDown(int row)
{
for(int i=0;i<10;i++)
Pole[i][row]=0;
for(int i=0;i<10;i++)
for(int j=row-1;j>=0;j--)
if(j>0)Pole[i][j+1]=Pole[i][j];
else Pole[i][j+1]=0;
}
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Score=0;
randomize();
PoleW=300;PoleH=540;
for(int j=0;j<18;j++)
for(int i=0;i<10;i++)
Pole[i][j]=0;
NextBlock=random(7);
CreateFigura();
}
//--------------------------------------------------------------------------37
38
Висновки та пропозиції
39
Література
1. https://code-live.ru/post/cpp-loops/ Циклы в C++
2. https://code-live.ru/post/cpp-functions/ Функции в C++
3. http://cppstudio.com/post/396/ Функции в С++
4. http://programming.in.ua/programming/c-plus-plus/290-two-dimension-arraysand-rand-function-c-plus-plus.html/ Базовий курс програмування на С++.
Двовимірний масив
5. http://cpp.dp.ua/le_6.html Основи програмування на С++.Використання масивів
6. Бьєрн Страуструп. Мова програмування С++.
7. Алексей Архангельский Програмування в C ++ Builder
8. В.А. Скляров. Язык C++ и объектно-ориентированное программирование
40
Додатки
Додаток А
41
Додаток Б
42
Додаток В
Додаток Г
43
Додаток Д
44
Додаток Е
Додаток Є
45
Додаток Ж
46
Додаток З
47
Додаток І
48
49
Автор
geletucha
Документ
Категория
Школьные материалы
Просмотров
118
Размер файла
238 Кб
Теги
kursova
1/--страниц
Пожаловаться на содержимое документа