Проект, написанный Мэттом Бирнером, представляет собой новую версию игры «Змейка». Правда, сейчас в неё поиграть удастся прямо в терминале или командной строке.
Проект использует шаблонное метапрограммирование стандарта С++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 --
╺*╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺△▷█
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺
╺╺╺╺╺╺╺╺╺╺