08.05.2020, 17:08 | #1 |
Зловред
Регистрация: 10.06.2008
Сообщений: 2,417
|
Новая практика
Выбираем 4-5 трасс (с учетом что их число позже увеличится) Такие которые можно проехать на ЛЮБОЙ машине (без необходимости иметь технику определенного уровня только чтоб добраться до финиша)
Эти трассы в практике выводим отдельным списком и проводим на них заезды с призовым фондом. В списке указываем: размер призового фонда, число уже проехавших и время через которое фонд будет разыгран. Призовой фонд для каждой трассы свой и он разыгрывается каждые N- Минут - что составляет один цикл (15 минут - цикл). Если трассу за "цикл" никто не ехал её базовый призовой фонд удваивается (но не больше 3-х раз подряд - при базовом фонде 5 см через час призовой фонд станет 40 см Все последующие циклы базовый фонд больше не растет) Игрок каждую из трасс может проехать за "цикл" только один раз, но может ездить другие трассы и перемещаться по игре как ему вздумается (участие в таких заездах его не заставляет находиться в локации до окончания цикла). Когда игрок "проезжает" трассу к призовому фонду автоматически добавляется сумма кратная его уровню (для простоты равная его уровню но позже можно скорректировать). В конце цикла для каждой из трасс имеем три варианта что нужно сделать. Первый Никто не ехал и тогда удваиваем призовой фонд (или не меняем если это происходит больше 4х раз) Второй Проехало от одного до 3-х игроков - весь фонд делим на число участников (алгоритм деления ниже). Третий Игроков 4 и больше - делим всех на 2 команды (можно использовать алгоритм из "заездов") Вычисляем для каждой из получившихся команд средний результат и распределяем призовой фонд между игроками команды с лучшим результатом по тому же алгоритму что между Участвовать могут все уровни на любой технике. Для определения размера выигрыша результат каждого игрока которому полагается часть выигрыша сравниваются не с другими игроками его "команды" а с "виртуальным" средним результатом показанном за всё время на этой трассе на машине его комплектации. Для этого машина и ее комплектация сводится к некоторому коду (он выводится из конечных характеристик таких как максимальная скорость / управляемость / мощность / ограничение коробки передач ... может быть марка авто) если эту трассу на технике с таким "кодом" никто не ехал значит первый же проезд становится эталонным и с ним будут сравниваться остальные (и корректировать эталонное значение) Определения "кода комплектации" Нужны параметры
Собираем текстовую строку txtComplex = IDCar_IDTrans_Ss_Pp_Dd IDComplex = md5( txtComplex ); // Для удобства пользования можно оставить только 8 цифр Комплектацию автомобиля так же сохраняем (временно, если результат окажется "рекордным" эта комплектация заменит предыдущую сохраненную. Если же на этой комплектации "рекорда" не поставлено - "забываем" Пишем в БД для связки (IDComplex_IDMap) результаты для каждого типа трансмиссии статистика результатов проезда по IDComplex в которой записываем
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 при таком расчете призовых не будет проблем в случае если рекорд и средний результат одинаковые (или очень близкие)
__________________
http://formula-n2o.ru/user-rating-ch...tour&UserId=40 Последний раз редактировалось MouseR; 13.05.2020 в 14:24 |