Раньше наш рабочий процесс прерывался из-за ряда неразрешенных вопросов:
- А кто из нас лучше всех играет в настольный футбол?
- С кем бы мне сейчас пойти поиграть?
- Кого надо уволить, потому что он не работает а только играет?
Наш опыт решения данных вопросов с помощью системы рейтинга Elo будет рассмотрен в статье. А также ссылка на репозиторий и на сайт будут разбросаны по статье.
Когда компания маленькая, а игроков еще меньше, то вопрос лучшего решается простым проведением турнира в пятницу вечером раз в пару месяцев. <совет>Шикарнейший повод выпить за счет компании.</совет>(Мы по неопытности это не сразу поняли. И сначала просто так играли.) Но компания растет, лига тоже увеличивается, и вот уже отыграть турнир, даже с учетом предварительного разбиения на группы, становится очень сложно. Это просто физически тяжело на большом футбольном столе провести 15 партий за вечер.
На данном этапе опытные игроки в онлайн игры шахматисты подсказывают, что существует метод расчета относительной силы игроков Elo, которая как раз используется для оценки уровня шахматистов.
Про Elo
Разработал систему американский профессор физики и шахматист Арпад Эло.
Каждый новый игрок обычно получает рейтинг 1400. На самом деле не принципиально сколько. По итогам каждого матча часть рейтинга переходит от одного игрока к другому. И чтобы не уходить в минус берется изначально с запасом.
Будем считать, что игрок A в случае выигрыша получает 1 очко, в случае поражения — 0, а при ничьей — 0.5. Назовем эту переменную Sa.
Введем ожидаемое количество очков(Ea), которое игрок A получит за игру:
Ea = 1 / (1 + 10^((Rb-Ra)/400))
где Rb и Ra — это текущий рейтинг игроков B и A соответственно. Ea принадлежит интервалу (0, 1).
Коэффициенты подобраны таким образом, чтобы при разнице в рейтинге в 200 пунктов, ожидаемое количество очков равнялось приблизительно 0.75. Новый рейтинг игрока A считаем по формуле:
Ra’ = Ra + K * (Sa — Ea)
где K — коэффициент. Это максимальное количество пунктов рейтинга, который игрок может получить/потерять за одну игру. Обычно равняется 16. В ФИДЕ зависит от уровня игроков и варьируется от 10 до 30.
Аналогично считается рейтинг второго игрока Rb'.
Очевидно, что Ea + Eb = 1, Sa + Sb = 1 и следовательно Ra’ — Ra + Rb’ — Rb = 0, то есть у нас игра с нулевой суммой. Из формул видно, что сильный игрок за победу над слабым игроком получает меньше рейтинга, чем если слабый выиграет у сильного.
Мы рейтингом пользуемся уже около года. Отыграли более тысячи матчей. По моему субъективному мнению рейтинг отображает достаточно точно расстановку игроков в текущий момент времени. Как только кто-то в компании начинает играть лучше, например освоив удар, в течение недели занимает соответствующее место в рейтинге.
Также не проблема, если неделю или две не заносили результаты. При возобновлении рейтинг быстро восстанавливается.
После введения рейтинга сильно изменилось поведение во время игры. Матчи стали зрелищней. Если раньше, пропустив пару мячей в начале, проще было уже слить этот матч и начать новый, то теперь есть стимул биться до конца, чтобы не потерять (или не подарить сопернику) очки рейтинга! Автор статьи недавно проигрывал 1:6. А выиграл 7:6. Это был жаркий матч.
Естественно, когда мы решили попробовать рейтинг, первым делом поискали готовые реализации. И хотя многие онлайн игры используют Elo, не нашли ничего толкового, где бы мы могли просто заносить результаты наших игр. Поэтому в пятницу вечером был накидан google-скрипт для google-доков.
Пол года назад захотелось посмотреть на Asp.Net Core в действии(тогда RC1 был). И объективно google-скрипта уже давно не хватало. А там как раз выходные были. В итоге появилась система рейтинга, которой мы успешно пользуемся до сих пор. Нам нравится. Мне точно, а остальные может боятся сознаться, что нет.
Я думаю будет правильным поделиться со всеми. Исходники доступны здесь.
Получилось что-то явно большее чем просто MVP. В том числе сейчас реализовано:
- Подсчет рейтинга Elo;
- Дополнительная статистика: соотношение побед, забито/пропущено, победы и поражения подряд;
- Подсчет очков получаемых/теряемых в случае победы/поражения при игре с конкретным игроком в следующем матче. Надо же как-то планировать с кем лучше сейчас играть;
- Импорт результатов матчей из csv. Это мы с google-скриптов переезжали;
- Аутентификация с поддержкой OAuth. Пока только google, так как нам хватает. Но добавить еще какую систему несложно;
- Упрощенная система прав доступа. Существует админ лиги с возможностью управлять лигой и просто игроки;
- Приглашение новых пользователей. С уведомлением по емеил;
- Раздельные лиги. Каждый пользователь может создать свою приватную лигу, которая будет видна только игрокам лиги;
- Поддержка двух языков: английского и русского. У меня давнишние счеты с локализацией приложений. И сильно хотелось посмотреть как это реализовано в Asp.Net Core;
- Адаптивный дизайн. Ничего сверх естественного. Просто Bootstrap. Чтобы удобно было заносить результаты с телефона;
- Должно работать с выключенным JavaScript. Удобнее конечно с включенным. Но так как было желание посмотреть на некоторые фичи именно MVC, то получилось многостраничное приложение.
Во время разработки для
Вспомнилась реклама на Хабре про
Теоретически, если у кого есть идеи доменных имен подходящих для сайта, можно прикрутить. У меня как раз есть бонусы у одного из хостеров.
Ах да, чуть не забыл. Кого надо уволить? Судя по всему меня:
Автор: JacobL