数据结构和接口;锦标赛支架”;系统
本文关键字:系统 锦标赛 接口 数据结构 | 更新日期: 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
类?