zlobno написал 2 часа назад к игре Мы обречены: # Не слышал про эту игру вообще, но внезапно сыграли на игротеке. Игра ...
Tyran написал 5 часов назад к игре Галерист: # Увидел объявление о продаже, даже кажется здесь, и было написано + про...
Archy написал 6 часов назад к игре Karak II: # Оказывается, есть минимум две версии. Отличаются косметически, но в б...
plechev написал 6 часов назад к игре Кланк! Катакомбы: # значит сражения не происходит, но вы получаете указанный урон от медуз...
Solarius написал 7 часов назад к игре Руины острова Арнак: # А вы зачем считаете и запоминаете карты соперников? Эти карты на вас в...
Решение суда по делу Hobby World против Wildberries
16 июня 2026 года конституционный суд Росси вынес своё решение по жалобе Hobby W...
С миру по нитке [17.06.2026]
Россыпь новостей из мира настольных игр.
Идут сборы на Life
Проживите целую жизнь от рождения до старости.
Победители 20-ой премии Annual Golden Geek Awards - 2025
Сайт BGG подвёл итоги голосования по своей премии.
Идут сборы на Die in the Dungeon
Легковесный рогалик в духе Slay the Spire, но со сбором пула кубиков.

neizerth

Математика против хаоса: как Rust и C++ помогают считать вероятности в «Ужасе Аркхэма»

08 марта 2026

Информация

добавить
игры Ужас Аркхэма. Карточная игра
Дата: 08 марта 2026
Оценка пользователей
8.8131
-

Математика против хаоса: как Rust и C++ помогают считать вероятности в «Ужасе Аркхэма»

Привет, друзья!

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

Проект называется Arkham Investigator, и за последние месяцы он пережил довольно серьёзные изменения: переписал архитектуру приложения, добавил расчёт вероятностей проверок и выпустил версию для iOS.

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

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


С чего всё началось

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

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

Со временем функциональность приложения постепенно росла. Сейчас в нём автоматизировано более 40 способностей сыщиков, включая обработку эффектов Знака древних.

Но вместе с ростом возможностей появилась и новая проблема.


Фоновые изображения

Казалось бы, приложение — это в первую очередь код.

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

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

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

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

Поэтому пришлось заниматься довольно кропотливой работой:

  • выравнивать портреты персонажей

  • дорисовывать края изображений

  • очищать фон

  • подгонять освещение и контраст

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

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

И искусственный интеллект тут не особо помогает. Взгляните хотя бы на Тони Моргана в интерпретации ИИ


Публикация в App Store: неожиданное испытание

Версия для Android существует уже почти год.
Но когда я решил выпустить приложение на iOS, оказалось, что это отдельное приключение.

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

Слово Arkham пришлось убрать из названия в App Store.
Теперь там приложение называется AH Investigator.

Но это была только первая правка.


Почему приложение распространяется без контента

Следующий вопрос модерации касался графических материалов игры.

Чтобы избежать конфликтов с авторскими правами, версия для App Store распространяется как своего рода «пустая оболочка»

Внутри приложения нет официальных артов карт или жетонов. Все фоновые картинки счётчиков я переработал и оставил только фанатских сыщиков

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

С точки зрения App Store это важно: само приложение остаётся универсальным инструментом, а пользователь уже решает, какие данные использовать.

Это позволило пройти модерацию и при этом сохранить весь функционал.


Кроссплатформенная разработка: теория и реальность

Arkham Investigator написан на React Native, чтобы одна кодовая база работала и на Android, и на iOS.

В теории это звучит идеально.

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

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

В итоге пришлось написать отдельную реализацию фильтра на Objective-C.

Это забавный момент: иногда небольшая визуальная деталь заставляет разработчика изучить ещё один язык программирования.


Главная инженерная задача: мешок хаоса

Но самое интересное началось, когда я решил добавить функцию Chaos Odds — расчёт вероятности успеха проверки.

 

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

Но внутри эта задача оказалась гораздо сложнее.

Мешок хаоса в «Ужасе Аркхэма» — это не просто случайный жетон.
В игре есть множество эффектов, которые меняют правила вытягивания.

Например:

  • жетоны Bless и Curse заставляют вытянуть дополнительный жетон

  • некоторые символы сценария тоже говорят «тяни ещё»

  • иногда эффекты могут накладываться друг на друга

В результате одно вытягивание может породить целую цепочку новых вытягиваний.

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

В некоторых сценариях число возможных комбинаций может достигать миллионов вариантов.


Почему JavaScript оказался слишком медленным

Первая версия алгоритма была написана на JavaScript.

Она честно перебирала все возможные комбинации жетонов и вычисляла точный результат. С точки зрения математики всё было идеально.

Но была одна проблема.

В сложных конфигурациях мешка расчёт занимал около минуты.

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

Поэтому пришлось искать другое решение.


Как Rust и C++ спасли ситуацию

В итоге математическое ядро было полностью переписано как нативный модуль на Rust и C++.

Rust отлично подошёл для реализации самой логики вероятностного дерева. Он быстрый, безопасный и хорошо работает с памятью.

C++ использовался для интеграции этого модуля с мобильной частью приложения.

Результат оказался довольно впечатляющим.

Теперь расчёт вероятности занимает меньше одной секунды даже на старых устройствах вроде iPhone 7 или бюджетных телефонов уровня Redmi 4X.

И что важно — все вычисления происходят полностью оффлайн.

Никакие данные не отправляются на серверы. Телефон сам рассчитывает все варианты прямо во время партии.


Проверка данных: почти детективная работа

Когда речь идёт о вероятностях, качество исходных данных критически важно.

Здесь огромную работу проделал Егор Косаткин (@Egoorka_k). Он буквально вручную проверил все официальные кампании и сценарии.

Каждый жетон, каждый модификатор, каждое условие вытягивания — всё сверялось с оригинальными правилами.

В процессе было обнаружено около 70 ошибок и пограничных случаев.

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

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

Также хочу поблагодарить:

Никиту Красильникова (@kolorono) — за помощь с математической моделью
@Ari_oh — за работу над плавностью интерфейса и анимациями


Особая благодарность

Этот релиз я хочу посвятить Сергею Вакуленко.

Многие в сообществе знают его как автора множества переводов для «Аркхэма».

Именно Серёжа когда-то сделал один из первых калькуляторов вероятностей для игры. Его идеи стали для меня ориентиром.


Где посмотреть проект

Ещё раз напомню: проект бесплатный и открытый.

Если кому-то интересно попробовать приложение или посмотреть код — вот ссылки.

Буду благодарен лайку в теме на BGG для того, чтобы игрокам было легче найти проект

Android
Google Play

iOS
App Store

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

BGG
Тема проекта

GitHub
Исходный код


Буду рад вопросам, замечаниям и конструктивной критике.

Надеюсь, этот инструмент сделает партии в «Ужас Аркхэма» немного удобнее — а кому-то, возможно, будет интересна и сама инженерная задача, скрытая за несколькими числами вероятности на экране.

Фото и видео

добавить
  • новые
  • популярные
danceandfight написал 3 месяца назад: # скрыть ответы

Привет, спасибо за статью!

А можно пример сложного варианта, где js не вывозил уже? И не могли ли каким-то образом помочь округления и менее точные методы расчета, а то кажется, что 13% вероятность для большинства людей не сильно отличается от, скажем, 9 или 17%)

neizerth написал 3 месяца назад: # скрыть ответы

Я упёрся в этот потолок на мешке из 10 bless + 10 curse. Там уже если закинуть сценарные жетоны с доктором и, в теории морозы из Края, окончания процесса можно не ждать

Это был тупой перебор без DFS (поиск в глубину) и оптимизация бы и на JS, уверен, что-то бы дала

Ещё одна задачей была поддержка фанатских кампаний. Есть как граничный случай сценарий Strange Moons из фанатского Dark Matter, там скрижаль приводит к добру двух жетонов вместо одного. И в этот момент даже DFS без оптимизации взрывался

В общем, я решил не мелочить, учитывая что у приложения есть пользователи древнего Android 7 и сделать максимально возможные улучшения :)

neizerth написал 3 месяца назад: #

Не с доктором, а с добором:)

neizerth написал 3 месяца назад: #

Я пробовал также вариант неточных вычислений через метод Монте-Карло

Но он давал сильный разброс в результатах (около разницы в 10-20%). Для примерной точности ему желательно 10к выборок
Я попробовал и получилось медленнее по работе, чем полный обход :(

Пробовал также BFS (поиск в ширину), но он был медленнее. В общем, у меня с этими вероятности получится полноценный НИОКР ради 5 чисел)