В статье попытаюсь рассказать об опыте поиска кроссплатформенной технологии для реализации хобби проекта посвященного тренировке мозга и некоторых приемах ее геймификации. Несколько лет назад мной был сделать небольшой сайт с набором упражнений и через некоторое время возникла мысль: перенести идею прокачки персонажа из игр на упражнения, так что-бы игрок прокачивал свои когнитивные навыки. И пока идея полностью не созрела, начался процесс поиска технологий для реализации версии сайта 2.0, плюс был интерес по изучать новые технологий и языки Что бы результатом смогли воспользоваться как можно больше человек но при этом минимизировать время разработки, хотелось максимально простое кроссплатформенное решение (веб/мобильные приложения). При выборе же языка предпочтение отдавалось функциональным.
Так как основной профиль у меня .net, то один из очевидных выборов был Главный плюсы  В качестве языка использовать F# в связки с библиотекой UniRX для применения реактивного подхода. От первого опыта остались положительный впечатление, но на тот момент был большой минус с веб версией — необходимость ставить плагин. И хотя тогда уже был экспериментальный метод компиляции в html5, реализация была еще сырой. И насколько знаю на данный момент с этим подходом все еще есть ряд проблем. Второй вариант это использовать js в связке с Cordova. Главный плюс Cordova — простота. Упаковал html с js — вот и готовое мобильное приложение. Главные же минус — на мобильных устройствах чувствуется отсутствие нативности. Писать что-то более менее сложное на js не самое приятное занятие, поэтому нужна альтернатива компилирующаяся в js, благо выбор достаточно большой. Из опробованных языков хочется выделить Elm, F#(WebSharper/Fable) – хорошие, вполне рабочие варианты, но для меня главный минус — более простая система типов по сравнению с другими доступными языками. PureScript — очень интересный язык, есть все необходимое для полноценного функционального программирования — чистота, классы типов. Главный минус — язык пока еще молодой и находится в бете. Как следствие — небольшое комьюнити, слабая поддержка редакторов кода. При трансляции чистого язык с дифолтным кэррированием в js получается не совсем оптимальный код, что становится заметно на слабых мобильный устройствах.
Если к релизу эти проблемы уйдут, то получиться один из лучших вариантов фп языка на замену js. Scala (scala.js) — хоть и не такой красивый и лаконичный как PureScript, но зато берет более адекватно сгенерированным js кодом + имеется полноценная IDE в лице IntelliJ IDEA. Их все испробованных языков, этот вариант оставил наиболее положительное впечатление, поэтому было решено в дальнейшем использовать его. Хотя код пишется так же на js, но в отличии от Cordova интерфейс получается нативным. Для scala.js реализована поддержка React Native в библиотеки sri. При все шероховатости и подводных камнях, React Native оставил крайне положительное впечатление. В процессе реализации, в большинстве случаев, все просто работало, как на андроиде так и в браузере (для работы веб версии использовалась библиотека react-native-web). Конечно выбор технологии для хобби проекта отличается от выбора для коммерческой разработки, но считаю связку React Native + scala.js очень не плохим вариантом и остановлюсь на ней пока не появится что-то более интересное. Первоначально эксперименты велись со своего рода обратной геймификацией. Если геймификация это внедрение игровых элементов в не игровой контекст. То обратной можно назвать процесс внедрение не игровых элементов в игровой контекст. Например реализовывались классические игры (runner, snake, dungeon crawler) и в них внедрялись не игровые элементы в виде решений простых когнитивных задач. Хоть опыт получился интересным, но в финальной версии все же решено было сместить акцент на упражнениях, а для этого больше подходит классическая геймификация с прогресс барами и бейджами. Цель применения геймификации была предложить игроку дополнительную мотивацию для тренировки к уже имеющейся внутренней. Обычно приводят примеры потребностей человека которые можно для этого использовать, например такие как: В первой версии сайта уже применялся вариант с соперничеством. С помощью системы соревнований и лиг. Но реализация использовала parse.com и канула в лету вместе с закрытием сервиса. И раз первоначальная идея была с прокачкой, то за основу была взята потребность в развитии. Хотелось бы выделить нескольких используемых механик. Градация сложности
Каждое упражнение разбивается на уровни, этим достигается как плавность процесса усложнения тренировки так и дает место для применения других механик. Ощущение прогресса 
В процессе тренировок игрок заполняет шкалу прогресса текущего уровня, при этом чем лучше результаты тем быстрее идет прогресс.  Постановка целей
При достижении 100% прогресса открывается режим левел апа, где перед игроком ставиться цель пройти своего рода экзамен для перехода на следующий уровень. Обратная связь
В процессе прохождения упражнений варьируется звуковой сигнал ответа по которому можно понять насколько хорошо игрок проходит упражнение относительно своих предыдущих результатов. Преодоление сложности
Хорошо бы перед игроком периодически ставить челенджи, для это предусмотрен режим испытаний в котором случайным образом генерируется упражнение и на прохождение которого дается одна попытка. Поток
Состояние потока достигается за счет оптимального соотношения сложности задачи и навыка человека. При входе в эту зону возникает состояние оптимального психологического переживания. Проиллюстрировать это можно так На основе этой идеи был реализован режим Скорость — в котором время для ответа постепенно подстраивается под ответы игрока, тем самым за счет плавного увеличение сложности идет попытка привести игрока в данную зону. Результат можно опробовать на себе. Будут признателен за любой фидбэк. Разработчик