Skip to content

Latest commit

 

History

History
50 lines (37 loc) · 5.72 KB

Task 3 - Terminal-Based Game.md

File metadata and controls

50 lines (37 loc) · 5.72 KB

Задача 3. Terminal-Based Game

Напишите небольшую terminal-based игру, то есть такую, которая использует возможности терминала (консоли) вместо графической системы. На выбор предлагаются следующие жанры и примеры (но вы ими не ограничены):

  1. Фиксированный шутер наподобие Space Invaders.
  2. Скролл-шутер (вертикальный или горизонтальный), пример: Gradius.
  3. Лабиринт, пример: Pac-Man, Bomberman, "Танчики".
  4. Ваш вариант.

Вы можете реализовать любую игру, удовлетворяющую следующим условиям:

  1. Есть управляемый игроком персонаж и другие объекты, с которыми он взаимодействует (враги, стены, пули, и т.д.).
  2. Игра в реальном времени: даже если игрок ничего не делает, на экране что-то происходит (летят пули, двигаются враги, и т.д.).
  3. Есть система подсчета очков: количество убитых врагов, собранных предметов и т.д.
  4. Должно быть условие окончания игры (проигрыша и/или выигрыша), например столкновение с врагом, уменьшение здоровья до 0, сбор всех предметов на экране, и т.д.

Технические условия:

  1. Достаточно самой схематичной "графики". Например, игрок - это один символ, враги - другой символ, пули - точки, и т.д.
  2. Код игры должен быть разделен на классы, каждый из которых выполняет четко определенные задачи. Отдельные функции допускаются, но основная логика работы должна содержаться в классах.
  3. Должно быть как минимум 3 различных игровых объекта (например, "игрок", "враг", "пуля").
  4. Все игровые объекты должны быть собраны в одну иерархию классов с единым корнем.
  5. Важно! Поведение игровых объектов должно быть инкапсулировано в их классах. Игровой движок должен единообразно работать со всеми объектами. Избегайте явных проверок на тип объекта и раздельного хранения объектов в зависимости от типа. Вместо этого разное поведение разных объектов должно реализовываться средствами ООП. Основной игровой цикл должен выглядеть примерно так:
for (GameObject& object : gameObjects) {
    // Поведение объекта полностью инкапсулировано в его классе.
    // В движке мы не обрабатываем объекты особенным образом. 
    // Мы просто у каждого объекта вызываем некий общий метод, передав ему некий контекст.
    object.act(context);
}

Стандартных возможностей С++ недостаточно для гибкого управления терминалом. Вы можете воспользоваться системными вызовами, библиотеками ncurses/pdcurses, или другими средствами. Пример инициализации и использования PDcurses доступен здесь.

Альтернативный UI

Если у вас есть желание и уверенность в себе, вместо консольного интерфейса можете сделать графический. "Графика" при этом может быть такой же схематичной - прямоугольники, круги и т.д. Вариант с графическим UI будет сложнее, поэтому правильно рассчитайте свои силы.

Дополнительно

Дополнительные возможности, предлагаемые для реализации тем, кто сделает основное:

  1. Ведение таблицы рекордов (по очкам), возможность её просмотра из игры.
  2. Сохранение и загрузка игры.
  3. Более продвинутая графика: элементы псевдографики, игровые объекты - уже не один символ, а набор символов, и т.д.
  4. Анимация.
  5. Более продвинутый искусственный интеллект врагов.
  6. Звуки и/или музыка.
  7. Ваши идеи?