игра «виселица»
Играли вчера с дочкой в «Виселицу»…
Играли вчера с дочкой в «Виселицу» на бумаге — научилась, пока участвовала в её реализации под «Флиппер». Слова она, конечно, пока загадывает с ошибками, отгадывать сложно. Опять спрашивала почему пишется именно так.
Я
Обнаружил, что очень неудобно угадывать слова, когда на клавиатуре лежащего рядом ноутбука нет русских букв, без этого мне перебирать буквы сложно. Я, судя по всему, давно этим способом пользуюсь, так как это уже ушло в автоматические действия. Когда бросил на клавиатуру первый взгляд, прям почувствовал, что мозг пытается привлечь внимание сознания, чтобы разобраться в нестандартной ситуации.
Ещё из из игр на бумаге дочке нравится «Морской бой».
«Виселица» в магазине приложений
Я долго не знал как выглядит наша с дочкой игра «Виселица» в магазине приложений «Флиппера Зеро» —
А на днях вспомнил, что
Честно сказать, необходимость постоянно использовать
Татарские символы в «Виселице»
Вчера вечером ковырял формат BDF — это формат шрифтов для «Флиппера Зеро». Как я писал была идея добавить в шрифт 6×13 татарские символы, которые там отсутствуют. BDF это текстовый формат, так что это было не слишком сложно.
Символы Ә, Ө и Ү, как и планировал, наскрёб в других шрифтах — поставил «шва», русскую «фиту» и латинскую «уай», просто скопировав пискельные данные букв и изменив метаинформацию. А вот Җ, Ң и Һ пришлось рисовать.
Я сначала понадеялся найти
Пришлось записывать пиксели единицами и нулями, переводить в десятичный вид и руками вписывать в шрифт. Неудобно, но искать подходящий редактор ради трёх букв было бы дольше.
В итоге, я оформил это в виде скрипта, который патчит шрифт, добавляя в него нужные буквы. А то мало ли — вдруг ещё
Видимо я ещё немного упрощу это место, — после внимательного чтения описания формата в голову пришли
«Дар агачы»
Давно появилась идея прикрутить к моей игре «Виселица» под «Флиппер Зеро» татарский язык. Я
Вчера из Института прикладной семиотики АН РТ прислали словарь татарских существительных. Я убрал из него все русские слова (в татарском немало заимствований из русского) и попробовал поиграть.
К сожалению, возникла проблема. В игре я использую два шрифта — 6×12 с нормальным начертанием и 6×13 с жирным. Шрифты готовые, взяты из фреймворка U∞g², я их только переупаковываю, чтобы в них оказались только те буквы, которые я использую в игре.
Оказалось в шрифте 6×13 нет татарских букв! Я этот момент проморгал, думал разница только в размерах. Клавиатуру я печатаю 6×12, поэтому проблему увидел только когда стал выводить татарские слова из словаря (там единственное место, где используется 6×13).
Попробовал посмотреть какие буквы есть в шрифте, чтобы подобрать похожие. Это несложно сделать в командной строке:
awk '/^ENCODING/{print $2}' 6x13B.bdf | xargs -n1 printf '%x\n' |
while read -r line; do printf "\\u$line "; doneИз того что есть нашлись замены для Ә, Ө и Ү, а вот для Җ, Ң и Һ похожих букв не обнаружилось.
Мысли у меня пока две: либо нарисовать недостающие буквы и научиться их добавлять в шрифт, либо обнаруживать ситуацию, когда нужных букв нет в шрифте 6×13 и переключаться на 6×12. Возможно в виде быстрого исправления я выберу второй вариант, а потом попробую реализовать первый.
«Ahorcado»
Загвоздка в том, что у меня в игре основной шрифт кириллический — я взял готовый шрифт из прошивки, а в этом шрифте нет «ñ» и других необходимых в испанском символов. Лучшее решение, которое мне пришло тогда в голову, — смотреть что за символ мы сейчас выводим и переключать шрифты, если в текущем нет нужного символа.
Посидел вечерок, всё неплохо заработало. Но когда рассказывал о своём решении братишке, он спросил меня почему я не попытался сделать свой шрифт, где есть все нужные мне символы. Такая мысль приходила мне в голову, но Си я знаю, а как создать свой шрифт для «Флиппера» — нет.
Но сказанное братом засело в голове и не давало покоя, тем более, что переключение шрифтов было очень похоже на крайне неизящный костыль. Пришлось разобраться с тем как собрать свой шрифт.
Оказалось, это совсем несложно — во фреймворке U∞g2 есть исходники тех же шрифтов, которые использует «Флиппер», и утилита bdfconv, которая умеет их пересобирать. А на специальной странице можно сгенерировать себе необходимую для сборки командную строку.
В ближайший свободный вечер хочу накидать код, который поможет собирать шрифт посимвольно — определит какие буквы используются у меня в программе и выдаст точные диапазоны. А то я пока помещаю символы целыми алфавитами, очень неэкономно.
«Виселица»: правлю баги
Игрушка «Виселица» для «Флиппера Зеро», которую мы
Один из пользователей пожаловался, что слова с русской буквой «Р» отображаются иногда
Проблема оказалось в сочетании того как я кодирую символы русских слов и следующей строки кода:
furi_string_trim(line);Для экономии места и производительности словарь у меня хранится в кодировке
Вызов furi_string_trim мне нужен, чтобы срезать перевод строки, после её считывания. Только я не учёл, что срезаются там все пробельные символы, включая урезанную до одного байта букву «Р».
В общем, создал себе проблем на ровном месте. Надо было хранить буквы как есть и не выпендриваться. Впрочем, баг правится просто:
furi_string_trim(line, "\n");«Виселица» в каталоге программ
Нашу с дочкой игру для «Флиппера Зеро» «Виселица» включили сегодня в каталог программ для этого устройства. А ещё она есть в одной из альтернативных прошивок — от разработчика с ником RogueMaster!
Кстати, я думаю, что Ева является самым молодым соавтором игры для «Флиппера» в мире.
Пилю «Виселицу»
Не то, чтобы я не понимал, что сообщество владельцев «Флиппера» относительно небольшое, всё же это очень специфический инструмент, но всё же не ожидал, что написанная за выходные игрушка удостоится такого внимания.
Только выложил её на «Гитхаб», как мне написал автор одной из популярных альтернативных прошивок, прислал патч, исправляющий некую ошибку и попросил английскую версию, — хочет включить игру в свою прошивку.
Доброе слово и кошке приятно, поэтому вот уже несколько дней пилю поддержку других языков.
Для начала переделал сборку на другой инструментарий — ранее игра не собиралась через более распространённый uFBT, потому что мой код использовал
Для поддержки английского пришлось довольно много переделать, всё что осталось сейчас — вывести меню, наверное сегодня уже доделаю. Я замахнулся на конфигурируемую поддержку, по моей идее, можно будет очень просто добавить любой язык, для которого есть шрифт.
В итоге, файл описания выглядит как текстовый файл, где первой строкой написано название словаря, ниже стоит цифра, показывающая сколько букв будет выведено в строке, при рисовании клавиатуры, ещё ниже — зазор между буквами в угадываемом слове в пикселях, потом цифра, про которую я расскажу дальше, ниже — шестнадцатеричные коды букв в кодировке
Если открыть словарь для английского языка обычным текстовым редактором, то внутри будет текст, с русским такой номер не пройдёт. Объясню почему.
Когда я только начал программировать игру, начал я с упаковки русского словаря в программный код и генерации случайного слова. Оказалось, что быстро выбрать случайное слово
В словаре так и сделано. Поскольку внутри программы я храню различные состояния в виде массива, мне нужно знать минимальный получившийся код символа, чтобы вычитать его, преобразовывая код в смещение в массиве. Для русского языка минимальный код будет у буквы А — 0x10, как я показывал выше, то его и нужно записать в файл описания языка. Цифра 16 в нём — это и есть 0x10 в десятичной кодировке.
Надеюсь сегодня допишу всё что нужно и выложу новый вариант.
Написали с дочкой игру
После того как я обнаружил, что на «Флиппере Зеро» можно писать программы с поддержкой русского языка, никак не мог отделаться от желания написать
Раздумывал недолго, выбрал для реализацию игру «Виселица» (некоторые знают её под названием «Балда»), в которую
Правила там простые — один игрок загадывает слово и рисует чёрточки по количеству букв в нём. Второй пытается отгадать побуквенно. Если названная буква в слове есть, на бумаге рисуется позиция или позиции этих букв, если нет, то рисуется часть виселицы. Если виселица нарисована полностью, отгадывающий проиграл, если слово угадано раньше, — выиграл.
Пока программировал, подсела дочка, спросила чем я занимаюсь, я рассказал с примерами. Мы даже пару раз сыграли на бумаге, после чего вызвалась мне помочь нарисовать графику к игре.
Я подумал, что вполне смогу использовать то, что она нарисует в прототипе, но получилось вполне симпатично и я оставил её графику как есть.
Так что у нас с дочкой теперь есть первая совместная игра — я программировал и разрабатывал интерфейс, она нарисовала виселицу и иконку приложения, а так же выступила первым тестером.