Структуры данных и интерфейсы для расширяемой системы "Турнирная скобка"
Фон
Я нахожусь на ранних стадиях написания приложения "турнирной скобки" (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
класс, который содержит статистику?