Имеется 3 поля: победы, ничьи, поражения. Какую нужно выбрать формулу для вычисления рейтинга, учитывая, что может быть 0 побед (в таком случае, например, игрок 0:2:1 успешнее игрока 0:0:1), 0 поражений (в таком случае, например, игрок 0:2:0 успешнее игрока 0:1:0). Т.е. первостепенна победа, затем ничьи. UPD:
Так как статистика пользователю выдаётся сразу по 3 уровням сложности игры, то хочется знать его рейтинг в любой момент времени, а не высчитывать все рейтинги всех игроков при запросе. Также отношение побед/поражений преимущественно, затем идёт количество ничьих партий.
Если в возможной формуле рейтинг двух игроков будет одинаковый при разных результатах, то успешнее игрок, сыгравший меньше партий. Т.е. достигший результата за меньшее число попыток.
Алексей: подразумевается некоторое количество пользователей и 3 уровня сложности игры (т.е. статистика по каждой сложности), а время ответа критично. Поэтому не хочется каждый раз вычислять рейтинг и позицию.
Первый игрок, так как при соответствующих значениях он сыграл меньше игр, т.е. достиг аналогичного рейтинга, затратив меньшее число попыток.
Тут нужна не алгебраическая формула, а сортировка по двум полям: значение в первом поле равно победам минут поражения, во втором поля ничьи. Сортировка работает так, что по второму полю будут сортироваться только строки, в которых совпадают значения в первом поле. Если все же хотите получить функцию, то индекс в отсортированном списке и будет значением этой функции. Функция вычисляется для конкретного игрока, но аргументом к ней идет весь список игроков, а для отдельного игрока в вакууме значение функции не определено.
Можно предложить альтернативный вариант сортировки: три поля, первое - победы, второе - поражения с отрицательным знаком (выше окажутся игроки с меньшим числом поражений), третье - ничьи.
Но первый вариант лично мне кажется более сбалансированным.
Мне всё же хотелось бы, чтобы победы были первичнее, т.е. имеющие по вашей формуле одинаковый рейтинг, скажем, 1:0:1=0 и 0:2:1=0 не были одинаковы, а первый игрок занимал лидирующее место. Но я подумаю, спасибо
сделайте матрицу игроков. Столбики сверху вниз - соотношение побед/поражений. Добавьте строки, где одинаковое соотношение побед/поражений, далее сделайте выборку у кого соотношения "ничья". В итоге в столбце первый элемент (игрок) будет лучшим по соотношению победа/ничья/проигрыш, далее выводим из его строки остальных, у кого соотношение победа/проигрыш такое же, но "ничья" хуже. Как строка кончилась, переходим к следующему элементу столбца и т.д.
не слышали о возможности менять/сдвигать элементы массива? Разумеется пересчитывать каждый раз накладно. Хотите с экономить ресурсы, тогда придётся покодить. Итак игрок открыл игровую сессию, создаём слушателя событий (я знаю as3, там так называется), а игрок рубится, когда в игре происходит что-то, что влияет на рейтинг, то игра отправляет событие на сервак, сервак принимает данные и пересчитывает рейтинг игрока, но не всё таблицу, а ток связанную с игроком часть. т.е., из описанного мною ранее, победа - вверх на строку, поражение - вниз на строку, а дальше вычисляем положения игрока в этой строке по количеству ничейных игр.