Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Интерактивная игра на bash: «Арканоид»

После шахмат, где я решал проблему опроса клавиатуры, мне захотелось попробовать сделать что-то ещё более интерактивное. В шахматах нет никаких фоновых процессов, единственное действующее лицо в игре — сам человек. Хотелось сделать что-то, где в фоне к опросу клавиатуры происходит ещё что-то. Проблема в том, что bash поддерживает только блокирующий вводу.

Забегая вперёд, скажу, что проблему решить вполне удалось. Я разделил игру на два процесса, один из которых опрашивает клавиатуру и сообщает о нажатии второму при помощи сигналов — USR1, USR2 и HUP, как раз три сигнала по трём управляющим клавишам — „←“, „→“ и «пробел». Последняя нужна, чтобы пускать шарик.

Решил сделать «Арканоид», не совсем классическую версию (на неё мне ещё бы пара вечеров потребовалась), но близкую. В игре есть три типа блоков разных цветов — вишнёвый разбивается сразу, синий при первом ударе превращается в вишнёвый, а от зелёного (самое интересное!) при ударе иногда отваливается часть, поймав которую, можно получить приятный бонус — более широкую ракетку, дополнительную жизнь или липкость. Последнее означает, что шарик в этом режиме не отскакивает от ракетки, а прилипает.

Арканоид (49.62КиБ)

Ещё одна фишка игры — звуковое оформление, которое нечасто услышишь в консоли, я думаю. Правда, только для «Мака» (сделано командой «say», я заставляю её проговаривать буквы с большой скоростью), знаю, что для Линукса тоже есть команды для синтезатора речи («espeak», например), но мне негде их попробовать.

В игре пять жизней и пять уровней, кстати второй посвящён моей любимой жене, большой любительнице кошек (этот уровень как раз на скриншоте). Я сделал щадящую скорость полёта шарика, так что игру можно пройти даже без потерь, если хорошо потренироваться. Код, как водится, выложен на «Гитхаб».

От терминала, как и в шахматах, требуется уметь отображать 256 цветов и хорошая поддержка «Юникода». Нигде, кроме как под «Мак» игру я не тестировал, по-прежнему рекомендую iTerm2 в качестве терминала.

Я записал небольшое видео игрового процесса. Я попробовал две программы для записи видео с экрана — «Скрини» и «КвикТайм», к сожалению обе нагружают процессор так, что игра начинает тормозить.

Видео выложил на «Яндекс.Видео». Добавлено позднее: сервис «Яндекс.Видео» прекратил своё существование.

13 комментариев
Мохов Олег (o-mokhov.ya.ru) 2011

./arcanoid.sh: line 65: `CreateСarriage’: not a valid identifier

я что-то не так делаю? :)

Евгений Степанищев (bolknote.ru) 2011

Комментарий для o-mokhov.ya.ru:

Спасибо, поправил! Запускаться через bash должно.

Михаил 2011

Круто! Евгений, я поражаюсь вашей производительности, сколько времени вы потратили на написание?
Я помню, писал арканоид на флеше, который гораздо более приспособлен для создание игр, и то у меня ушло несколько полных дней.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для Михаил:

Я занимался в субботу и воскресенье, когда выдавалась минутка свободная — всё-таки в выходные много домашних дел нужно сделать. Так что несколько часов, наверное.

Gray (gray7400.ya.ru) 2011

Тормозит, причем в Терминале больше, чем на iTerm. Но прикольно.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для gray7400.ya.ru:

У меня в iTerm2 (не в iTerm) тормозит меньше, чем в «Терминале», причём в iTerm2 тормоза почти не ощущаются.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для gray7400.ya.ru:

причем в Терминале больше, чем на iTerm

У меня в «Терминале» тормозит так, что играть невозможно.

ninjacolumbo (ninjacolumbo.ya.ru) 2011

Женя, вот ты псих, а!

Андрей Малахов (andrew-malakhov.moikrug.ru) 2011

Нереально круто !

Евгений Степанищев (bolknote.ru) 2011

Комментарий для ninjacolumbo.ya.ru:

Женя, вот ты псих, а!

:-D давненько не слышал этой фразы вживую

malinnikov (malinnikov.livejournal.com) 2011

Это круто, я считаю.

bealex (bealex.livejournal.com) 2015

«Ролик недоступен», говорит. :(

Евгений Степанищев (bolknote.ru) 2015

Комментарий для bealex.livejournal.com:

Странно, у меня не говорит. А ты поиграй просто, у тебя же «Мак» или нет? :)