Logiss.ru

Ваша компьютерная помощь
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Создание турнирной таблицы онлайн

Мой pet-проект: создание турнирных таблиц

Мы в Ижевске регулярно проводим турниры по шахматам и шашкам. Обычно турнир у нас растягивается на несколько дней и нужно где-то хранить результаты. Для круговых турниров мы создавали файл в гугл-таблицах. Для швейцарских пробовали разные веб-сервисы и программы. И всегда сталкивались с какими-нибудь недостатками.

Приложения для компьютера неудобны для публикации результатов и крайне сложны. Онлайн-сервис имел неудобный интерфейс. Несколько раз приходили мысли написать свой веб-сервис. И вот наконец идея воплотилась в реальность. В конце 2018 года был создан сайт SwissSystem.

Как работает сервис

На сайте можно прочитать, какие возможности предоставляет сервис, поэтому тут опишу технические особенности реализации.

Использованные технологии: ASP.NET Core 2.1, Entity Framework, Bootstrap, Maria DB, Nginx, Linux.

Я впервые размещал ASP.NET приложение на Linux и это было интересно. В остальном же были использованы достаточно стандартные для ASP.NET решения. Из коробки можно было использовать авторизацию по логин-паролю и через социальные сети.

Основная сложность была в алгоритмах. Помню, в шахматной школе не каждый тренер мог провести жеребьевку по швейцарской системе. Это именно жеребьевка, поскольку есть элемент случайности. К счастью, я нашел в интернете движок по жеребьевке на JAVA. Это очень помогло, но не до конца. Нужно было уметь правильно подсчитывать очки и тут есть определенные сложности и варианты подсчета (связано с правилами ФИДЕ по подсчету коэффициента бухгольца).

Данные хранятся достаточно просто. Весь турнир сохраняется в виде JSON. Для обеспечения многопоточного изменения поддержана версионность. Операция изменения применяется если прочитанная версия равна версии данных в базе. Если версия изменилась, то данные пересчитываются и применяются еще раз.

Как сервис стал популярным у иностранных шахматистов

Первое время я пробовал раскручивать сайт и потратил где-то 2000 рублей. Было впечатление, что шахматная жеребьевка мало кому интересна. Статистика по ключевым словам в Google это подтверждает. В итоге решил прекратить раскрутку.

Но каким-то образом раскрутка дошла до Бразилии. Одна девушка пользовалась моим сайтом, но ее печалило, что интерфейс не на ее родном языке. Друг этой девушки решил ее удивить и написал мне, что хочет перевести мой сайт. Так появился португальский язык на SwissSystem.org. Думаю, ребята поженились, жили долго и счастливо.

Читайте так же:
«Не удается найти этот элемент» в Windows 10: как удалить

Осенью 2019 внезапно на меня вышел Мато Джелик (Mato Jelic) из Австралии, который хотел купить компоненту и встроить ее в свой сайт на вордпрессе. Я ему долго объяснял, что это практически невозможно и нужно будет покупать нормальную виртуальную машину, а не хостинг на PHP. В итоге мы всё-таки договорились и была создана копия сайта. Это был единственный существенный доход, который покрыл расходы на хостинг на много лет вперед.

За последний год в среднем сайт посещает около 500 человек в месяц. В январе 2021 года преимущественно посещают игроки из Великобритании, Индии и США. Организатор турниров в Великобритании пару раз давал пожертвования в виде пары десятков фунтов. Есть идея переписать сайт на ReactJS и выпустить мобильное приложение, но всегда находятся какие-то другие дела.

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Формирование турнирных таблиц, stored procedures SQL

На днях прочитал пост об автоматизированном формирование футбольных чемпионатов и решил поделится своим решением данной задачи, которое использовал для небольшой игры. Реализация жеребьевки сделана не стандартным подходом, при помощи хранимых процедур MS SQL Server.

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

Таблица игр чемпионата
  • Количество команд участвующих в турнире должно быть четным;
  • Каждая команда должна сыграть с другой 2 раза — на своем стадионе и на стадионе соперников;
  • В одном туре одна и та же команда может играть лишь один раз;
  • За победу в матче команда получает — 2 очка, за ничью — 1 очко, а за проигрыш соответственно — 0.


После этого мы формируем список пар команд для всех игр чемпионата. Для этого можно считать что у нас есть 2 списка с идентичными номерами всех команд чемпионата.


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

Читайте так же:
Как поменять возраст в ТикТоке


После того как мы получил список пар команд нам необходимо распределить их по турах не забывая об условии: одна команда может играть только один раз за тур и две команды могут играть только дважды друг с другом за чемпионат на домашнем и гостевом стадионах.

Количество игр, которые происходят за один тур равны общему количеству команд чемпионата. Для формирования тура берется самая первая пара команд из ранее сформированного списка, номера команд записываются в игру тура и во временный массив, а из списка пар команд удаляются. Для формирования остальных игр тура будет использоваться такая же логика, только теперь пары команд номера которых есть во временном массиве будут пропускаться, таким образом за один тур не смогут играть две одинаковых команды, но и ни одна команда не останется без дела. По завершению временный массив очищается и данный алгоритм будет повторятся пока все туры не будут заполнены.


По окончанию выполнения алгоритма список всех пар команд чемпионата будет пустым, игры будут сформированы и все туры заполнены играми — все соответствует правилам проведения чемпионата.

Основной алгоритм, которым я хотел поделится описан, в подробности синтаксиса хранимых процедур SQL я не вдавался, поскольку это уже другая тема и другой пост. Все скрипты с реализацией примера можно найти в репозитории на github. На данный момент скрипты работают и проверены на MS SQL Server, если для вас это интересно, то перепишу под СУБД, которую вы используете. В проекте также находятся хранимые процедуры для вычисления лучшего голкипера, бомбардира, «Путь чемпиона» и несколько других для взаимодействия с данными чемпионата.

Для корректной работы скриптов необходимо создать сперва базу данных FootballTournament. Для работы хранимых процедур подсчета лучше бомбардира, голкипера и других вспомогательных хранимых процедур должны быть выполнены первые две: формирование турниров и генерирования случайных данных результатов игр.

Сетки, шаблоны, таблицы для турниров по пляжному волейболу
( Double elimination, Single elimination, Группы, Псевдогруппа, Мастер песка, Мастер-микст, Королевский микст, Kings of the court ) —>

Должны ли в браузере быть включены Куки ? ОБЯЗАТЕЛЬНО ! Какой браузер лучше использовать ? Сервис проверен для firefox, chrome, opera, safari и др. под ОС Windows, Linux, Android. Если при работе с вашего устройства возникли проблемы , сообщите тип устройства,ОС и браузер. Как провести турнир используя сервис ? Нажмите кнопку . Заполните название турнира и необязательное поле с Положениями (Если название турнира не заполнено, то ссылка для зрителей и участников на главной странице не появится).
Нажмите кнопку , появится ссылка для организатора (только по этой ссылке измененения в ходе турнира отправляются на сервер и доступны другим участникам. Лучше внести ее в избранное).
Перейдите по ссылке организатора и вводите фамилии или названия команд участников.
Если Вы организуете одновременно и мужской и женский турниры, Вам необходимо зарегистрировать 2 турнира.
Если команды ввести в соответствии с рейтингом , ввести количество сеянных N и нажать кнопку ЖЕРЕБЬЕВКА, то первые N останутся на своих местах, а игроки ниже по списку перемешаются. Если сеянных 0, то жеребьевка распространяется на всех участников.
При нажатии кнопки . Будет построена турнирная таблица до двух поражений.
Если известен победитель некоторой игры, нажмите на кнопку с названием команды-победителей, она будет перенесена в игру для винеров, проигравший будет перенесен в игру для лузеров.
Чтобы скрыть всю информацию,кроме турнирной таблицы , нажмите кнопку . Где можно поделиться опытом или получить консультацию ? Замечания, советы, обсуждение системы или по телефону,почте внизу страницы. Как по окончании турнира можно узнать кто какое место занял ? Кликните на кнопку Если у меня есть список участников в Екселе , как его перенести в Вашу систему ? Если у вас есть список команд в EXCEL-е расположенный в столбик, вы можете скопировать список в поле над кнопкой ИМПОРТ. Нажатие кнопки приведет к занесению команд в раздел УЧАСТНИКИ. Как распечатать турнирную таблицу ? Нажмите кнопку , чтобы на странице осталась только таблица. В меню браузера выберите печать или предварительный просмотр. Если нужно повернуть таблицу , выберите альбомную ориентацию. Если хотите ,чтобы таблица поместилась на один лист , измените масштаб Как распечатать бланк турнирной таблицы ? Вместо участников введите знак /. Нажмите кнопку . Что означает текст в таблице рядом с номером игры ? S — номер участника по рейтингу или после жеребьевки. W — номер игры откуда переходит победитель(винер). L — номер игры откуда переходит проигравший(лузер) Каким образом сохраняются данные по играм на сайте. Если, например, у меня в середине турнира закрылась вкладка с результатам, то результаты не сохранятся, придется вводить опять? Если Вы вошли по ссылке организатора и есть интернет, данные сохраняются при действиях ПЕРЕНЕСТИ В СЕТКУ,НАЧАТЬ и при любых действиях с турнирной таблицей. Какие еще есть возможности у системы ? В нижнюю часть таблицы вписать любой текст (спонсоры, организаторы и т.п.)
В таблицу можно вставить картинку (логотип турнира и пр.)
Можно экспортировать таблицу в PDF
Можно использовать систему даже если на стадионе нет доступа к интернет
Итоги турнира (команды и занятые места) можно экспортировать в Ексель
Максимальное количество команд — 128, при необходимости, будет увеличено до 256
Новая функция — Расписание игр и возможность хранить и печатать полные результаты турнира. Описание возможностей будет позже.
Разработана новая модель проведения турниров типа «Король пляжа» — «Мастер песка». Доступна для зарегистрированных организаторов.
Разработана новая модель проведения турниров «Королевский микст» на лучшую микст-пару среди всех возможных комбинаций участников. Доступна для зарегистрированных организаторов.

Читайте так же:
Установка процессора на материнскую плату

Начало : / / Название : турнира
Double elimination Single elimination Группы 0)<>else‘ title=»>Псевдогруппа 0)<>else‘ title=’Определение сильнейшего игрока турнира. Количество игр как в Double elimination’>Мастер песка 0)<>else‘ title=’Определение сильнейшей микст-пары с произвольным количеством М и Ж’>Мастер-микст 0)<>else‘ title=»>Королевский микст Kings of the court/Короли корта Kings of the beach+/Король пляжа+ Динамический Пляжный/beachvolley 2*2 Снежный/snowvolley 3*3 Парковый/parkvolley 4*4 Классика/volleyball 6*6 Другой/other Мужской/Men Женский/Women Микст/Mix Без ограничений Молодежный Ветераны Положения турнира :

—> Ваш номер организатора, если есть получить номер организатора
Город проведения :

Double elimination Single elimination Группы Псевдогруппа Мастер песка Мастер-микст Королевский микст

Рейтинги,заявка на участие

* Яркий шрифт — турнир не начался, синий — идет, серый — завершен. Крутые турниры отмечаются звездами ⭐, от 1 до 5.
🔥 — турнир рейтинговый, 📷 — есть фото, 🎥 — есть видео игр, 👍 — уровень организатора турнира

Создание расписания турниров

Отвлечемся от высшей математики и обратим внимание на спорт. Сотрудники, с которыми я работаю, иногда устраивают турниры по теннису и нередко у них возникает задача написать график «боёв», так что бы каждый спортсмен играл с каждым.

Такая система турнира называется круговой.

Каждый участник по очереди играет со всеми остальными. Побе­дителем считаем участника, выигравшая наибольшее число встреч. Одновременно выявляют (по числу выигранных встреч) и последующие места, занятые другими участиками.

Очевидный плюс: При таком способе наи­более объективно выявляется победитель.

Недостаток: Турнир может быть очень растянут по времени. Особенно, если будет два и более кругов.

В интернете чаще всего используются так называемые т аблицы Бергера, но это не наш метод.

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

Читайте так же:
Как записывать видео с экрана в OBS Studio

Итак исходные данные: N — количество участников.

Что бы каждый из них сыграл по одному разу с остальными, нам необходимо провести N-1 туров.

Если количество участников нечётное то добавляется еще один виртуальный участник, и если в графике участнику приходится играть с таким «виртуалом», то он просто ничего не делает. Отдыхает и наблюдает за остальными.

Анализ полученной таблицы следующей:

По горизонтали выделенным шрифтом показаны половина участников соревнований.

Каждый ряд таблицы это отдельный раунд.

Ограничение этого бота по количеству.. Давайте исходить из количества участников не более 50. Но математически нет никаких ограничений, можно и на две сотни сделать.

Рассмотрим группу из 7 участников:

Пишем семь и получаем таблицу

1234
7658
8765
2176
3817
4321
5482
6543

Участников всего 7, а в таблице фигурирует спортсмен под номером 8. Это виртуальный участник

Раундов что бы определить победителя будет тоже семь ( это количество строк)

Теперь что мы видим:

в первом раунде участник под номер 1 играет с участником под номером 7, 2 с 6, 3 с 5 и 4 участник с «виртуальным» восьмым. То есть 4 участник в первом раунде не участвует.

Во втором раунде, не участвует уже 1 спортсмен, второй играет с седьмым, третий с шестым, а четвертый с пятым.

И так в раждом раунде.

Если мы посмотрим каждый столбец, то убедимся что каждый участник играет по одному разу с каждым, кроме самого себя.

Эту таблицу легко скопировать в Excel, заменить цифры, фамилиями участников, или команд.

Ссылка на основную публикацию