数据结构和接口;锦标赛支架”;系统

本文关键字:系统 锦标赛 接口 数据结构 | 更新日期: 2023-09-27 18:14:58

背景

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

  • 单次消除
  • 双重消除
  • "真秒"双淘汰
  • 循环
  • 瑞士制
  • 。。。可能还有我以前从未听说过的更多

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

给定一个"竞争对手"的可变列表-用户可以简单地选择他们想要的括号插件和poof,就有了生成的括号!

设计挑战

我目前正在努力想象一个括号的设计;接口所需的API,更重要的是,我不知道如何将通用灵活地表示为数据结构的括号"模型"。我想是某种节点图吧?

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

  • 接受大小不等的竞争对手列表作为输入
  • 生成一个图形(或其他(结构作为输出,表示括号的"流">
  • 图形结构需要支持某种"赢/输"API,以通过括号"推进"各种竞争对手,并在进行时填充

问题

我希望我能用一种更好的方式来表达这个问题;

  • 我该怎么做
  • 你有什么想法
  • 什么接口结构最有意义
  • 如何在代码中对其进行一般建模

我的初始Flailings

除非我把一些代码写在纸上,否则这不会是一个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);
}

一开始,我第一次尝试就发现了一些缺点;

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

数据结构和接口;锦标赛支架”;系统

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

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

如果一名选手在下一轮比赛中没有被安排上场,他们就"出局"了。也许括号系统可以返回代表当前地位的竞争对手的有序列表,甚至可以返回包含统计信息的自定义CompetitorAndScore类?