Раньше наш рабочий процесс прерывался из-за ряда неразрешенных вопросов:

  • А кто из нас лучше всех играет в настольный футбол?
  • С кем бы мне сейчас пойти поиграть?
  • Кого надо уволить, потому что он не работает а только играет?

Наш опыт решения данных вопросов с помощью системы рейтинга 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, то получилось многостраничное приложение.

Во время разработки для хостинга я использовал Azure. Будучи уверенным, что потом спокойно перееду на какой-нибудь хостинг. Так уж и быть, даже оплачу его. И попытался переехать… Даже был морально готов заплатить баксов 50 в год за самый скромный вариант. Но когда я провозился сначала день с миграцией базы, а потом еще и не завелся проект, потому что хостер не очень-то готов к Asp.Net Core, вынужден был остаться на Azure. Но ценник там большой. А с другой стороны есть с чем сравнивать, Azure значительно удобнее.

Вспомнилась реклама на Хабре про хостинг Azure для стартапов. Почитал условия. Написал жалобное письмо на указанный емеил. И проект добавили в программу поддержки стартапов. Надеюсь, после статьи не исключат. Хотя я считаю, что проект всем требованиям удовлетворяет. В итоге, вопрос с хостингом теперь решен на 3 года! Так что если кто не хочет разворачивать проект локально, присоединяйтесь к нам, создавайте свою лигу. Экспериментально было установлено, что название не очень запоминающееся. Поэтому мы общим голосованием решили использовать learningstreet.ru.

Захватывающая история почему именно LearningStreet
Давным давно один наш коллега, верстая подпись к письму, написал в шутку адрес офиса как learning street 79 (Учебная улица). Мы посмеялись. А буквально день спустя я назвал ряд ребят «пацанами с которыми мы работаем»(в негативном контексте), а не друзьями. Слово за слово и вспомнилась цитата героя фильма Волк с Уолл-стрит: «это Уолл-стрит. Здесь нет друзей». Которая была модифицирована в «это Лёнинг-стрит. Здесь нет друзей». С тех пор, если кому-то кажется что мир к нему неоправданно жесток в пределах нашего офиса, мы вспоминаем про Лёнинг-стрит. То есть каждый день. Собственно в рейтинге по футболу у нас друзей тоже нет и пощады ждать не стоит.

Теоретически, если у кого есть идеи доменных имен подходящих для сайта, можно прикрутить. У меня как раз есть бонусы у одного из хостеров.

Ах да, чуть не забыл. Кого надо уволить? Судя по всему меня: