1 of 10

Cars From Childhood

Євдокименко Владислав Янович

Група ІТШІ-24-1

Харківський національний

університет радіоелектроніки

Консольна аркада

2 of 10

Ідея та мета проєкту

Ідея проєкту:

  • Створити класичну аркадну гонку, яка працює безпосередньо у текстовому терміналі.
  • Відтворити ігровий досвід ретро-консолей (наприклад, Brick Game) виключно за допомогою символьної графіки.

Головна мета:

  • На практиці застосувати базові структури даних (записи, багатовимірні масиви) для керування ігровими об’єктами.
  • Реалізувати власний ігровий цикл, який включає обробку натискань, логіку зіткнень та відмальовування.
  • Довести можливість створення динамічної гри без використання готових графічних рушіїв (Unity, Unreal тощо) та сторонніх бібліотек.

3 of 10

Чому саме консоль?

  • Відмова від «чорних скриньок»: сучасні ігрові рушії (Unity, Unreal Engine) автоматизують більшість процесів, ховаючи базові алгоритми рендерингу та фізики «під капотом».
  • Низькорівневий контроль: розробка для термінала вимагає ручного керування координатами екрана, це змушує самостійно писати математичні моделі для руху об'єктів та прорахунку зіткнень (колізій).
  • Абсолютна незалежність (zero-dependency): головна перевага проєкту – гра максимально легковагова, завдяки цьому вона не потребує встановлення важких графічних бібліотек (OpenGL, DirectX) і миттєво запускається на будь-якій системі з підтримкою базового термінала.

4 of 10

Архітектура даних

  • Інкапсуляція стану: усі динамічні об'єкти в грі побудовані на основі записів (record). Це об'єднує просторові координати та зовнішній вигляд об'єкта в єдину структуру для зручного керування.

  • Матрична геометрія: Габарити кожної машини описуються двовимірним масивом символів розміром 3×3 (array [1..CarSize, 1..CarSize] of char). Такий підхід робить код гнучким: зміна «вигляду» машини (її коліс, бампера чи кузова) відбувається простою заміною символів у матриці без переписування логіки малювання

5 of 10

Головний ігровий цикл

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

  1. Зчитування (Input): асинхронне перехоплення натискань клавіатури за допомогою власного модуля getarow. Використання KeyPressed дозволяє грі не зависати в очікуванні команди гравця.
  2. Оновлення стану (Update): математичний перерахунок координат автомобіля гравця та зустрічного трафіку. Генерація нових перешкод та перевірка умов зіткнення (колізій).
  3. Відмальовування (Render): оновлення графіки на екрані відповідно до нових координат та синхронізація кадрової частоти (FPS) за допомогою функції затримки Delay.

6 of 10

Оптимізація рендерингу

Проблема стандартного підходу:

  • Повне очищення термінала (через виклик clrscr) перед кожним новим кадром викликає сильне мерехтіння (флікерінг). Це перевантажує потік виведення непотрібним малюванням порожнього простору.

Рішення: точкове перемальовування:

  • Замість оновлення всього екрана алгоритм працює лише зі зміненими координатами.
  • Програма «затирає» машину (виводить пробіли) на її старих координатах і одразу малює об'єкт на нових.
  • Усі статичні елементи (межі траси) залишаються недоторканими в пам’яті екрана.

Результат: плавний рух об’єктів без візуальних артефактів навіть на найвищих швидкостях гри.

7 of 10

Динамічна генерація трафіку

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

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

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

8 of 10

Логіка зіткнень

  • Власний обробник перевірок: розроблено незалежну функцію OwnCarIsSmash, яка на кожній ітерації ігрового циклу перевіряє статус гравця відносно масиву ворогів.
  • Метод Bounding Box (AABB): алгоритм порівнює поточні координати «коробки» гравця з «коробками» зустрічних машин.
  • Перевірка відбувається за осями координат: якщо осі X збігаються, а по осі Y відбувається перетин габаритів (з урахуванням розміру машини у 3 символи), фіксується зіткнення.
  • Реєстрація аварії: при виявленні перетину (колізії) ігровий цикл негайно переривається, об’єкт гравця підсвічується червоним кольором (через textcolor), і виводиться фінальна статистика.

9 of 10

Динамічна складність та ігрова прогресія

  • Система адаптивного навантаження: для уникнення монотонності геймплею реалізовано алгоритм поступового збільшення складності, що утримує увагу гравця.
  • Математична імітація трансмісії: програма автоматично відстежує кількість ігрових тактів. Після проходження певного порогу базова затримка кадру (TimeSpeed) програмно зменшується. Це фізично прискорює рух об’єктів на екрані, імітуючи перемикання передач автомобіля.
  • Телеметрія в реальному часі: на екран без затримок виводиться ігрова статистика: пройдена дистанція (у метрах), поточна швидкість (км/год) та активна передача, що додає грі змагального елементу.

10 of 10

Підсумки та результати проєкту

  • Досягнення мети: успішно розроблено повноцінну та стабільну аркадну гру мовою Pascal, що працює виключно засобами системного термінала.
  • Технічна цінність: проєкт на практиці доводить ефективність базових алгоритмів: від матричної генерації об'єктів та обробки колізій (Bounding Box) до низькорівневої оптимізації виведення графіки.
  • Практичне застосування: отриманий легковаговий ігровий код є ідеальною (zero-dependency) навчальною базою для студентів. Він дозволяє наочно вивчати архітектуру game loop, роботу з пам’яттю екрана та базову ігрову фізику.