Напишите небольшую terminal-based игру, то есть такую, которая использует возможности терминала (консоли) вместо графической системы. На выбор предлагаются следующие жанры и примеры (но вы ими не ограничены):
- Фиксированный шутер наподобие Space Invaders.
- Скролл-шутер (вертикальный или горизонтальный), пример: Gradius.
- Лабиринт, пример: Pac-Man, Bomberman, "Танчики".
- Ваш вариант.
Вы можете реализовать любую игру, удовлетворяющую следующим условиям:
- Есть управляемый игроком персонаж и другие объекты, с которыми он взаимодействует (враги, стены, пули, и т.д.).
- Игра в реальном времени: даже если игрок ничего не делает, на экране что-то происходит (летят пули, двигаются враги, и т.д.).
- Есть система подсчета очков: количество убитых врагов, собранных предметов и т.д.
- Должно быть условие окончания игры (проигрыша и/или выигрыша), например столкновение с врагом, уменьшение здоровья до 0, сбор всех предметов на экране, и т.д.
Технические условия:
- Достаточно самой схематичной "графики". Например, игрок - это один символ, враги - другой символ, пули - точки, и т.д.
- Код игры должен быть разделен на классы, каждый из которых выполняет четко определенные задачи. Отдельные функции допускаются, но основная логика работы должна содержаться в классах.
- Должно быть как минимум 3 различных игровых объекта (например, "игрок", "враг", "пуля").
- Все игровые объекты должны быть собраны в одну иерархию классов с единым корнем.
- Важно! Поведение игровых объектов должно быть инкапсулировано в их классах. Игровой движок должен единообразно работать со всеми объектами. Избегайте явных проверок на тип объекта и раздельного хранения объектов в зависимости от типа. Вместо этого разное поведение разных объектов должно реализовываться средствами ООП. Основной игровой цикл должен выглядеть примерно так:
for (GameObject& object : gameObjects) {
// Поведение объекта полностью инкапсулировано в его классе.
// В движке мы не обрабатываем объекты особенным образом.
// Мы просто у каждого объекта вызываем некий общий метод, передав ему некий контекст.
object.act(context);
}
Стандартных возможностей С++ недостаточно для гибкого управления терминалом. Вы можете воспользоваться системными вызовами, библиотеками ncurses/pdcurses, или другими средствами. Пример инициализации и использования PDcurses доступен здесь.
Если у вас есть желание и уверенность в себе, вместо консольного интерфейса можете сделать графический. "Графика" при этом может быть такой же схематичной - прямоугольники, круги и т.д. Вариант с графическим UI будет сложнее, поэтому правильно рассчитайте свои силы.
Дополнительные возможности, предлагаемые для реализации тем, кто сделает основное:
- Ведение таблицы рекордов (по очкам), возможность её просмотра из игры.
- Сохранение и загрузка игры.
- Более продвинутая графика: элементы псевдографики, игровые объекты - уже не один символ, а набор символов, и т.д.
- Анимация.
- Более продвинутый искусственный интеллект врагов.
- Звуки и/или музыка.
- Ваши идеи?