Змейка на PDCurses С++
Змейка — это классическая игра, в которой вы управляете змейкой. Она ползает по экрану и собирает еду, становясь длиннее. Цель игры - не попасться на свой собственный хвост и не удариться об стену. Чем длиннее змейка, тем сложнее управлять ей.
Игра очень проста в управлении. Вы используете клавиши со стрелками на клавиатуре, чтобы изменить направление движения змейки. Если змея съест еду, то становится длиннее и вы зарабатываете очки. Если змея столкнется со своим хвостом или ударится об стену, игра закончится.
Змейка всегда останется популярной игрой из-за своей простоты и увлекательности. Она является ретро-классикой, в которую играют на компьютере, телефоне или планшете.
Создаём проект С++ и подключаем библиотеку PDCurses.
При создании проекта в Visual Studio 2022 выбираем шаблон С++ консольные приложения.
Даём название проекту, устанавливаем галочку, поместить решение и проект в одном каталоге и создаём проект.
Загружаем библиотеку PDCurses c github на любую операционную систему или под Windows Visual Studio с нашего телеграмм канала.
Копируем библиотеку в папку с проектом и подключаем.
Открываем папку в проводнике и копируем библиотеку.
Подключаем библиотеку PDCurses к проекту
В дополнительный каталог включаемых файлов указываем расположение заголовочных фалов библиотеки, в нашем варианте папку с проектом.
В дополнительных каталогах библиотек указываем расположения файла pdcurses.lib, в нашем случае корневая папка проекта.
В дополнительные зависимости записываем файл pdcurses.lib.
Нажимаем кнопку применить, тем самым сохраняем внесённые изменения в свойства проекта.
После того как мы удачно подключили библиотеку PDCurses, мы можем начинать писать код.
В начале программы подключаем необходимые заголовочные файлы:
сhrono, random (обеспечивают работу генератора случайных чисел), vector (динамический массив для сохранения координат хвоста змейки), string (с помощью функции to_string () конвертируем значение целочисленной переменной в строковое представление), curses (предназначенная для управления вводом-выводом на терминал, позволяет задавать экранные координаты и цвет выводимых символов).
Cообщаем компилятору, что мы хотим использовать всё, что находится в пространстве имен std и std::chrono.
Объявляем и инициализируем глобальную переменную game_exit, которая будет определять завершение программы.
Создаём структуру vector2di, для хранения координат по оси икс и игрек.
Функция main() :
В начале функции определяем и инициализируем переменные, включаем и настраиваем терминал curses.
Функция initscr() определяет тип терминала и инициализирует все структуры данных реализации, также вызывает операцию обновления для очистки экрана. Данная функция вызывается только один раз.
Функция curs_set () устанавливает внешний вид курсора на основе значения видимости :
В нашем коде устанавливаем значение ноль и делаем курсор невидимым.
Функция start_color() – инициализирует использование цветов на терминале.
Процедура init_pair() задаёт определение пары цветов. Она принимает три аргумента: номер пары, номер цвета переднего плана и номер цвета фона.
Константы цветов:
Функция bkgd () устанавливает цвета для текущего терминала.
При создании генератора случайных чисел обязательно должны быть подключены соответствующие заголовочные файлы. Создаём целочисленную переменную seed и записываем в неё момент времени. Передаём момент времени в генератор случайных чисел объект rnd. Генерируем случайные числа координат яблока в установленном диапазоне по иксу apple_x(10, 97) и по игреку apple_y(5, 22).
В параметрах функции keypad() разрешаем использовать специальные клавиши, в нашем случае стрелки, указав значение true.
Функция noecho() отключает отображение в терминале нажатых клавиш.
Игровой цикл while будет работать пока игра не завершится.
В цикле присваиваем случайные значения переменным rnd_apple.x, rnd_apple.y. Рисуем игровое поле используя функцию show_map() и перемещаем по игровому полю змейку через функцию move_snake().
В параметрах функции timeout() устанавливаем время задержки кадров в миллисекундах.
Создаём переключатель обработки нажатых клавиш через функцию getch(). При нажатии стрелок меняем вектор направления движения змейки и время обновления кадра. При нажатии клавиши < q >, выходим из игры.
Функция endwin() останавливает работу терминала curses.
Функция show_map():
В параметрах функции передаём ссылку на координаты яблока apple и ссылку на количество подобранных яблок eaten_apples.
Функция clear() очищает экран, удаляя весь текст.
Функция move(), перемещает курсор в координаты заданные в параметрах по игреку 2, а по иксу 55.
Функция attrset(), задаём тип и цвет отображения символов.
Возможные параметры функции attrset():
Функция printw() выводит текст в консоль.
Функция to_string() приводит значение целочисленной переменной eaten_apples в строковой тип для вывода её значения в консоль.
С помощью циклов for() и символа « * » рисуем границы игрового поля, далее отображаем символ « @ » обозначающий яблоко.
Определяем функцию перемещения змейки move_snake():
В параметрах функции передаём ссылки на: координаты головы змейки snake_head, шаг и вектор перемещения змейки vector_step, динамический массив координат хвоста snake_tail, координаты яблока apple, случайные координаты яблока rnd, количество собранных яблок eaten_apples.
Более подробную инструкцию вы можете получить, посмотрев видео « Игра на С++ Змейка »