...

понедельник, 30 декабря 2013 г.

[Из песочницы] Компилируем змейку в браузере

Видели 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).


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий