Найти в Дзене
Планета Шелезяка

Вся игра в одном QR-коде. Теперь её можно хранить на обычной бумажке

Как целая игра уместилась в одном QR-коде
Оглавление

Всем привет!

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

Этим и решил заняться один из блоггеров на Youtube (здесь называть его не буду, потому как некоторые начнут возмущаться, что это реклама). Он решил разработать классическую «Змейку», которая могла бы уместиться всего в одном QR-коде и могла запускаться с веб-камеры.

Задача эта не из легких, ведь максимальный размер данных который может хранить самый большой Qr-код «версия 40» (содержит 177х177 пикселей) — всего 2,88 Кбайт. Именно размер и стал главной проблемой и особенностью данной задумки.

В качестве ОС, на которой и должна запускаться игра, была взята Windows. По словам блоггера, игру можно было бы написать и для телефонов, но из-за закрытости мобильных платформ на них намного сложнее заставить работать код, считываемый с QR. Было принято решение получить в конечном итоге Windows Portable Executable (.exe).

Выбор языка для написания игры

Сначала за основу блоггер планировал взять С, но после отказался от этой идеи, так как компиляторы, по его словам, не идеальны.

Простой код, выводящий фразу "Hello World" уже весит под сто килобайт.

И хотя большая часть этого веса не сам код, а библиотеки языка, которые можно отключить, всё равно за основу был взят ассемблер.

-2

Первые трудности

Но и тут возникли свои трудности.

Простая программа, которая запускала пустое окно, уже имела размер 2,5 килобайта.

А после добавления белой точки, перемещающейся по экрану, вес увеличился до 3 килобайт. Не помогала и доп. оптимизация. В конечном счете, умелец решил вернуться к более знакомому ему С.

Дальнейшая разработка

Итак, в первую очередь нужно было правильно настроить компилятор и убрать всё лишнее, чтобы размер игры не превышал злосчастные 2,88 Кбайт.

После этого блоггер принялся за написание кода. Приходилось постоянно следить за размером итогового "продукта". Ведь всего одна строчка могла увеличить вес на сотни байт.

-3

Конечный результат и функционал

В итоге, умелец смог добиться функционала похожего на тот, что был у классической змейки на Nokia.

Однако итоговый код весил 3,1 килобайта, что значительно выше нужного предела. Урезать функционал блоггер не хотел, поэтому он решил прибегнуть к сжатию.

По началу был использовал довольно распространённый упаковщик UPX, но он лишь ухудшил ситуацию, увеличив код до 4,5 килобайт. Затем был найден другой упаковщик — Crinkler, который устанавливается напрямую в компилятор. Благодаря ему размер «Змейки» упал до 1,4 килобайта, а это, на минуточку, в два раза меньше допустимого порога.

Преобразуем результат в QR-код

Осталось лишь сделать так, чтобы игру можно было запустить в Windows и QR-код мог транслироваться в обратно в .exe. Для этого была использована утилита ZBar.

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

И здесь не обошлось без проблем. Пришлось снова править код, чтобы избавиться от ошибки сегментации.

И наконец вот он - готовый результат

Инструкция по запуску

-4