Интересные GitHub-проекты: «змейка» для терминала, работающая на этапе компиляции

C++ Snake

Проект, написанный Мэттом Бирнером, представляет собой новую версию игры «Змейка». Правда, сейчас в неё поиграть удастся прямо в терминале или командной строке.

Проект использует шаблонное метапрограммирование стандарта С++14. Игра доступна в двух версиях — интерактивной, когда игроку необходимо каждый раз перекомпилировать файл с новыми командами, и статичной, когда для игры необходима лишь однократная компиляция всех файлов. Отметим, что игра заканчивается, как и в обычной версии, когда змея упирается в стены игрового поля или своё собственное тело.

Интерактивная версия

Для отображения каждого нового хода необходима перекомпиляция файлов с флагами для контроля процесса игры:

$ clang++ -std=c++1y main.cpp -D COMMAND -o snake ; ./snake

Параметры флага -D управляют движением змейки по игровому полю: UP,DOWN,RIGHT и LEFT. Если флаг не был передан компилятору на исполнение, то змейка продолжит своё движение прямо. Есть возможность вернуться в исходное положение, запустив скрипт ./reset.sh. Для сохранения положения змеи между компиляциями используется подход сериализации данных.

Статичная версия

Весь игровой процесс происходит при однократной компиляции программы. Вся логика игры этой версии находится в главной ветке проекта на GitHub. Все движения змеи строго указаны в главной функции программы:

int main(int argc, const char* argv[])
{
    using inputs = PlayerInput<
        Input::Right, Input::Up, Input::None, Input::Right, Input::Up,
        Input::None, Input::None, Input::Left, Input::None, Input::None,
        Input::None, Input::None, Input::None, Input::Down, Input::None,
        Input::None, Input::None, Input::None, Input::None, Input::None,
        Input::None, Input::Right, Input::Up, Input::Left>;

    using state = InitialState;
    
    using game = play_t<inputs, state>;

    Printer::Print(std::cout);
    
    return 0;
}

Исходный код

Исходный код инструмента можно найти на GitHub. Интерактивная версия находится в соответствующей ветке проекте interactive, статичная версия — в главной ветке. Подробное описание функций программы можно найти в блоге автора, в котором также есть отдельное описание как интерактивной версии, так и статичной.

Игровой процесс

Ниже приведён игровой процесс интерактивной версии игры, при которой пользователь решает, в каком направлении змея должна двигаться, посредством указания параметров флага -D. Для статичной версии всё аналогично, за исключением того, что нужно всего лишь наблюдать за процессом игры, а не участвовать в нём, так как от пользователя требуется лишь компиляция файла для запуска игры.

bash-3.2$ ./reset.sh 
bash-3.2$ clang++ -std=c++1y main.cpp  -o snake ; ./snake
------------------
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺▷*╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -D RIGHT -o snake ; ./snake
------------------
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺*╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺▷▷╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -o snake ; ./snake
------------------
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺*╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺▷▷╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -D UP -o snake ; ./snake
------------------
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺*╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺▷╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -o snake ; ./snake
------------------
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺▷╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -o snake ; ./snake
------------------
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -D RIGHT -o snake ; ./snake
------------------
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△▷╺
╺╺╺╺╺╺╺△╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -o snake ; ./snake
------------------
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△▷▷
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
bash-3.2$ clang++ -std=c++1y main.cpp -o snake ; ./snake
-- You Are Dead --
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△▷█
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺

Вячеслав Шарунов