务实地管理淘汰赛
Managing a Elimination Tournament Pragmatically
我正在 Ruby 中创建一个库,以使用 Rails 管理一组锦标赛样式(主要用于我正在为另一个组构建的项目)。我希望图书馆能够处理多种锦标赛风格(即单败淘汰赛、双败淘汰赛、循环赛),但不幸的是,我无法真正理解整个事情。
首先,我们假设类 Tournament
、Match
和 Team
都已定义。我需要创建一个可变数量的单场淘汰锦标赛(我们在这里假设 17)。创建锦标赛时,我需要创建锦标赛中的所有 Match
es 并将它们存储在实例变量 @matches
中,以及相应的 Match
es 和 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
Match
es 可以用 #new
方法创建,为了引用 Match
的来源,你可以只添加到 Match
上的数组] 名为 #sources
:
match.sources << team
匹配源可以是 Match
或 Team
,但只能是这两者。
像这样的东西适合我
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 的幂,那么您想要做什么(目前您可以将此代码的作用解释为给出任何没有对手的人都会自动获胜,但这可能不是你想做的,而且比其他任何事情都更偶然)
我正在 Ruby 中创建一个库,以使用 Rails 管理一组锦标赛样式(主要用于我正在为另一个组构建的项目)。我希望图书馆能够处理多种锦标赛风格(即单败淘汰赛、双败淘汰赛、循环赛),但不幸的是,我无法真正理解整个事情。
首先,我们假设类 Tournament
、Match
和 Team
都已定义。我需要创建一个可变数量的单场淘汰锦标赛(我们在这里假设 17)。创建锦标赛时,我需要创建锦标赛中的所有 Match
es 并将它们存储在实例变量 @matches
中,以及相应的 Match
es 和 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
Match
es 可以用 #new
方法创建,为了引用 Match
的来源,你可以只添加到 Match
上的数组] 名为 #sources
:
match.sources << team
匹配源可以是 Match
或 Team
,但只能是这两者。
像这样的东西适合我
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 的幂,那么您想要做什么(目前您可以将此代码的作用解释为给出任何没有对手的人都会自动获胜,但这可能不是你想做的,而且比其他任何事情都更偶然)