Показать сообщение отдельно
Старый 08.05.2020, 17:08   #1
MouseR
Зловред
 
Аватар для MouseR
 
Регистрация: 10.06.2008
Сообщений: 2,417
MouseR отключил(а) отображение уровня репутации
По умолчанию Новая практика

Выбираем 4-5 трасс (с учетом что их число позже увеличится) Такие которые можно проехать на ЛЮБОЙ машине (без необходимости иметь технику определенного уровня только чтоб добраться до финиша)
Эти трассы в практике выводим отдельным списком и проводим на них заезды с призовым фондом. В списке указываем: размер призового фонда, число уже проехавших и время через которое фонд будет разыгран. Призовой фонд для каждой трассы свой и он разыгрывается каждые N- Минут - что составляет один цикл (15 минут - цикл). Если трассу за "цикл" никто не ехал её базовый призовой фонд удваивается (но не больше 3-х раз подряд - при базовом фонде 5 см через час призовой фонд станет 40 см Все последующие циклы базовый фонд больше не растет)

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


Первый Никто не ехал и тогда удваиваем призовой фонд (или не меняем если это происходит больше 4х раз)
Второй Проехало от одного до 3-х игроков - весь фонд делим на число участников (алгоритм деления ниже).
Третий Игроков 4 и больше - делим всех на 2 команды (можно использовать алгоритм из "заездов") Вычисляем для каждой из получившихся команд средний результат и распределяем призовой фонд между игроками команды с лучшим результатом по тому же алгоритму что между


Участвовать могут все уровни на любой технике. Для определения размера выигрыша результат каждого игрока которому полагается часть выигрыша сравниваются не с другими игроками его "команды" а с "виртуальным" средним результатом показанном за всё время на этой трассе на машине его комплектации. Для этого машина и ее комплектация сводится к некоторому коду (он выводится из конечных характеристик таких как максимальная скорость / управляемость / мощность / ограничение коробки передач ... может быть марка авто) если эту трассу на технике с таким "кодом" никто не ехал значит первый же проезд становится эталонным и с ним будут сравниваться остальные (и корректировать эталонное значение)

Определения "кода комплектации"
Нужны параметры
  • Авто (IDCar) - Идентификатор автомобиля
  • Трансмиссия (IDTrans) - максималка по трансмиссии (он присутствует в названии)
  • Скорость (S) - суммарная максимальная скорость
  • Мощность (P) - суммарная мощность
  • Управляемость (D) - суммарная управляемость
  • Комплексный индекс (IDComplex)
  • Карта (IDMap)
Параметры S P D преобразуем в Ss Pp Dd округляя каждый из параметров до ближайшего большего целого числа кратного 25 (Например фактическая сумма управляемости D = 497 преобразуется в Dd = 500, Суммарная мощность P = 77 дает Pp = 100 а P = 75 -> Pp=75... )


Собираем текстовую строку txtComplex = IDCar_IDTrans_Ss_Pp_Dd
IDComplex = md5( txtComplex ); // Для удобства пользования можно оставить только 8 цифр


Комплектацию автомобиля так же сохраняем (временно, если результат окажется "рекордным" эта комплектация заменит предыдущую сохраненную. Если же на этой комплектации "рекорда" не поставлено - "забываем"




Пишем в БД для связки (IDComplex_IDMap) результаты для каждого типа трансмиссии статистика результатов проезда по IDComplex в которой записываем
  • IDMap
  • IDComplex
  • BestRez Лучший результат
  • MidRez Средний результат
  • CntRez Число проездов на которых получено среднее значение
  • bStab Признак того что среднее значение перестало меняться от добавления новых данных (да/нет)
  • fComplect Ссылка на файл с реальной комплектацией (XML) на которой был показан лучший результат
  • txtProperty Справочное текстовое поле (txtComplex) - для понимания человеком без "копания" в коде на чём показан результат
Проехав трассу (IDMap) для данной "конфигурации" авто (IDComplex) если ещё не зафиксировано результатов считаем что результат игрока "Лучший" (BestRez ) и он же средний(MidRez ) и устанавливаем количество результатов равным 1 и сохраняем в файл конфигурацию авто с записью ссылки на неё в базу (txtProperty). При последующих проездах этой трассы (rez) на аналогичной конфигурации среднее значение пересчитываем следующим образом:
newMidRez = (rez + CntRez * MidRez) / (CntRez+1)
Увеличиваем счетчик CntRez, сравниваем предыдущий средний результат с новым. Если они одинаковые значит на даной конфигурации автомобиля вероятно больше не будет изменений "среднего" времени на данной трассе и теоретически можно больше не проводить расчетов.
Если это новый рекорд - фиксируем его, с пересохранением "рекордной" конфигурации (мы не удаляем предыдущую а меняем только ссылку на файл с новой конфигурацией (потому что на одной конфигурации могут быть "рекорды" на разных трассах

Получаем таким образом данные по трассам на всем парке который используют игроки с учётом их "переконфигурирования"



Алгоритм распределения призового фонда
Имеем размер призового фонда (в СМ)
Список игроков среди которых надо распределить выигрыш (кроме идентификатора игрока и его результата сохраняем "код комплектации" его автомобиля), базу с накопленными данными по трассам.
Делим призовой фонд (PF) на число участников (победившей команды - cnt) Для каждого из них сравниваем его результат (uRez) со средним (MidRez) и лучшим(BestRez). Считаем что Лучший результат который записан в БД это 100%(призовых на данного игрока) средний результат в БД это 50% и мы можем расчитать сколько из той призовой доли можем начислять игрок
uPriz = PF / cnt Доля на которую может расчитывать игрок (если она не рекордная)
d = BestRez - MidRez Дельта между лучшим и средним результатами которая составляет половину от uPriz
uD = BestRez - uRez Дельта для рассчета призовых полагается игроку
realPriz = uPriz * (2d - uD) / 2d
Если uD отрицательное значит у нас новый рекорд и realPriz окажется больше uPriz
Некоторые результаты могут в этой схеме оказаться отрицательными. Т.е. игрок ещё и доплатить должен - разумеется ничего он не платит.
В большинстве случаев его призовые (realPriz) будут менее 100% от полагающейся игроку доли (uPriz) а если это новый рекорд для этой конфигурации автомобиля призовые окажутся больше чем "возможные" но это не важно - в целом призовые в подавляющем количестве случаев не будут распределять все 100% призовых (и можно остатки использовать как начальное значение для нового цикла.


==== более поздний вариант ====

uPriz = PF / cnt Доля на которую может расчитывать игрок (если она не рекордная)
BestRez Рекордный результат составляет 100% от uPriz
realPriz = uPriz * uRez / BestRez

при таком расчете призовых не будет проблем в случае если рекорд и средний результат одинаковые (или очень близкие)

Последний раз редактировалось MouseR; 13.05.2020 в 14:24
MouseR вне форума   Ответить с цитированием