锦标赛抽签表

4

不确定最佳方法是什么? 我想创建一个2、4、8、16、32等队伍的锦标赛表。

第一组的获胜者将与下一组的获胜者进行比赛,以此类推,直到决出胜者。 像这样

有人能帮我吗?

好的,更多信息。

首先,我想找到一种创建包含2、4、8、16等数量队伍的锦标赛表的方法。 然后,当我安排好所有用户时,如果他们是16名选手,则会有8个比赛场次。 此时,我将把比赛场次发送到数据库中。

当所有获胜者晋级下一轮时,我会再次进行另一个SQL查询,以便找到两个获胜者之间的比赛。

你能理解我的意思吗?


1
这是一个比较笼统的问题。也许您可以分享一些想法,并就特定领域提出更具体的问题? - Amber
1
你只是想创建图形,还是只是想命令一个列表来处理这个问题,或者其他什么?请更加具体,非常具体。 - Lance Roberts
如果你有31个玩家而不是32个,你想要做什么? - Mark Byers
2个回答

6
A few years ago, I did something similar to this, but it may not be the best approach nowadays. It may not work well for double-elimination or other scenarios. As for outputting the information, that's a separate issue. Back in 2002-2003, I used tables, but there are likely better techniques available now.
The number of rounds in the tournament is log2(players) + 1, provided that the number of players falls within certain parameters. With this formula, you can determine how many rounds are needed, with the final round crowning the winner.
To store player information, I used a format similar to this (which may need to be adjusted for optimal practices).
Tournament
  Name
  Size

Players
  Tournament
  Name
  Position (0 to tournament.size - 1)

Rounds
  Tournament
  Round
  Position (max halves for each round)
  Winner (player position)

在下面的所有查询中,我都没有包括"Tournament = [tournament]"来确定锦标赛。它们都需要。

使用一个查询很容易查询这个,并根据需要将其分成不同的回合。您可以像这样做,以获取下一个对手(假设有一个)。对于第一轮,您只需要根据奇偶性获取下一个/上一个玩家:

SELECT * FROM Players WHERE Position = PlayerPosition + 1
SELECT * FROM Players WHERE Position = PlayerPosition - 1

在下一轮中,如果用户上一轮的位置是偶数,则需要确保上一个位置有获胜者: SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] - 1

如果没有,下一个玩家就不能决定,或者存在间隙(不允许有间隙!)

如果用户上一轮的位置是奇数,则需要确保他们下方有用户并且下方有获胜者,否则他们应自动晋级到下一轮(因为没有人可以比赛)

SELECT COUNT(*) FROM Players WHERE Position > [Player.Position]
SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] + 1

最后,我很确定你可以使用以下内容来减少查询语句的编写:

SELECT Player FROM Rounds WHERE Position + Position % 2 = [playerRoundPosition]
SELECT Player FROM Rounds WHERE Position - Position % 2 = [playerRoundPosition]

更新:

仔细查看我的原始帖子后,我发现Rounds表有些模糊不清。实际上,它应该被命名为matches。一场比赛是两个选手之间的竞争,有一个获胜者。最终表格应该像这样(只更改了名称): 比赛 锦标赛 回合 位置(每回合的最大半数) 获胜者(选手位置)

希望这能让它更加清晰。当两个选手进行比赛时,您将该信息存储在此Matches表中。这种特定的实现取决于Match的位置,以知道哪些选手参与了比赛。

我从1开始编号回合,因为在我的实现中更加清晰。如果您选择,您可以选择0(甚至做完全不同的事情,例如向后走)。

在第一轮中,比赛1表示选手1和2参加。在比赛2中,选手3-4参加。基本上,第一轮只是选手位置和位置+1参加。如果需要更多访问权限,您还可以将此信息存储在rounds表中。每次我在程序中使用这些数据时,我都需要所有的回合和选手信息。

在第一轮之后,您将查看最后一轮比赛。在第2轮中,比赛1中,来自比赛1和2的获胜者参加。第2轮,比赛2中,来自比赛3和4的获胜者参加。它应该看起来非常熟悉,只是在第1轮之后使用了match表。我相信有更有效的方法来执行这个重复的任务,只是我从来没有足够的时间重构那段代码(它被重构过,只是不多)。


这是一个非常棒的答案。我知道log2scale,但你向我展示了它需要什么。我仍在努力理解您提供的所有信息。 您能否更好地解释“rounds”表? 那有点让我困惑。 谢谢。 - sark9012
我本可以给那个表起一个更好的名字。我已经更新了答案并加入了这些信息,希望能有所帮助。 - Reece45
感谢您提供的额外信息。我现在会尝试写出这段代码! - sark9012
@Luke 如果我们能将这个开发成一些开源库就太好了。如果你有兴趣,请联系我(请查看我的个人资料)。 - Reece45
每轮最大减半是什么意思? - sark9012
1
我想评论一下,因为我正在查看旧的答案。这让我对问题有了很好的理解,并且我在你打下的基础上创造了一个更加深入的解决方案! - sark9012

0
使用数组并从主数组中删除失败的队伍(但保留它们在一个单独的数组中,以供参考和重复使用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接