HTML5 Phaser ECMAScript 6, Phaser - полезные советы

Часть 35: Динамическая формула роста награды за уровень (очков)

В игру я добавил магазин покупки сердечек, времени и энергии (я считаю этот термин больше подходит чем «сила», который я использовал ранее) за монетки. Сами монетки изначально я предполагал продавать за реальные деньги. Но так как для реализации внутренних продаж надо разобрать API для Apple и Android (возможно с нудной верификацией акаунта), я решил давать монетки только за просмотр рекламы.

окошко начала урока, экзамена и магазин покупки энергии (внизу панель под будущий ТОП)

Главное правило в торговле: спрос должен превышать предложение! Что бы реклама имела хорошее качество (кликабельность), надо ее ее просмотр сделать привилегий. По этому кнопка просмотра рекламы будет блокироваться на 24 часа. Всего таких кнопок будет 4.

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

Я писал ранее что расчет монеток делается простым алгоритмом. Если пользователь ответил не правильно более чем на 4 вопроса, то он не получает прибыль (возвращаем ему столько же монеток, сколько он заплатил за сам урок). Но в режиме отладки в уроке не более 4 вопросов… это натолкнуло меня на мысль, что константу 4 надо заменить на %. Ведь 4 ошибки в уроке с 12 вопросами это не тоже самое что 4 ошибки в — 20.

Перейдя на проценты, нужно было найти формулу для расчета динамического штрафа за неправильный ответ. Допустим в уроке 12 вопросов, и при условии 30% неправильных ответов мы получаем число 4. Самой простой формулой будет 20 / 4 = 5, что значит -5 монеток за каждую ошибку. Все верно, но не для игр. В игре штраф должен постепенно увеличиваться или уменьшаться.

Из школьной программы я помнил про арифметическую и геометрическую прогрессию (почитать можно тут). А так как у нас известно количество штрафов — 4, после которых монетки уже не выдаются, то сумма 4 штрафов должна быть 20 монеток (что бы пользователь не получил монетки после 4 ошибок). Теперь взглянем на геометрическую прогрессию:

сумма геометрической и арифметической прогрессии

Особенность такой прогрессии в том, что каждый новый член высчитывается умножением некой константы на предыдущий член. Из формулы нам известно значение S = 20. Также известно значение N = 4. Знаменатель прогрессии мы выбираем самостоятельно q = 1.1 (от этого зависит насколько члены последовательности будут отличаться друг от друга).

Единственный неизвестный член уравнения это b1. Именно он и будет превой величиной штрафа за неправильный ответ. Следующий штраф будет b1*1.1 и после применения 4 штрафов, из 20 монет не останется ни одной =) (штраф за N неправильный ответ рассчитывается по формуле bn = b1 * q ^ (n-1))

предварительный просмотр штрафа при геометрической и арифметической прогрессии

Получив такое красивое решение, я решил что после 30% не правильный ответов, продолжить штрафовать до -20 монеток за дополнительно 60% не правильных ответов. В результате для урока в 12 слов, первые 4 (30%) не правильных ответа дают награду от 20 до 0, а еще 8 ошибок (60%) награду (убыток) от 0 до -20. Больше всего мне тут понравилась возможность тюнить данные числа, анализируя поведение игрока.

Обратите внимание, надо использовать именно геометрическую прогрессию. В арифметической прогрессии может появится случай, когда a1 будет отрицательное число, что значит дополнительные монетки за неправильный ответ =)

ошибка в арифметической прогрессии при разности прогрессии равной 2

Мне кажется эта тема мне еще пригодится… ведь надо уменьшать максимальное количество выданных монеток (изначально 20) за урок при каждом повторном прохождении. А так как это число не должно быть меньше M, то я думаю бесконечно убывающая геометрическая прогрессия именно то, что мне надо. Но об этом уже в другом посте, всем спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *