0

背景

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

  • 单淘汰
  • 双重淘汰
  • “真秒”双淘汰
  • 循环赛
  • 瑞士制
  • ...而且可能还有更多我以前从未听说过的东西。

对于每种类型的锦标赛,我想将“括号算法”实现为通用接口的实例。通过这种方式,我可以使系统具有可扩展性,并且将来可以轻松添加对附加括号的支持。

给定一个可变的“竞争对手”列表 - 用户可以简单地选择他们想要的括号插件和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);
}

马上,我第一次尝试就发现了一些缺点;

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

1 回答 1

1

只是在这里集思广益,但我想我也会模拟 a 的概念Round。对于淘汰系统,回合已经有意义,但您也应该能够模拟其他系统的回合。我认为他们的总轮数可以预先确定。

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

如果参赛者在下一轮比赛中没有参加比赛,他们就“出局”。也许括号系统可以返回代表当前排名的竞争对手的有序列表,或者甚至是CompetitorAndScore包含统计数据的自定义类?

于 2016-10-26T18:07:19.270 回答