Структуры данных и интерфейсы для расширяемой системы "Турнирная скобка"

Фон

Я нахожусь на ранних стадиях написания приложения "турнирной скобки" (C#, хотя любой объектно-ориентированный язык будет уместным). Это приложение теоретически генерировало бы таблицы для нескольких типов турниров:

  • Single-элиминирования
  • Дважды ликвидации
  • Двойное устранение с "истинной секундой"
  • По-круговой
  • Swiss-система
  • ... и, вероятно, больше, о чем я никогда раньше не слышал.

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

Учитывая переменный список "конкурентов" - пользователь может просто выбрать желаемый плагин скобки и пуф, есть сгенерированная скобка!

Проблемы дизайна

В настоящее время я изо всех сил пытаюсь визуализировать дизайн для брекетинга; необходимые API-интерфейсы интерфейса и, что более важно, я не уверен, как в общем и гибком смысле представить "модель" скобки в виде структуры данных. Думаю, какая-то карта узлов?

В идеале мне нужен интерфейс для:

  • Принять список конкурентов переменного размера в качестве входных данных
  • Создайте графическую (или другую) структуру в качестве вывода, представляющего "поток" скобки.
  • Структура графа должна была бы поддерживать своего рода API "Win / Lose", чтобы "продвигать" различных конкурентов через скобки и заполнять их по мере необходимости.

Вопрос

Я хотел бы иметь лучший способ сформулировать этот вопрос;

  • Как я делаю?
  • о чем ты думаешь?
  • Какая структура интерфейса имеет больше всего смысла?
  • Как мне моделировать это в целом, в коде?

Мои начальные фламинги

Это не был бы вопрос Stackru, если бы я не написал код на бумаге. Вот мои первые мысли;

// A plugin interface; generates a tournament bracket, given a list of competitors
public interface IBracketSheetGenerator
{
    public IBracketSheet CreateBracket(IEnumerable<Competitor> competitors);
}

// Parent data structure, used to model a tournament bracket
public interface IBracketSheet
{
    public IEnumerable<Competitor> Competitors { get; }
    public IEnumerable<IBracketNode> Matches { get; }
}

// Node representing a single competitor match
public interface IBracketNode
{
    public Competitor Left { get; }
    public Competitor Right { get; }

    public IBracketNode Winner { get; }
    public IBracketNode Loser { get; }

    // Advance the winner to the next winner's match,
    // and the loser to the loser's match.
    public Advance(Competitor winner, Competitor loser);
}

С первой попытки я вижу некоторые недостатки;

  • Как мне представить "победителя" всей сетки?
  • Как я представляю проигравших, которые были "исключены" из скобки?
  • Как я могу сообщить, что скобка была завершена / решена? Как выглядит разрешенная скобка?
  • Поддерживает ли этот фреймворк "странные" скобки, которые не попадают в простую форму "исключения" (как, например, Round Robin)?

1 ответ

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

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

Если участник не попал на матч в следующем раунде, он "вышел". Возможно, система скобок может вернуть упорядоченный список участников, представляющих текущее положение, или даже обычай CompetitorAndScore класс, который содержит статистику?

Другие вопросы по тегам