игра «виселица»

Играли вчера с дочкой в «Виселицу»…

Играли вчера с дочкой в «Виселицу» на бумаге — научилась, пока участвовала в её реализации под «Флиппер». Слова она, конечно, пока загадывает с ошибками, отгадывать сложно. Опять спрашивала почему пишется именно так.

Я как-то уже читал ей лекцию по поводу того почему в русском пишется не так как слышится, но судя по тому, что мы время от времени снова возвращаемся к этой теме, неубедительно.

Маленькая девочка с кудрявыми светлыми волосами в жёлтой футболке и жёлтых сапогах сидит на вершине большой стога сена на фоне ясного голубого неба.
Дочка на стоге сена на Казанском ипподроме

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

Ещё из из игр на бумаге дочке нравится «Морской бой». Как-то пробовал увлечь её «танчиками», мне в детстве очень нравилось, но ей не зашло. А вроде мы ни во что больше в школе и не играли, или я не помню.

2 комментария

«Виселица» в магазине приложений

Я долго не знал как выглядит наша с дочкой игра «Виселица» в магазине приложений «Флиппера Зеро» — смартфон-то у меня «Хуавей», а под него нужного приложения нет.

А на днях вспомнил, что походный-то смартфон у меня с обычным «Андроидом»! В общем посмотрел, даже скриншот снял на память. Надо бы, кстати, выпустить новую версию — у меня там есть досадная опечатка в английской локализации — loose, вместо lose.

Скриншот страницы приложения Hangman для Flipper: версия 1.4, размер 92,11 КБ, кнопка INSTALL, описание игры и changelog — добавлены испанский и татарский языки, исправлены ошибки.

Честно сказать, необходимость постоянно использовать какие-то дополнительные приседания, чтобы поставить часть приложений на «Хуавей» меня сильно утомила. Думал, что смогу с этим жить, но нет. Продержался более трёх лет, но сил моих больше нет. Кажется буду переходить. Вот только на что ещё не решил.

20 комментариев

Татарские символы в «Виселице»

Вчера вечером ковырял формат BDF — это формат шрифтов для «Флиппера Зеро». Как я писал была идея добавить в шрифт 6×13 татарские символы, которые там отсутствуют. BDF это текстовый формат, так что это было не слишком сложно.

Символы Ә, Ө и Ү, как и планировал, наскрёб в других шрифтах — поставил «шва», русскую «фиту» и латинскую «уай», просто скопировав пискельные данные букв и изменив метаинформацию. А вот Җ, Ң и Һ пришлось рисовать.

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

Интерфейс FontEdit с пиксельным редактором шрифта Monaco 9pt: сетка для рисования, панель символов (включая выделенный символ '/'), информация о размере и количестве глифов.
Я рисую букву Һ (она не на своём месте по кодам, мне это не принципиально)

Пришлось записывать пиксели единицами и нулями, переводить в десятичный вид и руками вписывать в шрифт. Неудобно, но искать подходящий редактор ради трёх букв было бы дольше.

В итоге, я оформил это в виде скрипта, который патчит шрифт, добавляя в него нужные буквы. А то мало ли — вдруг ещё как-нибудь придётся его пересобирать.

Видимо я ещё немного упрощу это место, — после внимательного чтения описания формата в голову пришли кое-какие идеи.

4 комментария

«Дар агачы»

Давно появилась идея прикрутить к моей игре «Виселица» под «Флиппер Зеро» татарский язык. Я всё-таки в Татарстане живу, так что идея выглядит логичной. В выходные делал подготовительные работы в коде — в татарском довольно большой алфавит, я смотрел как всё помещается, немного переделывал меню выбора языков, плюс смотрел есть ли в шрифтах нужные буквы.

Вчера из Института прикладной семиотики АН РТ прислали словарь татарских существительных. Я убрал из него все русские слова (в татарском немало заимствований из русского) и попробовал поиграть.

К сожалению, возникла проблема. В игре я использую два шрифта — 6×12 с нормальным начертанием и 6×13 с жирным. Шрифты готовые, взяты из фреймворка U∞g², я их только переупаковываю, чтобы в них оказались только те буквы, которые я использую в игре.

Оказалось в шрифте 6×13 нет татарских букв! Я этот момент проморгал, думал разница только в размерах. Клавиатуру я печатаю 6×12, поэтому проблему увидел только когда стал выводить татарские слова из словаря (там единственное место, где используется 6×13).

Таблица символов шрифта с латиницей, кириллицей, греческими буквами, цифрами, знаками препинания и диакритическими знаками на чёрном фоне; некоторые символы выделены жёлтым кругом.
Шрифт 6x13B.bdf полностью, выделены буквы, похожие на недостающие татарские

Попробовал посмотреть какие буквы есть в шрифте, чтобы подобрать похожие. Это несложно сделать в командной строке:

awk '/^ENCODING/{print $2}' 6x13B.bdf | xargs -n1 printf '%x\n' |
while read -r line; do printf "\\u$line "; done

Из того что есть нашлись замены для Ә, Ө и Ү, а вот для Җ, Ң и Һ похожих букв не обнаружилось.

Мысли у меня пока две: либо нарисовать недостающие буквы и научиться их добавлять в шрифт, либо обнаруживать ситуацию, когда нужных букв нет в шрифте 6×13 и переключаться на 6×12. Возможно в виде быстрого исправления я выберу второй вариант, а потом попробую реализовать первый.

5 комментариев

«Ahorcado»

Что-то пока мне очень нравится возиться с «Флиппером Зеро» в плане программирования. Руки так и чешутся что-нибудь поделать. В качестве развлечения решил добавить в свою игру для «Флиппера» «Виселица» поддержку испанского, всё-таки второй по распространённости язык в мире, после китайского.

Портативное устройство с оранжевым корпусом и экраном, на котором отображается меню выбора языка: English, Русский, Español.
Конечный результат — английский, русский и испанский

Загвоздка в том, что у меня в игре основной шрифт кириллический — я взял готовый шрифт из прошивки, а в этом шрифте нет «ñ» и других необходимых в испанском символов. Лучшее решение, которое мне пришло тогда в голову, — смотреть что за символ мы сейчас выводим и переключать шрифты, если в текущем нет нужного символа.

Посидел вечерок, всё неплохо заработало. Но когда рассказывал о своём решении братишке, он спросил меня почему я не попытался сделать свой шрифт, где есть все нужные мне символы. Такая мысль приходила мне в голову, но Си я знаю, а как создать свой шрифт для «Флиппера» — нет.

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

Оказалось, это совсем несложно — во фреймворке U∞g2 есть исходники тех же шрифтов, которые использует «Флиппер», и утилита bdfconv, которая умеет их пересобирать. А на специальной странице можно сгенерировать себе необходимую для сборки командную строку.

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

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

«Виселица»: правлю баги

Игрушка «Виселица» для «Флиппера Зеро», которую мы как-то написали с дочкой, давно перешла из стадии весёлой разработки в стадию унылой поддержки — пользователи потихоньку находят баги, я правлю. Не самая моя любимая стадия, но один баг повеселил.

Один из пользователей пожаловался, что слова с русской буквой «Р» отображаются иногда как-то неадекватно — крайние буквы как будто «срезаются». Выкинув из словаря всё, кроме слов, начинающихся или кончающихся на эту букву, я и сам убедился в наличии этого странного эффекта.

Проблема оказалось в сочетании того как я кодирую символы русских слов и следующей строки кода:

furi_string_trim(line);

Для экономии места и производительности словарь у меня хранится в кодировке UCS-2 с выкинутыми кодами 0x04, из-за чего русская буква «Р» (с кодом 0x0420) записывается как 0x20, а это код пробела.

Вызов furi_string_trim мне нужен, чтобы срезать перевод строки, после её считывания. Только я не учёл, что срезаются там все пробельные символы, включая урезанную до одного байта букву «Р».

В общем, создал себе проблем на ровном месте. Надо было хранить буквы как есть и не выпендриваться. Впрочем, баг правится просто:

furi_string_trim(line, "\n");

6 комментариев

«Виселица» в каталоге программ

Нашу с дочкой игру для «Флиппера Зеро» «Виселица» включили сегодня в каталог программ для этого устройства. А ещё она есть в одной из альтернативных прошивок — от разработчика с ником RogueMaster!

Кстати, я думаю, что Ева является самым молодым соавтором игры для «Флиппера» в мире.

Скриншот страницы коммитов в Git: заголовок «Commits», ветка main, дата 7 ноября 2023, коммит «Hangman game (#174)» от bolknote 4 часа назад, статус Verified, хеш de3ef60.
Сегодня приняли нашу с дочкой игру в каталог программ «Флиппера Зеро»

2 комментария

Пилю «Виселицу»

Не то, чтобы я не понимал, что сообщество владельцев «Флиппера» относительно небольшое, всё же это очень специфический инструмент, но всё же не ожидал, что написанная за выходные игрушка удостоится такого внимания.

Только выложил её на «Гитхаб», как мне написал автор одной из популярных альтернативных прошивок, прислал патч, исправляющий некую ошибку и попросил английскую версию, — хочет включить игру в свою прошивку.

Оранжевый портативный терминал с экраном, на котором отображается игра «Виселица» на русском языке: слово «АГА» и алфавит с отмеченными буквами.
Вчера для «Флиппера» пришёл чехол из Китая, выглядит — супер!

Доброе слово и кошке приятно, поэтому вот уже несколько дней пилю поддержку других языков.

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

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

Скриншот терминала с кодом russian.bolk, содержащим числа, шестнадцатеричные значения и сообщения «Окей», «Вы выиграли!», «Вы проиграли!
Файл описания языка, пример для русского

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

Если открыть словарь для английского языка обычным текстовым редактором, то внутри будет текст, с русским такой номер не пройдёт. Объясню почему.

Когда я только начал программировать игру, начал я с упаковки русского словаря в программный код и генерации случайного слова. Оказалось, что быстро выбрать случайное слово не так-то просто. Первый вариант работал очень медленно, поэтому я сделал оптимизации, которые мне помогли достичь комфортной скорости.

Во-первых, я перешёл на другой генератор — встроенный вызов furi_hal_random_get() вместо обычного для Си random(). Друг, который в прошлом имел дело с микроконтроллёрами, сказал, что как правило лучше использовать то, что предлагает фреймворк — так быстрее.

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

В-третьих, почти в два раза сократил файл словаря. Любая русская буква занимает в распространённых юникодных кодировках два байта, но второй байт всегда одинаковый, его можно выкинуть. Если посмотреть на ряд, описывающий клавиши в моём файле, видно, что первая четвёрка всё время повторяется. То есть из кода русской буквы А — 0x0410 можно убрать 0x04 и оставить только 0x10, мы и так будем знать какую букву кодировать.

В словаре так и сделано. Поскольку внутри программы я храню различные состояния в виде массива, мне нужно знать минимальный получившийся код символа, чтобы вычитать его, преобразовывая код в смещение в массиве. Для русского языка минимальный код будет у буквы А — 0x10, как я показывал выше, то его и нужно записать в файл описания языка. Цифра 16 в нём — это и есть 0x10 в десятичной кодировке.

Надеюсь сегодня допишу всё что нужно и выложу новый вариант.

3 комментария

Написали с дочкой игру

После того как я обнаружил, что на «Флиппере Зеро» можно писать программы с поддержкой русского языка, никак не мог отделаться от желания написать что-нибудь посерьёзнее демонстрационного примера с использованием этой идеи.

Раздумывал недолго, выбрал для реализацию игру «Виселица» (некоторые знают её под названием «Балда»), в которую когда-то мы играли в детстве.

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

Пока программировал, подсела дочка, спросила чем я занимаюсь, я рассказал с примерами. Мы даже пару раз сыграли на бумаге, после чего вызвалась мне помочь нарисовать графику к игре.

Человек с кудрявыми волосами работает за ноутбуком, на экране которого отображается оранжевый фон с пиксельным логотипом и надписью «РУБРИК».
Дочка рисует виселицу для нашей игры, это первый вариант, в игру не вошёл

Я подумал, что вполне смогу использовать то, что она нарисует в прототипе, но получилось вполне симпатично и я оставил её графику как есть.

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

6 комментариев