不确定最好的方法是什么?
我想创建一个由 2、4、8、16、32 等团队组成的锦标赛支架。

前两个的获胜者将与接下来的两个获胜者进行比赛,以此类推。
一直到有赢家为止。
Like this

谁能帮我?

好的,更多信息。

最初我想想出一种方法来创建 2、4、8、16 等锦标赛。
然后当我让所有用户都到位时,如果他们是 16 名球员,那么有 8 场比赛。
此时我会将夹具发送到数据库。

当所有获胜的玩家都进入下一轮时,我希望再次对相遇的 2 个获胜者进行另一个 sql 查询。

你能明白我的意思吗?

最佳答案

几年前我做过类似的事情。这是很久以前的事情了,我不确定我是否会以同样的方式做(它并没有真正扩展到双重消除等)你如何输出它可能是一个不同的问题。我使用了 2002-2003 年的表格。今天肯定有更好的技术。

锦标赛中的回合数为 log2(players) + 1,只要玩家是您在上面指定的数字之一。使用此信息,您可以计算出有多少轮。最后一轮包含最终获胜者。

我存储了这样的玩家信息(tweek this for best practice)

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]”来标识锦标赛。他们都需要。

使用一个查询来查询它并根据不同轮次的需要将其拆分是相当简单的。你可以做这样的事情来获得下一个对手(假设有一个)。对于第 1 轮,您只需要根据是偶数还是奇数来获取下一个/上一个玩家:
SELECT * FROM Players WHERE Position = PlayerPosition + 1
SELECT * FROM Players WHERE Position = PlayerPosition - 1

对于下一轮,如果用户的最后一个 Round.Position 是偶数,则需要确保下一个位置有获胜者:
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 表有点模棱两可。实际上,它应该是命名匹配。一场比赛是两个玩家之间的比赛,获胜者。决赛 table 应该看起来更像这样(只更改了名称):
火柴
比赛
圆形的
位置(每轮最多减半)
获胜者(球员位置)

希望这让它更清楚一点。当两名玩家(在一场比赛中)相互对抗时,您将该信息存储在此 Matches 表中。这个特定的实现取决于比赛的位置来知道哪些玩家参与了。

我开始将轮次编号为 1,因为这在我的实现中更加清晰。如果您愿意,您可以选择 0(或者甚至做一些完全不同的事情,例如 go backwords)。

在第一轮中,比赛 1 表示玩家 1 和 2 参加。在第二场比赛中,3-4的球员参加了比赛。本质上第一轮只是玩家位置和位置+1参与。如果您需要更多访问权限,您也可以将此信息存储在圆形表中。每次我在程序中使用这些数据时,我都需要所有的回合和玩家信息。

第一轮之后,你看最后一轮的比赛。在第 2 轮第 1 场比赛中,第 1 场和第 2 场比赛的获胜者参加。第 2 轮第 2 场比赛,第 3 场和第 4 场比赛的获胜者参加。它看起来应该很熟悉,除了它在第 1 轮之后使用匹配表。我确信有一种更有效的方法来完成这个重复性任务,我只是没有足够的时间来重构该代码(它被重构了,只是不是那样)很多)。

关于php - 锦标赛支架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2733663/

10-13 07:39