代码之家  ›  专栏  ›  技术社区  ›  FryGuy

双Elmination锦标赛的数据结构

  •  8
  • FryGuy  · 技术社区  · 17 年前

    我正在将我的锦标赛组织者软件(允许创建和操作双淘汰赛)转换为使用MVVM设计模式,以便更容易测试。在这样做的过程中,我将“模型”从UI中直接操作括号结构的一些代码中分离出来。

    这将是我为处理锦标赛而编写的软件的第三次迭代。第一个是用PHP编写的,并将数据存储在数据库中。第二个版本是我制作的WPF版本,它将数据存储在内存中,然后将其序列化为XML文件。然而,在这两个版本中,我觉得实现的某些方面并不干净,似乎它们违反了干法。

    如果您是从头开始创建一个数据结构来处理双消元括号,您会怎么做?

    编辑:为了说明这一点,数据结构需要处理双淘汰赛,因此,一场比赛的赢家最终可能会与另一场比赛的输家竞争。

    4 回复  |  直到 17 年前
        1
  •  2
  •   dnord    17 年前

    但他们是成对的,每对都有一个赢家。在中间括号中,赢家实际上是从括号中出现的,所以我认为你的括号物体看起来像:

    public class Bracket
    {
        Team winner;  //if this is null or whatever, then we don't have a winner yet
        Bracket topBracket;  
        Bracket bottomBracket;
    }
    

    …当你实例化你的目标时,你只需将两个子括号保留为空,只有一个获胜者。

        2
  •  1
  •   FryGuy    14 年前

    class Match
    {
        string Id;
        MatchSeat red;
        MatchSeat blue;
        MatchSeat winner;
        MatchSeat loser;
    }
    
    class MatchSeat
    {
        string Id;
        Entry Entry;
    }
    

    然后为了设置它,我制作了一些助手函数,这些函数获取了括号信息并构建了结构。

    { "1", "seed1", "seed4", "W1", "L1" },
    { "2", "seed2", "seed3", "W2", "L2" },
    { "3", "W1", "W2", "W3", "L3" },
    { "4", "L1", "L2", "W4", "L4" },
    { "5", "W4", "L3", "W5", "L5" },
    { "F", "W3", "W5", "WF", "WF" }
    

    然后,当种子和赢家/输家被填写时,该值仅在一个位置设置。

        3
  •  0
  •   Pete    17 年前

        4
  •  0
  •   John Gietzen    16 年前

    我刚刚注意到另一个问题的侧栏上有一个问题,我想我应该插话:

    我正在开发一个全功能的锦标赛API,我正在开源它。

    它还没有创建双淘汰赛,但是最近修改了单淘汰赛的数据结构,以支持双elim树结构。

    http://tournaments.codeplex.com/