Компилируем змейку в браузере

в 9:49, , рубрики: linux, Змейка, Компиляторы, консоль, консольные игры, начинающим, эмулятор, метки: , , , , , ,

Видели linux на эмуляторе PC, написанном на javascript?
Если нет — вот небольшой пост о нем.
А вот он сам.

Этот эмулятор — неплохой способ познакомится с консолью linux.
Если у вас есть или была Ubuntu(а это тоже linux), в ней был пользовательский интерфейс, как в Windows, программы и игры устанавливаются при помощи менеджера пакетов.

Ну а что же можно сделать здесь?

Одно из прикладных действий, которое можно выполнить в linux — компилировать программы из исходников.
Если вы когда-нибудь писали программу, вы использовали IDE типа Visual Studio или CodeBlocks, но в данном случае, очевидно, никакой IDE нет.
Но можно скомпилировать код из консоли, используя программу gcc, которая очень кстати имеется в образе системы.

Всего-то надо написать в консоли: gcc hello.c и нажать [ENTER]
Здесь hello.c — имя файла, вернее путь к нему, но сейчас мы пишем только имя, так как hello.c находится в текущей папке.
Да, в консоли у нас есть текущая папка, ее путь написан слева от # или $
(# — значит мы работаем под root с неограниченными правами; $ — под обычным пользователем).
Перемещаемся по папкам используя cd %имя папки% или cd .., чтоб подняться на папку выше в иерархии, а также ls, чтобы вывести список файлов и папок в текущей папке:

image

Ну так вот, мы скомандовали gcc hello.c и ждем:
(hello.c был заранее положен автором в образ системы, для тестирования)
image

Я ждал минуту или две, но программа все же скомпилировалась.
gcc создал файл a.out(название по умолчанию), это готовый бинарник, так давайте запустим:
Если просто написать название программы, интерпретатор командной строки скажет, что не нашел такого файла,
потому что в таком случае он ищет не в текущей папке, а в /usr/bin например и в других местах, где лежат программы типа cd, ls, gcc.
Потому пишем ./a.out: (./ — означает текущую папку)
image

Видим Hello, World на экране, значит все работает. Но целую минуту на helloworld это долго! Нельзя ли побыстрее?
Есть простое решение: вместо компилятора gcc использовать tcc — все то же самое, только вместо gcc hello.c надо написать tcc hello.c

Попробуем скомпилировать что-нибудь посложнее!
Правда, мы можем запустить только консольное приложение, так что возьмем исходники консольной змейки nsnake.
В архиве лежит папка src, в ней как раз то, что нам нужно.
Но вот вопрос: как же эти файлы перекинуть в наш эмулятор?
На этот вопрос есть ответ в FAQ по эмулятору:
Надо использовать буфер обмена — область для вставки текста справа и команду(программу) cat < и > — это перенаправление потоков ввода и вывода соответственно для команды cat: cat < /dev/clipboard > main.c
Еще нужно создать папку для игры и папку src(командой mkdir src), в которую скопируем исходники.
В итоге этот процесс выглядит так:

image

При помощи стрелочек вверх/вниз можно перемещаться по истории введенных команд. Так, чтобы не вводить каждый раз команду, можно показать предыдущую, используя стрелочку вверх и отредактировать.

Исходники на месте, теперь их надо откомпилировать, и тогда мы поиграем.
Но не так все просто, попытка скомпилировать любой из файлов приведет к ошибке:
image

Дело в том, что компиляция всего проекта иногда очень сложна и длительна, нужно дописывать опции компилятору и линкеру, чтобы компилировать файлы по отдельности, а потом собирать объектные файлы вместе, использовать внешние библиотеки, а ведь программа еще содержит документацию и еще…
Чтобы вы об этом не думали, когда собираете программу из исходников, пишется Makefile — в нем как раз прописано что как компилировать и прочее.
Короче нужно его скопировать в папку с игрой на эмуляторе.
Также, надо создать папки bin, obj, и doc, как в папке с игрой, которая у вас на компьютере.
Введите make — программа, которая обработает Makefile и скомпилирует все согласно ему.
image

В общем мне надоело ждать и я нажал CTRL+C, чтобы завершить процесс. Почему так долго?
Потому что в Makefile написано, что надо компилировать при помощи gcc, а этого нам не надо, мы хотим быстрее, используя tcc.
Так что находим в Makefile такую строчку и заменяем gcc на tcc:
image
Удаляем старый Makefile, копируем новый и заново make:
image

Гораздо быстрее. Здорово! написано, что уже можно играть!
Обратите внимание, что компилировались только те файлы, которые в прошлый раз недокомпилировал gcc.
Потому что файлы компилировались по отдельности, и на каждый C-файл создавался свой .OBJ файл в папке obj, а потом они собрались в
исполняемый файл в папке bin.

Запускаем (bin/nsnake), экран очищается и…

image

Как это! Мы же видели, что файлы были выведены разными цветами!
Ну и ладно, поиграем в змейку и без цветов.
В исходном коде змейки есть какая-то строчка, которая выводит сообщение об ошибке на экран и, что самое главное, прерывает работу программы.
Если удалить ее, игра возможно упадет, так как упадет функция, которая управляет цветом символов терминала.
А может просто будет работать хоть как-то.
Код находится в файле engine.c на 243 строчке:

Компилируем змейку в браузере

Пишем по две косых черты перед каждой из двух строчек — теперь код неактивен, иначе говоря закомментирован.
Заново создаем engine.c и пересобираем программу:

Компилируем змейку в браузере

Теперь змейка запускается и мы видим меню игры. Ура!
Компилируем змейку в браузере

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

Играть можно при помощи WASD.

Компилируем змейку в браузере

PS: для полной установки игры требуется скопировать документацию и выполнить make install, но здесь возникнут проблемы.
Не рассмотрена еще такая возможность: если уже есть исполняемый файл игры, его можно перенести в эмулятор при помощи uuencode и uudecode (об этом также написано в FAQ).

Автор: kurkulenok

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js