数据结构和接口,用于可扩展的“Tournament Bracketing”系统

时间:2016-10-26 15:45:15

标签: c# interface tournament

背景

我正处于编写“锦标赛包围”应用程序的早期阶段(C#,尽管任何面向对象的语言都是合适的)。理论上,此应用程序将为多种类型的锦标赛生成括号表:

  • 单消除
  • 双消除
  • 使用“true second”进行双重淘汰
  • 循环赛
  • 瑞士系统
  • ...可能以前我从未听说过。

对于每种类型的锦标赛,我都希望将“括号算法”实现为通用界面的实例。通过这种方式,我可以使系统可扩展,并在将来轻松添加对其他括号的支持。

鉴于“竞争对手”的变量列表 - 用户可以简单地选择他们想要的括号插件和 poof ,这就是生成的括号!

设计挑战

我目前正在努力想象一个包围设计;接口所需的API,更重要的是 - 我不确定如何一般灵活地代表括号'模型'作为数据结构。我想是某种节点映射?

理想情况下,我需要接口:

  • 接受可变大小的竞争者列表作为输入
  • 生成图形(或其他)结构作为输出,表示括号的“流程”。
  • 图形结构需要支持某种“赢/输”API,通过括号“推进”各种竞争对手,然后将其填入。

问题

我希望我有更好的方式来表达这个问题;

  • 我怎么做'dis?
  • 你有什么想法?
  • 哪种界面结构最有意义?
  • 如何在代码中对此进行一般建模?

我的初始违规

除非我将一些代码放在纸上,否则它不会是StackOverflow问题。这是我最初的想法;

// 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);
}

马上,我可以看到第一次尝试的一些缺点;

  • 我如何代表整个支架的“赢家”?
  • 我如何代表那些已被“淘汰”的失败者?
  • 如何表示支架已完成/已解决?解析的括号是什么样的?
  • 这个框架是否支持“奇怪”的括号,这些括号不属于简单的“消除”模式(例如循环法)?

1 个答案:

答案 0 :(得分:1)

在这里集思广益,但我想我也会模仿Round的概念。对于消除系统轮次已经有意义,但你应该能够为其他系统模拟轮次。我认为可以预先确定所有轮次的总数。

每一轮都有比赛,每场比赛都有赢家和输家,支架系统的实施将能够在一轮完成后产生下一场比赛,并提供每场比赛的结果。

如果竞争对手在下一轮比赛中没有参加比赛,他们就会出现#34; out&#34;。也许支架系统可以返回代表当前状态的竞争者的有序列表,甚至是包含统计信息的自定义CompetitorAndScore类?