务实地管理淘汰赛

Managing a Elimination Tournament Pragmatically

我正在 Ruby 中创建一个库,以使用 Rails 管理一组锦标赛样式(主要用于我正在为另一个组构建的项目)。我希望图书馆能够处理多种锦标赛风格(即单败淘汰赛、双败淘汰赛、循环赛),但不幸的是,我无法真正理解整个事情。

首先,我们假设类 TournamentMatchTeam 都已定义。我需要创建一个可变数量的单场淘汰锦标赛(我们在这里假设 17)。创建锦标赛时,我需要创建锦标赛中的所有 Matches 并将它们存储在实例变量 @matches 中,以及相应的 Matches 和 Team 作为来源。当我调用 Tournament.create 时,我给它一个 Team 的数组,它们将在锦标赛中出现。那么在Tournament#create_single_elimination中如果Tournament.create的内容是这样的话,我需要做什么:

module Tournament
  def self.create(teams:, type: :single)
    tournament = Tournament.new(type)

    case type
    when :single
      tournament.create_single_elimination(teams)
    # ...
    else
      # ...
    end
  end

  def create_single_elimination(teams)
    # ???
  end
end

Matches 可以用 #new 方法创建,为了引用 Match 的来源,你可以只添加到 Match 上的数组] 名为 #sources:

match.sources << team

匹配源可以是 MatchTeam,但只能是这两者。

像这样的东西适合我

Team = Struct.new(:name)
Match = Struct.new(:sources)

def matches(sources)
  this_round = sources.each_slice(2).collect {|pair| Match.new(pair)}
  if this_round.length > 1
    this_round + matches(this_round)
  else
    this_round
  end
end

这一次构建一个回合的比赛..

您可能需要考虑在执行此操作之前对团队进行洗牌,以及如果团队的数量不是 2 的幂,那么您想要做什么(目前您可以将此代码的作用解释为给出任何没有对手的人都会自动获胜,但这可能不是你想做的,而且比其他任何事情都更偶然)