Vibe ChessVibe Chess

bbpPairings: открытый движок жеребьёвки швейцарских турниров

bbpPairings (BBP Pairings) - открытый движок жеребьёвки для шахматных турниров по швейцарской системе. Он не менеджер турнира и не программа для судьи: у него одна задача - получить файл с историей турнира и выдать пары следующего тура по правилам ФИДЕ. Написан на C++, развивается с 2016 года, распространяется свободно с исходным кодом. Именно этот движок считает пары в приложении Vibe Chess.

Что такое bbpPairings простыми словами

Швейцарская система устроена так, что вручную составить пары честно почти невозможно уже с двух десятков участников. Нужно одновременно соблюсти десятки требований: не сводить одну пару дважды, держать баланс цветов, сводить игроков с одинаковыми очками, а если это невозможно - выбирать наименьшее зло по строгому списку приоритетов. Движок жеребьёвки берёт эту работу на себя.

bbpPairings - как раз такой движок. Он принимает файл с полной историей турнира, вычисляет пары очередного тура и записывает их в файл. Никакого интерфейса, базы данных и сети: программа читает один текстовый файл и пишет другой. Всё остальное - регистрация участников, ввод результатов, таблица, вывод на экран - задача той программы, которая движок вызывает.

Такое разделение принято в отрасли: есть эталонный движок, есть менеджеры турниров, которые его используют. Самый известный аналог - JaVaFo Роберто Рикки, референсная реализация системы Dutch на Java. Интерфейс bbpPairings сознательно сделан похожим на JaVaFo 1.4 - с разрешения автора JaVaFo.

Кто разработал и на каких условиях распространяется

  • Разработчик: Bierema Boyz Programming. Репозиторий - github.com/BieremaBoyzProgramming/bbpPairings.
  • Язык: C++. Собирается обычным Makefile под Unix, для Windows в репозитории есть сборка под MinGW-w64.
  • Лицензия: Apache 2.0 - можно свободно использовать, в том числе в коммерческих проектах, изучать и изменять исходный код.
  • История: проект начат в августе 2016 года. Версии 2.x и 3.x - 2017 год, 4.1.0 - июль 2017, 5.0.0 - январь 2022, 5.0.1 - февраль 2023, актуальная 6.0.0 вышла 1 февраля 2026 года - в день вступления в силу новой редакции правил Dutch.

Важное свойство для организатора: движок ничего не отправляет наружу. Это локальный исполняемый файл, который работает с файлами на диске. Персональные данные участников никуда не уходят - весь расчёт происходит на той машине, где движок запущен.

Какие системы жеребьёвки поддерживает

Система Dutch (голландская) - основная. Это та самая швейцарка, которую ФИДЕ описывает в разделе C.04.3 своего регламента и которая используется на подавляющем большинстве открытых турниров мира. Версия 6.0.0 реализует редакцию правил 2025 года, вступившую в силу с 1 февраля 2026 года.

Система Burstein - вторая, дополнительная. Здесь автор честен: в README сказано, что это реализация предыдущей версии системы и что она содержит недочёты. Эндорсмента ФИДЕ у неё нет. На практике движок используют ради Dutch.

Круговые турниры (каждый с каждым) движку не нужны вовсе: там расписание туров считается по таблице Бергера арифметически, без всякого перебора вариантов.

Как устроена система Dutch: очковые группы, брекеты и флоатеры

Чтобы понимать, что именно делает движок, полезно знать словарь регламента ФИДЕ - те же термины встречаются в его исходниках и сообщениях об ошибках.

  • TPN, стартовый номер - номер участника, задающий исходный порядок. Обычно раздаётся по рейтингу перед первым туром.
  • Очковая группа - все игроки с одинаковым числом очков. Идея швейцарки в том, чтобы сводить игроков внутри такой группы.
  • Брекет - группа игроков, которых сейчас разводят по парам: сама очковая группа плюс те, кто остался без пары в предыдущей, более высокой группе.
  • Однородный и разнородный брекет - в первом у всех одинаковые очки, во втором есть пришедшие сверху.
  • Даунфлоатер - игрок, которому не хватило пары в своей группе и который «проваливается» в следующую. В новой группе он называется moved-down player (MDP), а его соперник снизу получает апфлоат - играет с более сильной по очкам стороной.
  • PAB (pairing-allocated bye) - пропуск тура, когда игроков нечётное число: соперника нет, цвета нет, а очки начисляются как за победу.
  • Транспозиция и обмен - два способа перебора: поменять порядок игроков внутри половины брекета или обменять равные по размеру группы игроков между половинами. Именно перебором транспозиций и обменов движок ищет допустимую пару вариантов.

Цвета: абсолютное, сильное и мягкое предпочтение

Половина сложности швейцарки - это цвета. Регламент делит предпочтение игрока на три степени:

  • Абсолютное - разница между числом партий белыми и чёрными вышла за пределы ±1 либо игрок два тура подряд играл одним цветом. Такое предпочтение нарушать нельзя: двух игроков с одинаковым абсолютным предпочтением движок не сведёт (кроме особых случаев с лидерами турнира).
  • Сильное - разница цветов равна ±1. Игрок должен получить выравнивающий цвет, но при необходимости это требование уступает более важным.
  • Мягкое - цвета поровну. Тогда игрок должен получить цвет, противоположный последней партии.

Отсюда и берётся привычная организатору картина: цвета чередуются, длинных серий одним цветом не бывает, а если турнир нечётный по составу, кто-то получает пропуск тура - но не дважды.

Критерии жеребьёвки и их приоритет

Регламент ФИДЕ формулирует жеребьёвку как список требований строгого приоритета. Сначала идут абсолютные - их нарушать нельзя никогда:

  • двое участников не встречаются между собой дважды;
  • игрок, уже получавший пропуск тура с полным очком, не получает его повторно;
  • двое игроков с одинаковым абсолютным предпочтением цвета не сводятся друг с другом.

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

Практический смысл прост: движок не ищет «красивую» жеребьёвку, он ищет допустимую по самому приоритетному правилу и уступает только там, где иначе тур составить математически нельзя. Поэтому спорить с его вариантом обычно бессмысленно - если пара выглядит странно, значит любая другая нарушала бы правило рангом выше.

Формат TRF: как турнир попадает в движок

Общение с движком идёт через TRF - формат обмена турнирными данными ФИДЕ (его же называют форматом Краузе). Это обычный текстовый файл со строго позиционной раскладкой: значение определяется не разделителем, а номером колонки.

Ключевая строка - 001, одна на участника: номер игрока, звание, имя, рейтинг, федерация, ID ФИДЕ, дата рождения, набранные очки, а дальше блоками по 10 символов - история туров. В каждом блоке номер соперника, цвет (w или b) и результат: 1 победа, 0 поражение, = ничья, U пропуск тура с очком, + и - - плюсовик и минусовик за неявку.

Версия 6.0.0 работает с TRF-2026 и поддерживает обратную совместимость со старым TRF(bx). Есть и собственные расширения для нестандартных начислений очков - коды вида BBW, BBD, BBL: они позволяют задать своё число очков за победу, ничью и поражение.

Тот же TRF нужен и после турнира: файл с результатами принимают судейские программы и федерации, поэтому «выгрузить TRF» и «сдать турнир на обсчёт» на практике почти синонимы.

Режимы запуска и коды выхода

У движка три режима работы.

  • Жеребьёвка тура: bbpPairings --dutch tournament.trf -p pairings.txt - главный режим. На выходе файл, где первая строка содержит число пар, а дальше идут пары номерами игроков.
  • Проверка турнира: bbpPairings --dutch tournament.trf -c - движок проверяет, соответствует ли уже сделанная жеребьёвка правилам. Полезно, если пары составлялись другой программой или руками.
  • Генерация случайного турнира: bbpPairings --dutch -g -o trf_file - создаёт случайный турнир для тестов. Так авторы и проверяют движок на тысячах сгенерированных сценариев.

Результат работы возвращается кодом выхода: 0 - успех, 1 - допустимой жеребьёвки не существует, 2 - внутренняя ошибка, 3 - некорректный запрос или данные, 4 - турнир не влезает в ограничения по размеру, 5 - файл не прочитался.

Код 1 стоит отличать от настоящих ошибок. Это не сбой, а математика: в швейцарке нельзя сводить одну пару дважды, поэтому при N участниках после N-1 тура свободных соперников не остаётся. Правильная реакция программы - не повторять попытку, а сообщить, что турнир пора завершать.

Производительность и ограничения

README указывает теоретическую сложность: примерно O(n³) для системы Burstein и O(n³ × s² × log n) для Dutch, где n - число игроков, а s - количество занятых очковых групп. На практике это означает, что любительский турнир на десятки участников разводится мгновенно, а заметное время расчёт занимает лишь на очень больших опенах.

Ограничения по размеру турнира заданы при сборке: если данные их превышают, движок вернёт код 4. Отдельно стоит помнить, что движок оперирует только тем, что ему передали в файле - он не знает ни о рейтинге на сайте федерации, ни о том, что игрок опоздал на тур. Всё это должна учесть вызывающая программа.

Статус относительно ФИДЕ: что важно знать организатору

Здесь легко ошибиться, поэтому по пунктам. ФИДЕ ведёт список одобренных (endorsed) программ - это сертификация, которую выдаёт комиссия SPP после проверки. В этом списке находятся менеджеры турниров вроде Swiss-Manager и Vega, а эталонной реализацией алгоритма Dutch считается JaVaFo.

bbpPairings в этом списке нет. Его README формулирует задачу осторожно: программа стремится реализовать правила, описанные в регламенте ФИДЕ. Реализация Burstein прямо помечена как неполноценная и неэндорсенная.

Что это значит на практике. Для клубного, школьного, корпоративного или любительского турнира bbpPairings подходит полностью: он считает пары по тем же правилам Dutch, что и сертифицированные программы. Если же турнир идёт на обсчёт рейтинга ФИДЕ, требования к используемой программе нужно уточнять у своей федерации и главного судьи заранее - именно из-за отсутствия сертификата, а не из-за качества алгоритма.

Кто использует bbpPairings

  • Lichess - в швейцарских турнирах работает форк bbpPairings с добавленной системой Fast Swiss: она подбирает пары линейно, сверху вниз, ради скорости на очень больших составах.
  • SwissSys - известный американский менеджер турниров, где движок bbpPairings доступен как вариант расчёта пар.
  • Vibe Chess - наше приложение для офлайн-турниров, о нём ниже.
  • Множество самописных ботов и сервисов: открытая лицензия и простой интерфейс «файл на входе - файл на выходе» делают движок удобной деталью для встраивания.

Как bbpPairings работает в приложении Vibe Chess

В Vibe Chess жеребьёвку швейцарских турниров считает именно bbpPairings - версия 6.0.0, собранная из исходников и запускаемая с флагом --dutch. Схема ровно та, что описана выше: приложение собирает файл TRF из истории турнира, отдаёт его движку, получает пары тура и раскладывает их по столам.

Несколько следствий, которые заметны организатору:

  • пары считаются по правилам Dutch, а не «по-домашнему»: группы по очкам, чередование цветов, без повторных встреч и без двух пропусков подряд;
  • пропуск тура при нечётном составе оформляется как PAB - с очком и без соперника, как требует регламент;
  • если движок отвечает «допустимой жеребьёвки не существует», приложение не подставляет пары наугад, а честно говорит, что состав исчерпан и турнир пора завершать;
  • завершённый турнир выгружается тем же файлом TRF - его принимают судейские программы и федерации.

Оговорка та же, что и выше: соблюдение правил Dutch - это не сертификат ФИДЕ. Vibe Chess одобрение комиссии SPP не проходил, и для рейтинговых турниров это нужно учитывать. Для клубных, школьных, барных и корпоративных турниров ограничений нет - и всё это бесплатно: создать турнир по швейцарской системе, по круговой или свободную встречу может любой пользователь.

Как собрать и попробовать самому

Готовые сборки лежат в разделе releases репозитория, но собрать из исходников несложно. Нужен компилятор C++ и make:

  • клонировать репозиторий: git clone https://github.com/BieremaBoyzProgramming/bbpPairings.git
  • собрать: make - на выходе появится исполняемый файл bbpPairings.exe (имя такое и под Linux);
  • сгенерировать тестовый турнир: ./bbpPairings.exe --dutch -g -o test.trf
  • получить жеребьёвку: ./bbpPairings.exe --dutch test.trf -p out.txt

Если вы просто хотите провести турнир, а не разбираться со сборкой, весь этот путь уже пройден за вас: в приложении движок уже встроен, а организатору остаётся создать событие и нажимать кнопки.

Жеребьёвка по правилам ФИДЕ - без установки и настройки

В приложении Vibe Chess bbpPairings уже встроен: создаёте турнир, открываете запись, нажимаете «Начать турнир» - и пары каждого тура считает тот самый движок. Бесплатно, без лимитов на число турниров и участников.

Частые вопросы о bbpPairings

Что такое bbpPairings?

Открытый движок жеребьёвки для шахматных турниров по швейцарской системе, написанный на C++ разработчиком Bierema Boyz Programming. Он получает файл с историей турнира в формате TRF и выдаёт пары следующего тура по правилам ФИДЕ (система Dutch). Это не менеджер турнира: интерфейса, базы участников и таблицы у него нет.

bbpPairings бесплатный?

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

Одобрен ли bbpPairings ФИДЕ?

В официальном списке одобренных ФИДЕ программ его нет: сертификацию проходят менеджеры турниров, а эталонной реализацией алгоритма Dutch считается JaVaFo. bbpPairings реализует те же правила ФИДЕ, а для реализации системы Burstein сам автор указывает, что она неполная и эндорсмента не имеет. Для клубных и любительских турниров это не мешает, для турниров с обсчётом рейтинга ФИДЕ требования нужно уточнять у федерации.

Какие системы жеребьёвки поддерживает bbpPairings?

Две швейцарские: Dutch (голландская, основная, по правилам ФИДЕ раздела C.04.3) и Burstein (дополнительная, реализация предыдущей редакции правил с известными недочётами). Круговые турниры движку не нужны - там расписание считается по таблице Бергера.

Что такое формат TRF?

Формат обмена турнирными данными ФИДЕ, он же формат Краузе. Текстовый файл со строго позиционной раскладкой: в строке 001 записываются данные участника, его очки и история туров - соперник, цвет и результат каждой партии. Этот же файл принимают судейские программы и федерации при сдаче турнира.

Почему движок отказался составить пары?

Скорее всего вернулся код 1 - допустимой жеребьёвки не существует. В швейцарке нельзя сводить одну и ту же пару дважды, поэтому при N участниках после N-1 тура свободных соперников не остаётся. Это не ошибка программы, а сигнал, что туры закончились.

Где используется bbpPairings?

В швейцарских турнирах Lichess (форк с системой Fast Swiss), в менеджере турниров SwissSys, в приложении Vibe Chess и во множестве самописных сервисов - открытая лицензия и простой файловый интерфейс делают его удобным для встраивания.

Какая версия bbpPairings актуальная?

6.0.0, вышедшая 1 февраля 2026 года - одновременно со вступлением в силу новой редакции правил системы Dutch. Предыдущие версии: 5.0.1 (2023), 5.0.0 (2022), 4.1.0 (2017).

Какой движок жеребьёвки использует Vibe Chess?

bbpPairings версии 6.0.0 с флагом --dutch. Приложение собирает файл TRF из истории турнира, движок возвращает пары тура. Одобрения комиссии ФИДЕ SPP у сервиса нет, правила системы Dutch при этом соблюдаются.

БесплатноПриложение для турниров

Первый турнир можно провести без опыта

Приложение подсказывает порядок шагов и не даст запутаться: оно само знает, когда объявлять следующий тур и кто с кем играет. Создание турнира бесплатное.

  1. 1Создать событие: дата, место, контроль времени, число туров
  2. 2Открыть запись и отправить ссылку участникам
  3. 3Начать турнир и объявить пары первого тура
  4. 4Внести результаты и показать таблицу - приложение посчитает всё за вас
  • Швейцарская система. рабочий вариант для первого турнира: 4 тура, любой состав
  • Круговая система. если собралось меньше десяти человек
  • Свободная встреча. если для первого раза турнир кажется слишком серьёзным

Не только бот: приложение, правила ФИДЕ и отчёт TRF

  • Приложение. Кроме бота есть приложение - в Telegram и просто по ссылке vibechess.ru/app: афиша событий города, состав турнира, живая таблица, ход тура, профиль и история партий - всё, что неудобно читать сообщениями.
  • Жеребьёвка по правилам ФИДЕ. Пары считает bbpPairings - открытый движок, реализующий систему Dutch: группы по очкам, переносы при нечётном составе, чередование цветов, без повторных встреч и без двух BYE подряд.
  • Отчёт в формате TRF. Завершённый турнир выгружается одним файлом в формате обмена данными ФИДЕ - его принимают судейские программы и федерации. В профиле для этого есть ID ФИДЕ, код ФШР, звание, пол и дата рождения.
  • Бесплатно. Всё перечисленное - без подписок, платных тарифов и лимитов на число турниров и участников.

Подробный обзор

Не хватает функции? Напишите разработчикам

Бот постоянно дорабатывается под реальные турниры. Если вам нужна возможность, которой пока нет, - командой /support прямо в боте напишите разработчикам. Многие функции появились именно по просьбам организаторов, и полезные идеи внедряются быстро.

Что почитать дальше

Как устроена сама швейцарка - шахматный турнир по швейцарской системе. Как выглядит жеребьёвка глазами организатора - жеребьёвка шахматного турнира онлайн. Откуда берутся числа в колонках - коэффициент Бухгольца и турнирная таблица. Чем движки отличаются от судейских программ - обзор программ для проведения турниров. Про сам сервис - о проекте Vibe Chess.