├── 2020 ├── assignment_1.md ├── assignment_2_1.md ├── assignment_2_2.md ├── assignment_3.md ├── assignment_4.md ├── exam_topics.md └── overview.md ├── 2021 ├── assignment_1.md ├── assignment_2.md ├── assignment_3.md ├── assignment_4.md └── overview.md ├── LICENSE ├── README.md └── res ├── Quoridor_1.jpg ├── grid_example.png ├── quoridor_rules_ru.pdf ├── quoridor_scheme.png ├── reversi-start.png └── track.png /2020/assignment_1.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №1 2 | ## Розробка клієнта для настольної гри Reversi 3 | 4 | ### Мета роботи: 5 | Розібратись із використанням паттерну MVC у ігрових проектах на прикладі відомої гри реверсі, підготувати проект для виконання другої роботи. 6 | 7 | ### Завдання: 8 | 9 | Реверсі - настільна гра для двох гравців з простими правилами і глибокою стратегією. Наступні дві роботи ми будемо займатися реалізацією комп'ютерної версії цієї гри та АІ до неї. Детальніше про історію гри та правила (ми будемо користуватися варіантом правил для варіації гри що називається Othello) можна почитати на [вікіпедії](https://en.wikipedia.org/wiki/Reversi). Спробувати сили та пограти можна багато де в [онлайні](https://cardgames.io/reversi/) 10 | 11 | В рамках завдання неохідно створити програму, що виконує наступні вимоги: 12 | - програма є клієнтом для гри у реверсі (за правилами Othello, саме ці правила використовуються в міжнародних змаганнях) 13 | - користувач може обрати: або ходити за обох опонентів, або грати проти комп'ютерного гравця який грає за примітивною стратегію - робить випадковий із можливих кроків 14 | - програма не дозволяє робити не коректні ходи 15 | - програма фіксує переможця 16 | 17 | На програмному рівні має бути виділено три компонента: 18 | - відображення - ui-код, що відноситься до рендеру клієнта. Вимог до реалізації немає, це може бути як стенделоун-додаток, так і команда строка з ASCII-артом або веб-сторінка. 19 | - введення - частина програми, що оброблює інпут та перенаправляє його в модель. Дуже важливо чітко виділати цей компонент, оскільки в другій роботі його доведеться замінити на ввід з командної строки. 20 | - модель - весь код, що відноситься до бізнес-логіки, тобто гри реверсі. Ця частина коду знадобиться в наступній роботі, де не буде необхідності в виводі результату на екран, і буде інший інпут 21 | 22 | ### Примітки 23 | 24 | Розділення програми на компоненти згідно паттерну MVC стає в нагоді в багатьох моментах, на прикладі двох робіт ми розглянемо часту ситуацію, коли всередині гри потрібно паралельно підтримувати дві системи вводу (від гравця та програмний від AI) та дві системи виводу (вивід у клієнт або лімітований вивід при грі з АІ). Реальний приклад такого розділення: match3-ігри, в яких нові рівні перед релізом тестуються штучним AI "гравцем", і складність рівня змінюється відповідно до успіхів бота. Очевидно, що якщо ми хочемо програти рівень ботом 100 разів, то ми не хочемо робити у повноцінному клієнті зі всіма ефектами та анімаціями, а хочемо лише отримати короткий звіт за результатами роботи. Виконуючи цю роботу, тримайте на увазі що код вашого реверсі має бути саме таким - незалежним від вводу\виводу 25 | 26 | ### Оцінювання: 27 | - реалізовано клієнт з повними правилами гри - *3 бали* 28 | - не має можливості робити неправильні ходи - *2 бали* 29 | - клієнт має повний game loop (можна почати гру, закінчити її та почати знову будь-яку кількість разів без перезапуску) - *2 бали* 30 | - є можливість грати з комп'ютером та за двох гравців - *2 бали* 31 | - якість реалізації MVC - *3 бали* 32 | 33 | ### Матеріали: 34 | - [Лекція із загальних правил проектування програм](https://www.youtube.com/watch?v=_YL5SCJr84E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 35 | - [Лекція з MVC](https://www.youtube.com/watch?v=6Avtm_qij2E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 36 | - [Репозиторій з прикладом з лекції](https://github.com/artem-korotenko/mvc-tic-tac-toe) 37 | - [Лекція з патернів ігрової розробки](https://www.youtube.com/watch?v=j-JtShcib4E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 38 | -------------------------------------------------------------------------------- /2020/assignment_2_1.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №2.1 2 | ## Розробка штучного інтелекту для варіації гри Reversi 3 | 4 | ### Мета роботи: 5 | Розібратися з алгоритмами штучного інтелекту, що використовуються для детермінованих ігор з повною інформацією. Реалізувати штучний інтелект для однієї з варіацій гри реверсі. 6 | 7 | ### Завдання: 8 | В минулій роботи було реалізовано клієнт для гри реверсі. Як ви пам'ятаєте, окремим пунктом в завданнях було вказано звернути увагу на розділення коду на модулі - модель, обробку введення та візуалізацію. В данній роботі нам знадобиться зроблена модель (input та view доведеться створити нові), оскільки ціль роботи - створення штучного інтелекту для гри. 9 | 10 | Практична робота №2 складається з двох частин: 11 | 1. Створити штучний інтелект, що буде перемагати опонента який ходить випадковими ходами у 90% (або більше) випадків. Виконання цього пункту дозволить отримати базову кількість балів. В цьому документі описана саме ця частина. 12 | 2. Створити бота, що буде здатен перемогти ботів інших команд. Змагання буде проходити в декілька турів, команди що будуть проходити в кожен наступний тур будуть отримувати додаткові бали. 13 | 14 | 15 | ### Деталі 16 | Перший важливий момент - гра в реверсі достатньо добре вивчена на предмет штучного інтелекту, тому, для того щоб зробити процес написання АІ більш цікавим та творчим, ми будемо грати не в реверсі, а в варіацію цієї гри - **антіреверсі з чорною дірою**. Антіреверсі означає що ціллю гравця наприкінці гри є отримання не більшої кількості фішок на полі, а меншої. Зверніть увагу - для того щоб перемогти у антіреверсі недостатньо просто погано грати у реверсі, ця гра має власну стратегію. Чорна діра означає що в кожній партії випадковим чином обирається одна клітинка на полі, на яку не можна ставити фішки. 17 | 18 | За умовами завдання не виставляється конкретна вимога який саме алгоритм реалізовувати для штучного інтелекту, проте я рекомендую почати з мінімаксу: реалізувати власне дерево мінімаксу, подумати про підрахунок SEV, далі додати альфа\бета відсікання для збільшення глибини прорахунку та ускладнювати бота лише ітеративно. Рекомендую братися за більш складні варіанти (наприклад, MCTS) тільки коли ви будете мати робочу версію з мінімаксом, яка проходить всі тести. 19 | 20 | Другий - Для того щоб мати змогу змагатися один з одним, боти мають реалізовувати певний спільний інтерфейс. Найпростішим варіантом такого інтерфейсу є командний рядок, оскільки створити подібну програму можна за допомогою всіх розповсюджених мов програмування та платформ. Отже, якщо попередня робота виконана вами коректно, то вам не буде складно підмінити введення з графічного (з клієнту) на введення з командної строки, а виведення ходу - на вивід в командний рядок. 21 | 22 | Вимоги до програми: 23 | 1. Програма має запускатися через командний рядок та зчитувати ввід з system.in 24 | 2. На початку виконання программа отримає на ввід строку з координатами чорної діри (наприклад, `А3`) 25 | 3. Другою командою прийде строка з вказанням кольору, яким пропонується грати (у форматі `white` або `black`). Чорні ходять першими, тому якщо чорними грає ваш бот, одразу після другої команди будуть на очікуватися координати ходу. Якщо білими - третьою командою прийде хід чорних 26 | 4. Далі програма має видавати наступний хід після кожного введенего ходу противника або ключове слово pass у разі відсутності ходів 27 | 28 | Программа буде тестуватися за допомогою спеціального клієнта, який буде її запускати та виступати в ролі противника, що ходить випадковими ходами. Вихідний код тестувальника буде викладено незабаром. Для того щоб тест був пройдений успішно, команда отримала базові бали та була допущена до змагання (робота 2.2), необхідно щоб виконувалися наступні умови: 29 | 1. При запускові 100 раундів ігор проти бота, бот перемагає у 90 або більше. 30 | 2. Бот працює без помилок: будь-яка помилка у рантаймі програми буде призводити до зарахування технічної поразки в раунді. 31 | 3. Бот працює у рамках виділених ресурсів: кожен хід вкладається у 2 секунди, бот використовує не більше 1Гб оперативної пам'яті. Вихід за рамки цих вимог також призводить до технічної поразки. Обмеження у 2 секунди буде вимірюватися на тестовому пристрої з CPU i7-8700. 32 | 4. Технічна поразка також зараховується у випадку якщо програма видає неможливий на даний момент хід. 33 | 34 | Розглянемо приклад командної строки при роботі з ботом (`->` - ввід, `<-` - вивід з програми): 35 | 36 | ``` 37 | -> B3 //перша команда - координати чорної діри 38 | -> black //друга - колір 39 | <- C5 //бот грає чорними, тому виводить свій хід 40 | -> C4 //на вхід подається наступний хід опонента 41 | ``` 42 | і так далі 43 | 44 | Схема розмітки поля та стартова позиція: 45 | 46 | ![reversi field](https://github.com/introduction-to-gamedev/assignments/blob/master/res/reversi-start.png "Стартова позиція") 47 | 48 | Перед здачею роботи необхідно зібрати консольний додаток під win64 додати у релізи на вашому гітхаб-репозиторії 49 | 50 | ### Оцінювання: 51 | - бот перемагає у 90 іграх зі 100 - *4 бали* 52 | - бот перемагає у 100 іграх зі 100 - *1 бал* 53 | - бот не отримує жодної технічної поразки - *1 бал* 54 | - якість написання коду - *2 бали* 55 | 56 | ### Матеріали: 57 | - [Лекція із штучного інтелекту (minimax, MCST)](https://www.youtube.com/watch?v=zlEI6ii28_A&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=5) 58 | - [Стаття з мінімаксу на вікіпедії](https://en.wikipedia.org/wiki/Minimax) 59 | - [Альфа\бета відсікання](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) 60 | 61 | ### Література 62 | Посилання йдуть амазон, але всі матеріали можна знайти в мережі 63 | - [AI for games (chapter 9)](https://www.amazon.com/AI-Games-Third-Ian-Millington/dp/1138483974) 64 | -------------------------------------------------------------------------------- /2020/assignment_2_2.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №2.2 2 | ## Змагання зі штучного інтелекту для Антиреверсі 3 | 4 | ### Мета роботи: 5 | Зануритись трохи більше в тему штучного інтелекту для дискретних ігор та визначити всередині потоку яка команда - чемпіон 6 | 7 | ### Деталі 8 | Всі створені в роботі 2.1 боти для гри в антіреверсі працюють через спільний інтерфейс командної строки, а це означає що вони можуть грати не тільки з тестером, що робить випадкові ходи, а і один із одним. В межах цієї роботи ми проведемо чемпіонат в декілька турів, який дозволить обрати найкращого бота. Команди-призери отримують бонус до рейтингу та викарбують свої імена в історії. 9 | 10 | ### Як все буде проходити? 11 | Змагання буде складатися з декількох турів, в кожному турі допущені боти бути грати чемпіонат по системі "кожен з кожним". Кожна дуель між двома ботами буде складатися з серії матчів, поки один з ботів не набере 5 очок (перемога - 1 очко, нічия - по 0.5 кожній стороні, поразка - 0). За підсумками всіх ігор буде складено турнірна таблиця, де перші 8 команд отримують залікові очки за раунд. 12 | 13 | Логи всіх ігор раунду будуть викладені у відкритий доступ для аналізу, перед кожним наступним раундом команди матимуть змогу зробити апдейт власного клієнту. 14 | 15 | Розклад змагання: 16 | 17 | |Дата|Номер раунду|Залікові очки| 18 | |:----------:|:--:|-------------| 19 | |1 листопада |0|не нараховуються*| 20 | |15 листопада|1|12-10-8-6-5-4-3-2-1| 21 | |29 листопада|2|х2 до очок першого раунду| 22 | |13 грудня|3|х3 до очок першого раунду| 23 | 24 | *- До нульового раунду будуть допущені всі команди, що встигли вкластися в soft deadline. Турнірна таблиця буде складена, але очки не нараховуються - в цьому раунді команди зможуть оцінити крутість свого бота порівняно інших. Команди, що не вкладуться в софт-дедлайн такої можливості не матимуть. 25 | 26 | Зверніть увагу, вартість і цінність кожного наступного раунду росте через запас часу для вдосконалення ботів. 27 | 28 | ### І як написати найкращого бота? 29 | В межах заданих лімітів по оперативній пам'яті та часу обмежень по алгоритмам немає. Цілком можливо, що для перемоги буде достатньо продумати гарну SEV та прокачати мінімакс до його просунутих варіацій (наприклад, Negascoutу). Можна спробувати замахнутись на Monte-Carlo Search Tree чи ML, або пошукати щось більш екзотичне. 30 | 31 | ### Які призи? 32 | - 1 місце: +7 балів до рейтингу та спеціальний приз ;) 33 | - 2 місце: +5 балів до рейтингу 34 | - 3 місце: +3 бали до рейтингу 35 | - 4 місце: +2 бали 36 | - 5 місце: +1 бал 37 | 38 | ### Технічні деталі 39 | Формат сабміту клієнта для раунду: готовий для запуску файл\скрипт, що працює під **win64** та readme з інструкцією для командної строки для запуску. Для змагання ліміт часу для виконання ходу збільшено до **5** секунд 40 | -------------------------------------------------------------------------------- /2020/assignment_3.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №3 2 | ## Створення мережевої клієнт-серверної гри 3 | 4 | ### Ціль роботи 5 | Розібратися із принципами побудови онлайн-ігор на великих картах або кімнатах. 6 | 7 | Для виконання пропонується обрати один з двох варіантів: 8 | 9 | #### Варіант А. .io-like massive multiplayer 10 | 11 | ### Завдання 12 | Гра, що пропонується до реалізації - спрощена версія agar.io. 13 | 1. Клієнт, під'єднавшись до сервера, потрапляє у кімнату великого розміру (без перешкод) разом із іншими гравцями. 14 | 2. Гра відбувається у двомірній площині, кожен гравець відображається колом певного кольору. 15 | 3. Гравець може пересуватися по площині в будь-якому напрямку 16 | 4. По карті випадковим чином розкидані крапки-"їжа", підібравши яку гравець збільшується у розмірі 17 | 5. При зіткненні двох гравців виживає більший, який збільшується в розмірі пропорційно до розміру другого гравця 18 | 6. Гра складається з раундів, що йдуть безперервно один за одним, в кінці раунду на екран виводиться топ гравців за ромзіром, після чого всі активні гравці скидаються до найменшого розміру 19 | 7. В оригінільному agar.io важливою складовою механіки є "виприскування" половини своє маси вперед з більшою швидкістю, з ціллю захопити іншого (меншого) гравця. В рамках завдання це реалізовувати необов'язково, але можна за додатковий бал до завдання 20 | 8. На сервері має бути реалізована система відстежування позиції гравця що дозволяє надсилати йому координати тільки тих точок їжі та противників, що потрапляють в його поле зору 21 | 9. За 2 додаткових бали можна реалізувати протокол спілкування клієнта з сервером по аналогії з наступним варіантом - UDP + бінарна серіалізація. 22 | 23 | ### Деталі 24 | У всіх онлайн іграх, в яких відбувається одночасна взаємодія великої кількості гравців на відкритій карті доводиться вирішувати проблему визначення данних, які слід надсилати кожному гравцю. Надсилати всім дані про всі переміщення нераціонально і складно, тому що це а) призведе до величезного трафіку, б) небезпечно, оскільки гравці зможуть скористатися тим, що отримують інформацію навіть про тих гравців, яких не можуть бачити відповідно до геймплею. 25 | 26 | Стандартним та найпростішим рішенням є розділення відкритого поля на сітку (див. ілюстрацію). Кожен гравець, перебуваючи в певному квадраті отримує з серверу апдейти про переміщення інших гравців та іншу активність у своєму квадраті та у навколишніх квадратах. Отримані дані після цього можуть додатково фільтруватися вже на рівні клієнту (наприклад, щоб відображати об'єкти тільки у певному радіусі). 27 | 28 | 29 | ![reversi field](https://github.com/introduction-to-gamedev/assignments/blob/master/res/grid_example.png "Сітка") 30 | 31 | Після переміщення гравця в квадрат В3 з С3, гравець перестане отримувати апдейти з квадратів D2\D3\D4, але почне з A2\A3\A4 32 | 33 | При виконанні завдання слід реалізувати подібну систему поділу поля, просто фільтрувати всіх гравців перед відправкою на клієнт не допускається (оскільки це рішення не може бути масштабованим) 34 | 35 | ### Оцінювання: 36 | - Якість коду - *4 бали* 37 | - Повноцінний гейм-луп з раундами - *4 бали* 38 | - Корректно реалізована система оповіщеня гравців про події навколо них - *3 бали* 39 | 40 | 41 | #### Варіант Б. Room-based multiplayer 42 | 43 | Якщо ми говоримо при ігри, в яких кількість гравців сильно обмежена (наприклад, party-games типу Overcooked), завдання будувати просторову ієрархію гравців для надсилання данних вже не стоїть, проте інші питання, такі як скорочення обсягів трафіку, досягнення плавних анімацій та синхронізація лишаються. Другий варіант завдання пропонує сконцентруватися саме на них. 44 | 45 | ### Завдання 46 | Гра - клієнт-серверний 2D-шутер з видом зверху з обмеженням до 4-х гравців в одній кімнаті 47 | 1. Після приєднання до серверу та набору необхідної кількості гравців (2-4), всі гравці стартують на карті в визначених місцях. Графіка не грає ролі - можна використовувати для позначення гравців кружечки з позначкою поточного повороту 48 | 2. Гравці можуть рухатися у всіх напрямках та повертатись 49 | 3. Гравці мають однакову кількість здоров'я на початку раунду 50 | 4. Гравці можуть стріляти кулями в напрямку погляду, куля має певну швидкість та знімає частину здоров'я при ураженні іншого гравця 51 | 5. На полі періодично рандомно з'являються: аптечки, бусти для швидкості гравця та куль, бусти для урону куль. 52 | 6. Раунд закінчується коли в живих лишається один гравець 53 | 7. Протокол спілкування клієнта з сервером під час раунду має бути побудованим на UDP та бінарним (можна викорситовувати готові рішення типу Protocol Buffers, або написати самостійно) 54 | 55 | 56 | ### Оцінювання: 57 | - Якість коду - *4 бали* 58 | - Повноцінний гейм-луп - *4 бали* 59 | - Корректно реалізований бінарний протокол над UDP - *3 бали* 60 | 61 | ### Матеріали: 62 | - [Лекція з мереж](https://www.youtube.com/watch?v=zwJeefDgOEA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=9) 63 | - [Google Protobuf](https://developers.google.com/protocol-buffers) 64 | - [UDP vs TCP](https://gafferongames.com/post/udp_vs_tcp/) 65 | -------------------------------------------------------------------------------- /2020/assignment_4.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №4 2 | ## Реалізація Steering behaviours. Гра про полювання 3 | 4 | ### Ціль роботи 5 | Реалізувати наступні поведінки: блукання, переслідування, втеча, уникнення зіткнення та груповий рух. Спробувати як комбінування простих поведінок використовується для імітації складних систем. 6 | 7 | ### Завдання 8 | Вся графіка у грі є непринципивою і може бути реалізована схематичними колами. 9 | 1. Гра представляє собою схематичне поле без перешкод з видом зверху. Поле обмежено прямокутними кордонами - "обривом". 10 | 2. Гравець керує **мисливцем**, який може рухатись в усі сторони (мишкою або WASD) та стріляти на певну відстань. Після попадання у здобич, здобич гине. Кількість патронів у мисливця обмежена. 11 | 3. На полі знаходяться: 12 | - **Зайці**. Особи, які повільно переміщуються (блукають), але швидко тікають від будь-яких інших осіб (навіть інших зайців); 13 | - **Лані**. Особи, що переміщуються групами (групами блукають та тікають, повертаються у групу якщо відбились по якійсь причині). Бояться мисливців та вовків. Відчувають вовків здалеку та уникають; 14 | - **Вовки**. Одинаки, нападають на зайців, ланей та мисливця. У звичайному режимі блукають, але мають певний радіус (менший за радіус "чуття" ланей) у якому можуть "почути" здобич та почати переслідувати. Рухаються повільніше зайців, швидше ланей (так, нереалістично) та швидше мисливця, після того як наздоганяють здобич - вбивають її. Гинуть, якщо певний час не можуть знайти здобич. 15 | 4. Перед стартом гри генерується певна кількість зайців, вовків та груп ланей на полі. Кожна група ланей має 3-10 особин. Після старту обрані особини та групи мають бути сгенеровані та розміщені на полі у випадковому порядку. Точна кількість особин має бути доступна для конфігурування; 16 | 5. Всі тварини намагаються уникнути обриву і гинуть якщо падають з нього (перетинають кордон). 17 | 18 | ### Деталі 19 | Steering behaviours - набір простих, але потужних у варіантах використання алогритмів для імітації поведінок. В поєднанні з пошуком шляхів є основою великої кількості навігаційних систем. В даній роботі пропонується на прикладі простої гри-симуляції полювання розібрати декілька основних поведінок та реалізувати їх. Детальне пояснення алгоритмів та інтерактивні приклади доступні за посиланнями у матеріалах. 20 | 21 | ### Оцінювання 22 | 1. Реалізація усіх поведінок - *5 балів* 23 | 2. Реалізація мисливця - *3 бали* 24 | 3. Загальна якість коду - *3 бали* 25 | 26 | ### Матеріали 27 | 1.[Лекція по Steering behaviours](https://www.youtube.com/watch?v=mNOANy_4wCg&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=6) 28 | 2.[Детальна стаття з прикладами](https://natureofcode.com/book/chapter-6-autonomous-agents/) 29 | 3.[Ще трохи прикладів](https://gamedevelopment.tutsplus.com/series/understanding-steering-behaviors--gamedev-12732) 30 | -------------------------------------------------------------------------------- /2020/exam_topics.md: -------------------------------------------------------------------------------- 1 | ## Перелік тем на екзамен 2 | Наведені нижче теми слід розглядати як короткий перелік основних тем, розглянутих на лекціях, на які слід звернути увагу в першу чергу при підготовці до езкамену. 3 | 4 | #### Штучний інтелект 5 | - A*, IDA*, Dijkstra, Jump Point Search; 6 | - minimax, negamax, a\b pruning; 7 | - Monte-Carlo Search Trees; 8 | - steering behaviours and boids (seek, arrival, wonder, flee, group movement, line alignment, wall avoiding etc); 9 | - goal-oriented behaviour and goal-oriented action planning; 10 | - дерева прийняття рішень; 11 | - behaviour trees; 12 | - tactical waypoints AI; 13 | - tactical pathfinding; 14 | - кінцеві автомати 15 | 16 | 17 | #### Комп'ютерна графіка 18 | - відмінності та принцип роботи CPU та GPU; 19 | - відмінності OpenGL, DirectX, Vulkan; 20 | - подвійна буферизація, VSync; 21 | - поняття графічного пайплайну; 22 | - frame buffer, stencil buffer, z-buffer; 23 | - шейдери: вертексні, фрагментні, геометричні, обчислювальні - принципи, відмінності, застосування; 24 | - тесселяція; 25 | - текстури, UV-mapping; 26 | - bump map, normal map, parallax map; 27 | - flat shading, Gouraud shading; 28 | - модель освітленя за Фонгом; 29 | - global and local illumination; 30 | - рівняння рендерінгу; 31 | - ambient occlusion та Screen Space Ambient Occlusion; 32 | - PBR (physically based rendering); 33 | - каустика; 34 | - forward и deferred rendering; multiple render target and geometry buffer; 35 | 36 | #### Розробка та архітектура 37 | - принципи SOLID: визначення, застосування (гарно вигадати власні приклади, а не обмежуватися лекційними); 38 | - MVC, MVP та MVVM - принципи використання, задачі, обмеження; 39 | - патерни та антіпатерни: пул, синглтон, state machine, game loop, команда, null-object; 40 | 41 | 42 | #### Мережі 43 | - client-side prediction; 44 | - lockstep and client-server model; 45 | - TCP та UDP: використання, проблеми; 46 | - текстові та бінарні протоколи серіалізації; 47 | - Google Protocol Buffers; 48 | - принципи мережевої організації MMO ігор, кооперативних ігор, покрокових ігор; 49 | 50 | #### Інше 51 | - вектори та операції над ними; 52 | - інтерполяція, екстраполяція, апроксимація; 53 | - кватерніони та шарнірний замок; 54 | - шум за Перліним; 55 | - поняття гейм-дизайну: механіки, подія, триггер; 56 | - поняття User Experience; 57 | - user retention; 58 | - learning curve; 59 | - поняття ігрового рушія (движка, engine) 60 | -------------------------------------------------------------------------------- /2020/overview.md: -------------------------------------------------------------------------------- 1 | ## Лекції 2 | 3 | Майже всі лекції поділені на тематичні блоки. Перегляд лекцій, що містять матеріал, який ви не робите у практичному завданні - обов'язковий, питання будуть винесені в контрольну та залік. Всі лекції доступні у одному [плейлисті](https://www.youtube.com/playlist?list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw), але у порядку у якому вони читались у 2019 році 4 | 5 | 1. [Вступна лекція](https://www.youtube.com/watch?v=rBfT493jhBY&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=2) - дає загальний огляд курсу. 6 | 2. Блок із лекцій на тему програмування: [SOLID](https://www.youtube.com/watch?v=_YL5SCJr84E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=11), [MVC](https://www.youtube.com/watch?v=6Avtm_qij2E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=12) та [паттерни](https://www.youtube.com/watch?v=j-JtShcib4E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=13). Лекції знадобляться для виконання першої практичної з дедлайном 3 жовтня. У разі якщо ви відчуваєте необхідність більше заглибитись в тему, в якості додаткового матеріалу можна використовувати лекції з курсу [архітектури ПЗ](https://www.youtube.com/playlist?list=PLkgXLMuasx7CTiy1qy3O6sPolfGDyM2aF) 7 | 3. Блок лекцій на тему АІ: для початку слід згадати [основи математики](https://www.youtube.com/watch?v=NbQoaGOOaYo&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=4), [перша лекція](https://www.youtube.com/watch?v=zlEI6ii28_A&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=5) необхідна для виконання другої практичної роботи, [друга](https://www.youtube.com/watch?v=RKFItb_fPZk&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=6) і [третя](https://www.youtube.com/watch?v=mNOANy_4wCg&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=7) - для третьої\четвертої і контрольної 8 | 4. [Лекція з мереж](https://www.youtube.com/watch?v=zwJeefDgOEA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=10) - необхідна для четвертої практичної. 9 | 5. Блок лекцій на тему комп'ютерної графіки: [основи](https://www.youtube.com/watch?v=-OinemN_LZA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=8) та [сучасні технології](https://www.youtube.com/watch?v=8VIYf3mYMjE&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=9). 10 | 6. [Лекція з геймдизайну](https://www.youtube.com/watch?v=qj5FO4W8wdU&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=3). 11 | 12 | ## Контрольна робота 13 | 14 | В курсі передбачено одну контрольну, за яку можна отримати до 6 балів. Приблизна дата контрольної - 6 листопада. Завдання контрольної покривають перші три блоки 15 | 16 | ## Практичні роботи 17 | 18 | Блок практичних завдань курсу складається з чотирьох завдань: 19 | 20 | 1. [Розробка клієнту для настольної гри Реверсі](../2020/assignment_1.md). 21 | 2. - [Розробка базового штучного інтелекту для гри Реверсі](../2020/assignment_2_1.md). 22 | - [Змагання зі штучного інтелекту](../2020/assignment_2_2.md). 23 | 3. [Мережева гра](../2020/assignment_3.md). 24 | 4. [Реалізація Steering behaviours. Гра про полювання](../2020/assignment_4.md). 25 | 26 | Порядок виконання та здачі практичної роботи: 27 | 28 | 1. Скласти команду з двох людей, в цій команді ви будете виконувати всі практичні. Одному (if you're brave enough) виконувати завдання можна, більше ніж вдвох - ні 29 | 2. Зареєструватиcя в [дискорді](https://discord.gg/3vhrB9u), написати мені (нік в дискорді:`Artem Korotenko#8077`) в приватні повідомлення ніки - я створю приватний канал для вашої команди. 30 | 3. Якщо завдання потребує вибору варіанту - написати в канал, який ви виконуєте варіант. 31 | 4. Весь код завдання має бути розміщено у публічному репозиторії (наприклад, на гітхабі). 32 | 5. Коли ви готові здавати роботу - пишете в канал що робота готова до перевірки. 33 | 6. Якщо по ходу виконання у вас виникають питання, їх можна задавати в приватному каналі, тегнувши лектора, або в спеціальному каналі в дискорді - #homework-help. Якщо ви вважаєте, що ваше питання неспецифічне і зможе допомогти чи буде корисним ще якійсь команді - задавайте питання у публічному каналі. 34 | 35 | **Важливо!** Всі завдання розраховані на самостійне виконання. У разі виявлення копіпасти в роботі (з інших робіт або з інтернету) бали за роботу анулюються та команда отримує **штраф в 15 балів** 36 | 37 | По кожному завданню передбачено два дедлайни: _soft_, після якого максимальна оцінка за роботу зменшується вдвічі, та _hard_, після якого бали за роботу не зараховуються взагалі 38 | 39 | |Номер роботи|Максимальна кількість балів|Soft deadline|Hard deadline| 40 | |:----------:|:-------------------------:|-------------|-------------| 41 | |1|12|3 жовтня|17 жовтня| 42 | |2|8|27 жовтня|7 листопада| 43 | |3|11|17 листопада|28 листопада| 44 | |4|11|8 грудня|31 грудня| 45 | 46 | 47 | ## Залік 48 | 49 | За залік можна отримати 40 балів, допуск на залік - 25 рейтингових балів. 50 | Формат заліку: усний, ви отримуєте білет з трьома питаннями, готуєтеся, і відповідаєте на ці 3 питання, а також на 3 додаткових питання по відповідним темам. Додаткове питання приносить стільки ж балів, скільки і основне. 51 | У разі недопуску на залік, або нескладання заліку з першого разу, ви потрапляєте на повторну здачу, під час якої ваші накопичені бали анулюються і ви відповідаєте на питання, але набираєте бали за шкалою від 0 до 100 52 | -------------------------------------------------------------------------------- /2021/assignment_1.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №1 2 | ## Розробка клієнта для настольної гри Quoridor 3 | 4 | ### Мета роботи: 5 | Розібратись із використанням паттерну MVC у ігрових проектах на прикладі настольної гри Quoridor, підготувати проект для виконання другої роботи. 6 | 7 | ### Завдання: 8 | 9 | Минулого року, в рамках нашого курсу ми розробляли штучний інтелект для гри реверсі (завдання минулого року все ще доступні в цьому репозиторії в папці [assignments/2020](../2020)). Цього року, ми виконаємо схоже завдання для цікавої, але трохи більш складної гри - Quoridor. 10 | 11 | ![Quoridor](../res/Quoridor_1.jpg "game field") 12 | 13 | Quoridor - настільна гра для двох або чотирьох гравців з достатньо простими правилами, але глибокою стратегією. Наступні дві роботи ми будемо займатися реалізацією комп'ютерної версії цієї гри та АІ до неї. Детальніше про саму гру та правила можна почитати [тут](https://desktopgames.com.ua/quoridor.html), pdf з правилами також доступний [в репозиторії](../res/quoridor_rules_ru.pdf). 14 | 15 | Рекомендую також подивитись відео: [англійською](https://www.youtube.com/watch?v=6ISruhN0Hc0) або [російською](https://www.youtube.com/watch?v=Xv3BppTJ-_8) Спробувати сили та пограти можна в [онлайні](http://quoridor.di.uoa.gr/) 16 | 17 | Також у вас буде можливість прийти та пограти в неї вживу :) 18 | 19 | В рамках завдання неохідно створити програму, що виконує наступні вимоги: 20 | - програма є клієнтом для гри у Quoridor для двох гравців; 21 | - користувач може обрати: або ходити за обох опонентів, або грати проти комп'ютерного гравця який грає за примітивною стратегію - робить випадковий із можливих кроків. (Тобто або рухається у випадковому напрямку, або виставляє стінку у випадкове дозволене місце); 22 | - програма не дозволяє робити не коректні ходи; 23 | - програма фіксує переможця; 24 | 25 | На програмному рівні має бути виділено три компонента: 26 | - відображення - ui-код, що відноситься до рендеру клієнта. Вимог до реалізації немає, це може бути як стенделоун-додаток, так і команда строка з ASCII-артом або веб-сторінка. 27 | - введення - частина програми, що оброблює інпут та перенаправляє його в модель. Дуже важливо чітко виділити цей компонент, оскільки в другій роботі його доведеться замінити на ввід з командної строки. 28 | - модель - весь код, що відноситься до бізнес-логіки, тобто гри Quoridor. Ця частина коду знадобиться в наступній роботі, де не буде необхідності в виводі результату на екран, і буде інший інпут 29 | 30 | ### Примітки 31 | 32 | Розділення програми на компоненти згідно паттерну MVC стає в нагоді в багатьох моментах, на прикладі двох робіт ми розглянемо часту ситуацію, коли всередині гри потрібно паралельно підтримувати дві системи вводу (від гравця та програмний від AI) та дві системи виводу (вивід у клієнт або лімітований вивід при грі з АІ). 33 | Реальні приклади такого розділення: 34 | - match3-ігри, в яких нові рівні перед релізом тестуються штучним AI "гравцем", і складність рівня змінюється відповідно до успіхів бота. Очевидно, що якщо ми хочемо програти рівень ботом 100 разів, то ми не хочемо робити у повноцінному клієнті зі всіма ефектами та анімаціями, а хочемо лише отримати короткий звіт за результатами роботи. 35 | - серверні ігри типу шахів або казино, де логіка дублюється на клієнті і сервері - клієнт зчитує хід з UI і відображає його результати на інтерфейсі, а сервер отримує цей хід вже за певним протоколом через мережу, і валідує його корректність. 36 | 37 | Виконуючи цю роботу, тримайте на увазі що код вашої гри має бути саме таким - незалежним від вводу\виводу 38 | 39 | Одним із важливих праивл гри є заборона повністю блокувати оппоненту шлях, а це означає що вам доведеться після кожного ходу перевіряти наявність шляху від кожного гравця до краю поля. Для цієї задачі та поля 9х9 вам цілком вистачить алгоритму [Флойда](https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm) або [Дейкстри](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm). Також можна реалізувати [A*](https://en.wikipedia.org/wiki/A*_search_algorithm). Якщо ці алгоритми для вас нові, можете подивитись першу частину лекції про [AI](https://www.youtube.com/watch?v=RKFItb_fPZk&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=5), де ми розглядаємо пошук шляхів. 40 | 41 | 42 | ### Оцінювання: 43 | - реалізовано клієнт з повними правилами гри - *3 бали* 44 | - не має можливості робити неправильні ходи - *2 бали* 45 | - клієнт має повний game loop (можна почати гру, закінчити її та почати знову будь-яку кількість разів без перезапуску) - *2 бали* 46 | - є можливість грати з комп'ютером та за двох гравців - *2 бали* 47 | - якість реалізації MVC - *3 бали* 48 | 49 | ### Матеріали: 50 | - [Лекція із загальних правил проектування програм](https://www.youtube.com/watch?v=_YL5SCJr84E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 51 | - [Лекція з MVC](https://www.youtube.com/watch?v=6Avtm_qij2E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 52 | - [Репозиторій з прикладом з лекції](https://github.com/artem-korotenko/mvc-tic-tac-toe) 53 | - [Лекція з патернів ігрової розробки](https://www.youtube.com/watch?v=j-JtShcib4E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw) 54 | -------------------------------------------------------------------------------- /2021/assignment_2.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №2 2 | 3 | ## Розробка штучного інтелекту для гри Quoridor 4 | 5 | ### Мета роботи: 6 | 7 | Розібратися з алгоритмами штучного інтелекту, що використовуються для детермінованих ігор з повною інформацією. 8 | Реалізувати штучний інтелект для гри з першої роботи. 9 | 10 | ### Завдання: 11 | 12 | В минулій роботи було реалізовано клієнт для гри Quoridor. Як ви пам'ятаєте, окремим пунктом в завданнях було вказано 13 | звернути увагу на розділення коду на модулі - модель, обробку введення та візуалізацію. В данній роботі нам знадобиться 14 | зроблена модель (input та view доведеться створити нові), оскільки ціль роботи - створення штучного інтелекту для гри. 15 | 16 | Робота над штучним інтелектом складається з двох частин: 17 | 18 | 1. Створити штучний інтелект, що буде перемагати опонента який грає за примітивною стратегією 90% (або більше) випадків. 19 | Виконання цього пункту дозволить здати практичну роботу №2 та отримати відповідну кількість балів. В цьому документі 20 | описана саме ця частина. 21 | 2. Створити бота, що буде здатен перемогти ботів інших команд. Змагання буде проходити в декілька турів, команди що в 22 | підсумку покажуть найкращий результат отримують додаткові бали. 23 | 24 | ### Деталі 25 | 26 | Перший важливий момент - Quoridor як гра достатньо мало вивчена порівняно з шахами, шашками або го. В інтернеті можна 27 | знайти декілька статей по штучному інтелекту для цієї гри та декілька репозиторієв з кодом. Пам'ятайте, що для нас цей 28 | проект - навчальний, для того щоб виконати другу роботу достатньо реалізувати не надто складний алгоритм, а у 29 | майбутньому змаганні буде первірятись не вміння гуглити готовий код, а бажання побільше та поглибше розібратись із 30 | темою. Тому знаходження будь-якого плагіату\копіпасти в цій роботі або змаганні буде каратись нулем балів за другу 31 | роботу та змагання 32 | 33 | За умовами завдання не виставляється конкретна вимога який саме алгоритм реалізовувати для штучного інтелекту, проте я 34 | рекомендую почати з мінімаксу: реалізувати власне дерево мінімаксу, подумати про підрахунок SEV, далі додати альфа\бета 35 | відсікання для збільшення глибини прорахунку та ускладнювати бота лише ітеративно. Рекомендую братися за більш складні 36 | варіанти (наприклад, MCTS) тільки коли ви будете мати робочу версію з мінімаксом, яка проходить всі тести. 37 | 38 | Як тільки ви реалізуєте дерево мінімаксу (можна для початку взяти найпростішу SEV, що повертає значення, обернено 39 | пропорційне до кількості кроків до перемоги), у вас буде декілька можливих шляхів покращення алгоритму: 40 | 41 | 1. Оптимізувати дерево для того щоб мати змогу передивлятися його на більшу глибину; 42 | 2. Скорочувати кількість варіантів ходу які ви переглядаєте - кожен хід ви можете ставити стінку в будь-яке вільне місце 43 | на полі, але скоріш за все якийсь геймплейний сенс будуть мати лише декілька таких ходів. Можна спробувати якимось 44 | чином скорочувати цей перебір, або не перевіряти всі ходи на початку гри а обмежетись декількома дебютами і т.д.; 45 | 3. Покращувати саму SEV - пріоретизувати ходи над постановкою стінок або навпаки, враховувати кількість доступних 46 | шляхів (щоб лишити собі одний зручний прохід) тощо. 47 | 48 | Другий важливий момент - Для того щоб мати змогу змагатися один з одним, боти мають реалізовувати певний спільний 49 | інтерфейс. Найпростішим варіантом такого інтерфейсу є командний рядок, оскільки створити подібну програму можна за 50 | допомогою всіх розповсюджених мов програмування та платформ. Отже, якщо попередня робота виконана вами коректно, то вам 51 | не буде складно підмінити введення з графічного (з клієнту) на введення з командної строки, а виведення ходу - на вивід 52 | в командний рядок. 53 | 54 | Вимоги до програми: 55 | 56 | 1. Програма має запускатися через командний рядок та зчитувати ввід з `system.in` 57 | 2. На початку виконання программа має отримати вказанням кольору, яким пропонується грати (у форматі `white` 58 | або `black`). Вважаємо, що на вертикально розташованій дошці чорний гравець знаходиться зверху (клітинка `E1`), а білий - знизу (`E9`). Білі 59 | ходять першими, тому якщо білими грає ваш бот, одразу після першої команди будуть очікуватися координати ходу. Якщо 60 | чорними - третьою командою прийде хід чорних 61 | 4. Далі програма має видавати наступний хід після кожного введенего ходу противника. 62 | 63 | Программа буде тестуватися за допомогою спеціального клієнта, який буде її запускати та виступати в ролі противника, що 64 | ходить за певною примітивною стратегією. Вихідний код тестувальника буде викладено незабаром. Для того щоб тест був 65 | пройдений успішно, команда отримала базові бали та була допущена до змагання, необхідно щоб виконувалися наступні умови: 66 | 67 | 1. При запускові 100 раундів ігор проти бота, бот перемагає у 90 або більше. 68 | 2. Бот працює без помилок: будь-яка помилка у рантаймі програми буде призводити до зарахування технічної поразки в 69 | раунді. 70 | 3. Бот працює у рамках виділених ресурсів: кожен хід вкладається у 5 секунди, бот використовує не більше 1Гб оперативної 71 | пам'яті. Вихід за рамки цих вимог також призводить до технічної поразки. Обмеження у 5 секунди буде вимірюватися на 72 | тестовому пристрої з CPU i7-8700. 73 | 4. Технічна поразка також зараховується у випадку якщо програма видає неможливий на даний момент хід. 74 | 75 | Кожен хід складається з команди (`move`, `jump` або `wall`) та координат. `move` завжди означає переміщення у сусідню 76 | порожню клітинку, `jump` - стрибок через іншого гравця. Координати клітинок та стінок відрізняються, детальна схема наведена нижче. Розглянемо приклад 77 | командної строки при роботі з ботом (`->` - ввід, `<-` - вивід з програми): 78 | 79 | ``` 80 | -> black // перша команда - колір яким пропонується грати 81 | -> move E8 // бот грає чорними, тому наступний хід теж вводиться. Це переміщення білого гравця у клітинку Е8 82 | <- wall V7h // бот вирішує поставити стінку. h наприкінці означає горизонтальну стінку, v - вертикальну 83 | ``` 84 | 85 | і так далі 86 | 87 | Схема розмітки поля та стартова позиція: 88 | 89 | ![Quoridor](../res/quoridor_scheme.png "Розмітка поля") 90 | 91 | Перед здачею роботи необхідно зібрати консольний додаток під win64 додати у релізи на вашому гітхаб-репозиторії 92 | 93 | ### Оцінювання: 94 | 95 | - бот перемагає у 90 іграх зі 100 - *4 бали* 96 | - бот перемагає у 100 іграх зі 100 - *1 бал* 97 | - бот не отримує жодної технічної поразки - *1 бал* 98 | - якість написання коду - *2 бали* 99 | 100 | ### Матеріали: 101 | 102 | - [Лекція із штучного інтелекту (minimax, MCST)](https://www.youtube.com/watch?v=zlEI6ii28_A&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=5) 103 | - [Стаття з мінімаксу на вікіпедії](https://en.wikipedia.org/wiki/Minimax) 104 | - [Альфа\бета відсікання](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) 105 | 106 | ### Література 107 | 108 | Посилання йдуть амазон, але всі матеріали можна знайти в мережі 109 | 110 | - [AI for games (chapter 9)](https://www.amazon.com/AI-Games-Third-Ian-Millington/dp/1138483974) 111 | -------------------------------------------------------------------------------- /2021/assignment_3.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №3 2 | ## Реалізація Steering behaviours 3 | 4 | ### Ціль роботи 5 | Реалізувати наступні поведінки: блукання, переслідування, втеча, уникнення зіткнення та груповий рух. Спробувати як комбінування простих поведінок використовується для імітації складних систем. 6 | 7 | Для виконання пропонується обрати один з двох варіантів: 8 | 9 | #### Варіант А. Гра Hunter (12 балів) 10 | 11 | ### Завдання 12 | Вся графіка у грі є непринципивою і може бути реалізована схематичними колами. 13 | 1. Гра представляє собою схематичне поле без перешкод з видом зверху. Поле обмежено прямокутними кордонами - "обривом". 14 | 2. Гравець керує **мисливцем**, який може рухатись в усі сторони (мишкою або WASD) та стріляти на певну відстань. Після попадання у здобич, здобич гине. Кількість патронів у мисливця обмежена. 15 | 3. На полі знаходяться: 16 | - **Зайці**. Особи, які повільно переміщуються (блукають), але швидко тікають від будь-яких інших осіб (навіть інших зайців); 17 | - **Лані**. Особи, що переміщуються групами (групами блукають та тікають, повертаються у групу якщо відбились по якійсь причині). Бояться мисливців та вовків. Відчувають вовків здалеку та уникають; 18 | - **Вовки**. Одинаки, нападають на зайців, ланей та мисливця. У звичайному режимі блукають, але мають певний радіус (менший за радіус "чуття" ланей) у якому можуть "почути" здобич та почати переслідувати. Рухаються повільніше зайців, швидше ланей (так, нереалістично) та швидше мисливця, після того як наздоганяють здобич - вбивають її. Гинуть, якщо певний час не можуть знайти здобич. 19 | 4. Перед стартом гри генерується певна кількість зайців, вовків та груп ланей на полі. Кожна група ланей має 3-10 особин. Після старту обрані особини та групи мають бути сгенеровані та розміщені на полі у випадковому порядку. Точна кількість особин має бути доступна для конфігурування; 20 | 5. Всі тварини намагаються уникнути обриву і гинуть якщо падають з нього (перетинають кордон). 21 | 22 | ### Деталі 23 | Steering behaviours - набір простих, але потужних у варіантах використання алогритмів для імітації поведінок. В поєднанні з пошуком шляхів є основою великої кількості навігаційних систем. В даній роботі пропонується на прикладі простої гри-симуляції полювання розібрати декілька основних поведінок та реалізувати їх. Детальне пояснення алгоритмів та інтерактивні приклади доступні за посиланнями у матеріалах. 24 | 25 | ### Оцінювання 26 | 1. Реалізація усіх поведінок - *5 балів* 27 | 2. Реалізація мисливця - *4 бали* 28 | 3. Загальна якість коду - *3 бали* 29 | 30 | 31 | #### Варіант Б. Гра Street Racer (12 балів) 32 | 1. Гра представляє собою схематичний 2D-трек для перегонів, який можна представити собі як ламану лінію з певним радіусом. Приклад схематичного зображення треку можна побачити нижче; 33 | 2. Гравець керує **болідом**, що може рухатися по карті (як по треку так і за його межами). Болід може розганятися та приторможувати; 34 | 3. По треку колами їздить певна кількість автомобілей - вони мають різну швидкість, притримуються власного маршруту та уникають зіткнення з іншими авто; 35 | 4. Є поліцеські машини - вони стоять на узбіччі та мають радіус, в якому дивляться за авто - якщо авто проїжджає на швидкості, більшій за допустиму, поліцейська машина буде наздоганяти 36 | порушника, поки той буде в полі зору. Якщо поліцейський доганяє гравця - гра закінчується; 37 | 5. По карті невеликими групками ходять перехожі - вони можуть переходити дорогу та намагаються не потрапити пд машину. Якщо машина збиває пішохода, вона зупиняється на певний час; 38 | 6. Будь-яка машина сповільнюється, якщо виїжджає за межі треку; 39 | 7. Суть гри - якомога швидше проїхати декілька кіл, не будучи спійманим копами. 40 | 41 | ![track](../res/track.png "Трек") 42 | 43 | ### Оцінювання 44 | 1. Реалізація боліду - *2 бали* 45 | 2. Гейм-луп - *3 бали* 46 | 3. Поліцейські - *2 бали* 47 | 4. Перехожі - *2 бали* 48 | 5. Загальна якість коду - *3 бали* 49 | 50 | ### Матеріали 51 | 1.[Лекція по Steering behaviours](https://www.youtube.com/watch?v=mNOANy_4wCg&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=6) 52 | 2.[Детальна стаття з прикладами](https://natureofcode.com/book/chapter-6-autonomous-agents/) 53 | 3.[Ще трохи прикладів](https://gamedevelopment.tutsplus.com/series/understanding-steering-behaviors--gamedev-12732) 54 | -------------------------------------------------------------------------------- /2021/assignment_4.md: -------------------------------------------------------------------------------- 1 | ###### Практична робота №4 2 | ## Створення мережевої клієнт-серверної гри 3 | 4 | ### Ціль роботи 5 | Розібратися із принципами побудови онлайн-ігор: на великих картах, кімнатах або ж у покроковому режимі. 6 | 7 | Для виконання пропонується обрати один з двох варіантів (зверніть увагу, що варіанти мають різну складність і будуть оцінюватись у різну кількість балів): 8 | 9 | #### Варіант А. .io-like massive multiplayer (13-16 балів) 10 | 11 | ### Завдання 12 | Гра, що пропонується до реалізації - спрощена версія agar.io. 13 | 1. Клієнт, під'єднавшись до сервера, потрапляє у кімнату великого розміру (без перешкод) разом із іншими гравцями. 14 | 2. Гра відбувається у двомірній площині, кожен гравець відображається колом певного кольору. 15 | 3. Гравець може пересуватися по площині в будь-якому напрямку 16 | 4. По карті випадковим чином розкидані крапки-"їжа", підібравши яку гравець збільшується у розмірі 17 | 5. При зіткненні двох гравців виживає більший, який збільшується в розмірі пропорційно до розміру другого гравця 18 | 6. Гра складається з раундів, що йдуть безперервно один за одним, в кінці раунду на екран виводиться топ гравців за ромзіром, після чого всі активні гравці скидаються до найменшого розміру 19 | 7. В оригінільному agar.io важливою складовою механіки є "виприскування" половини своє маси вперед з більшою швидкістю, з ціллю захопити іншого (меншого) гравця. В рамках завдання це реалізовувати необов'язково, але можна за додатковий бал до завдання 20 | 8. На сервері має бути реалізована система відстежування позиції гравця що дозволяє надсилати йому координати тільки тих точок їжі та противників, що потрапляють в його поле зору 21 | 9. За 2 додаткових бали можна реалізувати протокол спілкування клієнта з сервером по аналогії з наступним варіантом - UDP + бінарна серіалізація. 22 | 23 | ### Деталі 24 | У всіх онлайн іграх, в яких відбувається одночасна взаємодія великої кількості гравців на відкритій карті доводиться вирішувати проблему визначення данних, які слід надсилати кожному гравцю. Надсилати всім дані про всі переміщення нераціонально і складно, тому що це а) призведе до величезного трафіку, б) небезпечно, оскільки гравці зможуть скористатися тим, що отримують інформацію навіть про тих гравців, яких не можуть бачити відповідно до геймплею. 25 | 26 | Стандартним та найпростішим рішенням є розділення відкритого поля на сітку (див. ілюстрацію). Кожен гравець, перебуваючи в певному квадраті отримує з серверу апдейти про переміщення інших гравців та іншу активність у своєму квадраті та у навколишніх квадратах. Отримані дані після цього можуть додатково фільтруватися вже на рівні клієнту (наприклад, щоб відображати об'єкти тільки у певному радіусі). 27 | 28 | 29 | ![reversi field](../res/grid_example.png "Сітка") 30 | 31 | Після переміщення гравця в квадрат В3 з С3, гравець перестане отримувати апдейти з квадратів D2\D3\D4, але почне з A2\A3\A4 32 | 33 | При виконанні завдання слід реалізувати подібну систему поділу поля, просто фільтрувати всіх гравців перед відправкою на клієнт не допускається (оскільки це рішення не може бути масштабованим) 34 | 35 | ### Оцінювання: 36 | - Якість коду - *5 балів* 37 | - Повноцінний гейм-луп з раундами - *4 бали* 38 | - Топ-гравців в кіні раунду - *1 бал* 39 | - Корректно реалізована система оповіщеня гравців про події навколо них - *3 бали* 40 | - Додатковий функціонал - *3 бали* 41 | 42 | 43 | #### Варіант Б. Room-based multiplayer (12-14 балів) 44 | 45 | Якщо ми говоримо при ігри, в яких кількість гравців сильно обмежена (наприклад, party-games типу Overcooked), завдання будувати просторову ієрархію гравців для надсилання данних вже не стоїть, 46 | проте інші питання, такі як скорочення обсягів трафіку, досягнення плавних анімацій та синхронізація лишаються. Другий варіант завдання пропонує сконцентруватися саме на них. 47 | 48 | ### Завдання 49 | Гра - клієнт-серверний 2D-шутер з видом зверху з обмеженням до 4-х гравців в одній кімнаті 50 | 1. Після приєднання до серверу та набору необхідної кількості гравців (2-4), всі гравці стартують на карті в визначених місцях. Графіка не грає ролі - можна використовувати для позначення гравців кружечки з позначкою поточного повороту 51 | 2. Гравці можуть рухатися у всіх напрямках та повертатись 52 | 3. Гравці мають однакову кількість здоров'я на початку раунду 53 | 4. Гравці можуть стріляти кулями в напрямку погляду, куля має певну швидкість та знімає частину здоров'я при ураженні іншого гравця 54 | 5. (Додатково, +2 бали) На полі періодично рандомно з'являються: аптечки, бусти для швидкості гравця та куль, бусти для урону куль. 55 | 6. Раунд закінчується коли в живих лишається один гравець 56 | 7. Протокол спілкування клієнта з сервером під час раунду має бути побудованим на UDP та бінарним (можна викорситовувати готові рішення типу Protocol Buffers, або написати самостійно) 57 | 58 | 59 | ### Оцінювання: 60 | - Якість коду - *4 бали* 61 | - Повноцінний гейм-луп - *4 бали* 62 | - Корректно реалізований бінарний протокол над UDP - *3 бали* 63 | - Додатковий функціонал - *2 бали* 64 | 65 | 66 | #### Варіант В. Покрокова PvP гра зі спілкуванням через сервер (6-10 балів) 67 | 68 | Найпростіший варіант мережевої взаємодії відбувається в покрокових іграх (шашки, шахи, класичні карткові ігри типу покера, колекційні карткові ігри типу Hearthstone, стратегії типу Цивілізації і так далі). 69 | В такому випадку зазвичай логіка гри повністю розміщується на сервері, а клієнти стають дуже тонкими - вони вміють відображати стан гри графічно, зчитувати інпут користувача та за допомогою певного 70 | протоколу надсилати дані про хід гравця на сервер, де відбувається валідація ходу, зміна ігрового стану та розсилка всім клієнтам повідомлень про ці зміни. Через неінтенсивнний трафік в такому варианті 71 | можуть використовуватись як кастомні протоколи на TCP\UDP ак і звичайний HTTP. Логіка гри може бути як повністю зосереджена на сервері так і дублюватися на клієнті (наприклад, для валідації ходу) 72 | 73 | ### Завдання 74 | 1. Обрати покрокову гру зі списку: 75 | - Quoridor - найпростіший варіант, бо логіка гри у вас вже реалізована (2 бали); 76 | - "Дурень" (4 бали); 77 | - Нарди, будь-яка варіація гри (4 бали); 78 | - Шахи Фішера (5 балів); 79 | 2. Реалізувати клієнт для цієї гри - як і в першій роботі, віузальна частина не принципова, це може бути як повноцінний графічний клієнт, так і ASCII-арт у командному рядку; 80 | 3. Реалізувати сервер, який будеи відповідальним за з'єднання гравців та ігрову логіку; 81 | 4. Процес має відбуватися наступним чином - клієнт при старті під'єднується до сервера та стає в чергу на очікування. Якщо в черзі вже хтось є, то ці гравці починають гру; 82 | 5. Кожен хід має проходити через сервер, протокол спілкування можна обрати на власний вибір (бінарний + UDP - додатковий бал); 83 | 6. По закінченні гри, клієнт може обрати - завершити виконання або ще раз стати в чергу. 84 | 85 | ### Оцінювання: 86 | - Якість коду - *2 балів* 87 | - Складність гри - *2-5 балів* 88 | - Реалізація мережевої взаємодії - *2 бали* 89 | - Додатковий функціонал - *1 бал* 90 | 91 | ### Матеріали: 92 | - [Лекція з мереж](https://www.youtube.com/watch?v=zwJeefDgOEA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=9) 93 | - [Google Protobuf](https://developers.google.com/protocol-buffers) 94 | - [UDP vs TCP](https://gafferongames.com/post/udp_vs_tcp/) 95 | -------------------------------------------------------------------------------- /2021/overview.md: -------------------------------------------------------------------------------- 1 | ## Лекції 2 | 3 | В цьому році, нас очікує два типи лекцій - записані в минулих роках або нові. Нові лекції не будуть заміняти собою старі, а скоріше розширювати та доповнювати. Всі лекції можна дивитись в онлайні в зручний час - головне не забувати про дедлайни. 4 | 5 | 6 | Майже всі лекції поділені на тематичні блоки. Перегляд лекцій, що містять матеріал, який ви не робите у практичному завданні - обов'язковий, питання будуть винесені у залік. Всі готові лекції доступні у одному [плейлисті](https://www.youtube.com/playlist?list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw), але у порядку у якому вони читались у 2019 році 7 | 8 | 1. [Вступна лекція](https://www.youtube.com/watch?v=rBfT493jhBY&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=2) - дає загальний огляд курсу. Вступну лекцію-2021 також скоро буде викладена. 9 | 2. Блок із лекцій на тему програмування: [SOLID](https://www.youtube.com/watch?v=_YL5SCJr84E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=11), [MVC](https://www.youtube.com/watch?v=6Avtm_qij2E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=12) та [паттерни](https://www.youtube.com/watch?v=j-JtShcib4E&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=13). Лекції знадобляться для виконання першої практичної з дедлайном 3 жовтня. У разі якщо ви відчуваєте необхідність більше заглибитись в тему, в якості додаткового матеріалу можна використовувати лекції з курсу [архітектури ПЗ](https://www.youtube.com/playlist?list=PLkgXLMuasx7CTiy1qy3O6sPolfGDyM2aF) 10 | 3. Блок лекцій на тему АІ: для початку слід згадати [основи математики](https://www.youtube.com/watch?v=NbQoaGOOaYo&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=4), [перша лекція](https://www.youtube.com/watch?v=zlEI6ii28_A&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=5) необхідна для виконання другої практичної роботи, [друга](https://www.youtube.com/watch?v=RKFItb_fPZk&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=6) і [третя](https://www.youtube.com/watch?v=mNOANy_4wCg&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=7) - для третьої\четвертої і контрольної 11 | 4. [Лекція з мереж](https://www.youtube.com/watch?v=zwJeefDgOEA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=10) - необхідна для четвертої практичної. 12 | 5. Блок лекцій на тему комп'ютерної графіки: [основи](https://www.youtube.com/watch?v=-OinemN_LZA&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=8) та [сучасні технології](https://www.youtube.com/watch?v=8VIYf3mYMjE&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=9). 13 | 6. [Лекція з геймдизайну](https://www.youtube.com/watch?v=qj5FO4W8wdU&list=PLkgXLMuasx7C7yMUsaq366htPg9rpM2lw&index=3). 14 | 15 | ## Практичні роботи 16 | 17 | Блок практичних завдань курсу складається з чотирьох обов'язкових завдань: 18 | 19 | 1) [Розробка клієнту для настольної гри Quoridor](../2021/assignment_1.md). 20 | 21 | 2) [Розробка базового штучного інтелекту для гри Quoridor](../2021/assignment_2.md). 22 | Змагання зі штучного інтелекту. 23 | 24 | 3) (та 4) Два проекти на вибір на з запропонованого списку: [мережева гра](../2021/assignment_4.md) та [steering behaviours](../2021/assignment_3.md) 25 | 26 | Порядок виконання та здачі практичної роботи: 27 | 28 | 1. Скласти команду з трьох людей, в цій команді ви будете виконувати всі практичні. Одному (if you're brave enough) або двом виконувати завдання можна, більше ніж втрьох - ні. Одна людина з команди може бути не з числа студентів курсу, більше - ні (крім випадку коли всі члени команди - не студенти курси). Пам'ятайте, що в цьому курсі йде акцент на програмуванні, тому я очікуватиму рівноцінної участі в розробці проектів від усіх членів команди, яка має бути відображена у кількості та обсязі коммітів на гітхабі. "Організаційна" або будь-яка інша роль у команді, що не передбачає написання коду (дизайн, тестування тощо) _не_ оцінюється 29 | 2. Зареєструватиcя в [слаку](https://join.slack.com/t/gamedev-security-21/shared_invite/zt-va9qn4pw-CeERrHcYA7TUrtgGUfh~LA), написати прізвища та групи членів команди у [документі](https://docs.google.com/spreadsheets/d/1QZVQIUm-XzXQvoNtVyMUqxe0r6tf6u1E_WGMzBkZdiY/edit?usp=sharing), створити в слеку приватний канал #team-%teamname%, куди додати всіх членів команди та лектора. 30 | 3. Якщо завдання потребує вибору варіанту - написати в канал, який ви виконуєте варіант. 31 | 4. Весь код завдання має бути розміщено у публічному репозиторії (наприклад, на гітхабі). 32 | 5. Коли ви готові здавати роботу - пишете в канал що робота готова до перевірки. 33 | 6. Якщо по ходу виконання у вас виникають питання, їх можна задавати в приватному каналі, тегнувши лектора, або в спеціальному каналі в слеку - #homework-help. Якщо ви вважаєте, що ваше питання неспецифічне і зможе допомогти чи буде корисним ще якійсь команді - задавайте питання у публічному каналі. 34 | 35 | **Важливо!** Всі завдання розраховані на самостійне виконання. У разі виявлення копіпасти в роботі (з інших робіт або з інтернету) бали за роботу анулюються та команда отримує **штраф в 15 балів** 36 | 37 | По кожному завданню передбачено два дедлайни: _soft_, після якого максимальна оцінка за роботу зменшується вдвічі, та _hard_, після якого бали за роботу не зараховуються взагалі 38 | 39 | |Номер роботи|Максимальна кількість балів|Soft deadline|Hard deadline| 40 | |:----------:|:-------------------------:|-------------|-------------| 41 | |1|12|8(17) жовтня|31 жовтня| 42 | |2|8|4 листопада|14 листопада| 43 | |3|12|14 грудня|21 грудня| 44 | |4|11|27 грудня|-| 45 | 46 | 47 | Після 8 грудня можна виконати або додаткове завдання, або сконцентруватись на змаганні, фінал якого відбудеться наприкінці грудня 48 | 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 introduction-to-gamedev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | У цьому репозиторії зібрані завдання до курсу "Основи ігрової розробки". 2 | 3 | Посилання на всі роботи, дедлайни та лекції - [тут](/2021/overview.md) 4 | -------------------------------------------------------------------------------- /res/Quoridor_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/Quoridor_1.jpg -------------------------------------------------------------------------------- /res/grid_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/grid_example.png -------------------------------------------------------------------------------- /res/quoridor_rules_ru.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/quoridor_rules_ru.pdf -------------------------------------------------------------------------------- /res/quoridor_scheme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/quoridor_scheme.png -------------------------------------------------------------------------------- /res/reversi-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/reversi-start.png -------------------------------------------------------------------------------- /res/track.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/introduction-to-gamedev/assignments/f510b8c0a82d928a7e046be1f8b7654e35b0c517/res/track.png --------------------------------------------------------------------------------