{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом hangman game",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/hangman-game\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/hangman-game\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "124725",
            "url": "https:\/\/bolknote.ru\/all\/dar-agachy\/",
            "title": "«Дар агачы»",
            "content_html": "<p>Давно появилась идея прикрутить к моей игре «Виселица» под «Флиппер Зеро» татарский язык. Я всё-таки в Татарстане живу, так что идея выглядит логичной. В выходные делал подготовительные работы в коде — в татарском довольно большой алфавит, я смотрел как всё помещается, немного переделывал меню выбора языков, плюс смотрел есть ли в шрифтах нужные буквы.<\/p>\n<p>Вчера из Института прикладной семиотики АН РТ прислали словарь татарских существительных. Я убрал из него все русские слова (в татарском немало заимствований из русского) и попробовал поиграть.<\/p>\n<p>К сожалению, возникла проблема. В игре я использую два шрифта — 6×12 с нормальным начертанием и 6×13 с жирным. Шрифты готовые, взяты из фреймворка <i>U∞g²<\/i>, я их только переупаковываю, чтобы в них оказались только те буквы, которые я использую в игре.<\/p>\n<p>Оказалось в шрифте 6×13 нет татарских букв! Я этот момент проморгал, думал разница только в размерах. Клавиатуру я печатаю 6×12, поэтому проблему увидел только когда стал выводить татарские слова из словаря (там единственное место, где используется 6×13).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.12.05.2@2x.jpg\" width=\"1000\" height=\"280\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Шрифт <i>6x13B.bdf<\/i> полностью, выделены буквы, похожие на недостающие татарские<\/div>\n<\/div>\n<p>Попробовал посмотреть какие буквы есть в шрифте, чтобы подобрать похожие. Это несложно сделать в командной строке:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">awk &#039;\/^ENCODING\/{print $2}&#039; 6x13B.bdf | xargs -n1 printf &#039;%x\\n&#039; |\r\nwhile read -r line; do printf &quot;\\\\u$line &quot;; done<\/code><\/pre><p>Из того что есть нашлись замены для <tt>Ә<\/tt>, <tt>Ө<\/tt> и <tt>Ү<\/tt>, а вот для <tt>Җ<\/tt>, <tt>Ң<\/tt> и <tt>Һ<\/tt> похожих букв не обнаружилось.<\/p>\n<p>Мысли у меня пока две: либо нарисовать недостающие буквы и научиться их добавлять в шрифт, либо обнаруживать ситуацию, когда нужных букв нет в шрифте 6×13 и переключаться на 6×12. Возможно в виде быстрого исправления я выберу второй вариант, а потом попробую реализовать первый.<\/p>\n",
            "date_published": "2023-12-05T21:03:37+05:00",
            "date_modified": "2023-12-06T16:50:57+05:00",
            "tags": [
                "flipper zero",
                "hangman game",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 05 Dec 2023 21:03:37 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124725",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124742",
            "url": "https:\/\/bolknote.ru\/all\/viselica-pravlyu-bagi\/",
            "title": "«Виселица»: правлю баги",
            "content_html": "<p>Игрушка «Виселица» для «Флиппера Зеро», которую мы как-то <a href=\"https:\/\/bolknote.ru\/all\/napisali-s-dochkoy-igru\/\">написали с дочкой<\/a>, давно перешла из стадии весёлой разработки в стадию унылой поддержки — пользователи потихоньку находят баги, я правлю. Не самая моя любимая стадия, но один баг повеселил.<\/p>\n<p>Один из пользователей пожаловался, что слова с русской буквой «Р» отображаются иногда как-то неадекватно — крайние буквы как будто «срезаются». Выкинув из словаря всё, кроме слов, начинающихся или кончающихся на эту букву, я и сам убедился в наличии этого странного эффекта.<\/p>\n<p>Проблема оказалось в сочетании того как я кодирую символы русских слов и следующей строки кода:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">furi_string_trim(line);<\/code><\/pre><p>Для экономии места и производительности словарь у меня хранится в кодировке <i>UCS-2<\/i> с выкинутыми кодами <tt>0x04<\/tt>, из-за чего русская буква «Р» (с кодом <tt>0x0420<\/tt>) записывается как <tt>0x20<\/tt>, а это код пробела.<\/p>\n<p>Вызов <tt>furi_string_trim<\/tt> мне нужен, чтобы срезать перевод строки, после её считывания. Только я не учёл, что срезаются там все пробельные символы, включая урезанную до одного байта букву «Р».<\/p>\n<p>В общем, создал себе проблем на ровном месте. Надо было хранить буквы как есть и не выпендриваться. Впрочем, баг правится просто:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">furi_string_trim(line, &quot;\\n&quot;);<\/code><\/pre>",
            "date_published": "2023-11-21T08:55:12+05:00",
            "date_modified": "2023-12-06T16:50:25+05:00",
            "tags": [
                "flipper zero",
                "hangman game",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 21 Nov 2023 08:55:12 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124742",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124167",
            "url": "https:\/\/bolknote.ru\/all\/viselica-v-kataloge-programm\/",
            "title": "«Виселица» в каталоге программ",
            "content_html": "<p><a href=\"https:\/\/bolknote.ru\/all\/napisali-s-dochkoy-igru\/\">Нашу с дочкой<\/a> игру для «Флиппера Зеро» «Виселица» включили сегодня в каталог программ для этого устройства. А ещё она есть в одной из альтернативных прошивок — от разработчика с ником <i>RogueMaster<\/i>!<\/p>\n<p>Кстати, я думаю, что Ева является самым молодым соавтором игры для «Флиппера» в мире.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.07@2x.png\" width=\"1000\" height=\"176\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Сегодня приняли нашу с дочкой игру в каталог программ «Флиппера Зеро»<\/div>\n<\/div>\n",
            "date_published": "2023-11-07T23:06:10+05:00",
            "date_modified": "2023-12-06T16:50:34+05:00",
            "tags": [
                "flipper zero",
                "hangman game"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 07 Nov 2023 23:06:10 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124167",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124049",
            "url": "https:\/\/bolknote.ru\/all\/pilyu-viselicu\/",
            "title": "Пилю «Виселицу»",
            "content_html": "<p>Не то, чтобы я не понимал, что сообщество владельцев «Флиппера» относительно небольшое, всё же это очень специфический инструмент, но всё же не ожидал, что написанная за выходные игрушка удостоится такого внимания.<\/p>\n<p>Только выложил её на «Гитхаб», как мне написал автор одной из популярных альтернативных прошивок, прислал патч, исправляющий некую ошибку и попросил английскую версию, — хочет включить игру в свою прошивку.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.02@2x.jpg\" width=\"1000\" height=\"562\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Вчера для «Флиппера» пришёл чехол из Китая, выглядит — супер!<\/div>\n<\/div>\n<p>Доброе слово и кошке приятно, поэтому вот уже несколько дней пилю поддержку других языков.<\/p>\n<p>Для начала переделал сборку на другой инструментарий — ранее игра не собиралась через более распространённый <i>uFBT<\/i>, потому что мой код использовал кое-какие кишочки прошивки, а <i>uFBT<\/i> её не содержит. Такой переход поможет опубликовать игру в общем каталоге, но я с этим не спешу.<\/p>\n<p>Для поддержки английского пришлось довольно много переделать, всё что осталось сейчас — вывести меню, наверное сегодня уже доделаю. Я замахнулся на конфигурируемую поддержку, по моей идее, можно будет очень просто добавить любой язык, для которого есть шрифт.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.02.1@2x.jpg\" width=\"1000\" height=\"200\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Файл описания языка, пример для русского<\/div>\n<\/div>\n<p>В итоге, файл описания выглядит как текстовый файл, где первой строкой написано название словаря, ниже стоит цифра, показывающая сколько букв будет выведено в строке, при рисовании клавиатуры, ещё ниже — зазор между буквами в угадываемом слове в пикселях, потом цифра, про которую я расскажу дальше, ниже — шестнадцатеричные коды букв в кодировке <i>UCS-2<\/i>, ещё ниже — строки сообщений.<\/p>\n<p>Если открыть словарь для английского языка обычным текстовым редактором, то внутри будет текст, с русским такой номер не пройдёт. Объясню почему.<\/p>\n<p>Когда я только начал программировать игру, начал я с упаковки русского словаря в программный код и генерации случайного слова. Оказалось, что быстро выбрать случайное слово не так-то просто. Первый вариант работал очень медленно, поэтому я сделал оптимизации, которые мне помогли достичь комфортной скорости.<\/p>\n<p>Во-первых, я перешёл на другой генератор — встроенный вызов <tt>furi_hal_random_get()<\/tt> вместо обычного для Си <tt>random()<\/tt>. Друг, который в прошлом имел дело с микроконтроллёрами, сказал, что как правило лучше использовать то, что предлагает фреймворк — так быстрее.<\/p>\n<p>Во-вторых, я переделал метод выбора случайного слова. Раньше я выбирал слово с линейной сложностью — генерировал номер строки и читал словарь, пока его не достигну. Переделал на константную — выбираю случайное смещение в файле и ищу следующее слово после него. Что дало теоретический положительный эффект — более длинные слова выбираются чаще.<\/p>\n<p>В-третьих, почти в два раза сократил файл словаря. Любая русская буква занимает в распространённых юникодных кодировках два байта, но второй байт всегда одинаковый, его можно выкинуть. Если посмотреть на ряд, описывающий клавиши в моём файле, видно, что первая четвёрка всё время повторяется. То есть из кода русской буквы <tt>А<\/tt> — <tt>0x0410<\/tt> можно убрать <tt>0x04<\/tt> и оставить только <tt>0x10<\/tt>, мы и так будем знать какую букву кодировать.<\/p>\n<p>В словаре так и сделано. Поскольку внутри программы я храню различные состояния в виде массива, мне нужно знать минимальный получившийся код символа, чтобы вычитать его, преобразовывая код в смещение в массиве. Для русского языка минимальный код будет у буквы <tt>А<\/tt> — <tt>0x10<\/tt>, как я показывал выше, то его и нужно записать в файл описания языка. Цифра <tt>16<\/tt> в нём — это и есть <tt>0x10<\/tt> в десятичной кодировке.<\/p>\n<p>Надеюсь сегодня допишу всё что нужно и выложу новый вариант.<\/p>\n",
            "date_published": "2023-11-02T10:49:10+05:00",
            "date_modified": "2023-12-06T16:50:42+05:00",
            "tags": [
                "flipper zero",
                "hangman game",
                "программирование",
                "си"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 02 Nov 2023 10:49:10 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124049",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "123933",
            "url": "https:\/\/bolknote.ru\/all\/napisali-s-dochkoy-igru\/",
            "title": "Написали с дочкой игру",
            "content_html": "<p>После того как я обнаружил, что на «Флиппере Зеро» <a href=\"https:\/\/bolknote.ru\/all\/pishem-na-flipper-zero-po-russki\/\">можно<\/a> писать программы с поддержкой русского языка, никак не мог отделаться от желания написать что-нибудь посерьёзнее демонстрационного примера с использованием этой идеи.<\/p>\n<p>Раздумывал недолго, выбрал для реализацию игру «Виселица» (некоторые знают её под названием «Балда»), в которую когда-то мы играли в детстве.<\/p>\n<p>Правила там простые — один игрок загадывает слово и рисует чёрточки по количеству букв в нём. Второй пытается отгадать побуквенно. Если названная буква в слове есть, на бумаге рисуется позиция или позиции этих букв, если нет, то рисуется часть виселицы. Если виселица нарисована полностью, отгадывающий проиграл, если слово угадано раньше, — выиграл.<\/p>\n<p>Пока программировал, подсела дочка, спросила чем я занимаюсь, я рассказал с примерами. Мы даже пару раз сыграли на бумаге, после чего вызвалась мне помочь нарисовать графику к игре.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.10.29@2x.jpg\" width=\"1000\" height=\"562\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Дочка рисует виселицу для нашей игры, это первый вариант, в игру не вошёл<\/div>\n<\/div>\n<p>Я подумал, что вполне смогу использовать то, что она нарисует в прототипе, но получилось вполне симпатично и я оставил её графику как есть.<\/p>\n<p>Так что у нас с дочкой теперь есть первая совместная игра — я программировал и разрабатывал интерфейс, она нарисовала виселицу и иконку приложения, а так же выступила первым тестером.<\/p>\n",
            "date_published": "2023-10-29T21:09:27+05:00",
            "date_modified": "2023-12-06T16:50:50+05:00",
            "tags": [
                "flipper zero",
                "hangman game",
                "дочка"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 29 Oct 2023 21:09:27 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "123933",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}