不确定最好的方法吗? 我想创建一个由2,4,8,16,32等队组成的锦标赛。
前两名获胜者将获得下两场比赛的冠军。 一直到有胜利者为止。 Like this
任何人都可以帮助我吗?
确定更多信息。
最初我想想办法用2,4,8,16等创建锦标赛。 然后当我拥有所有用户时,如果他们是16个玩家,则有8个装置。 此时我将把夹具发送到数据库。
当所有获胜的玩家都进入下一轮时,我会再次想要为2位获胜者再次进行sql查询。
你能理解我的意思吗?
答案 0 :(得分:6)
锦标赛中的回合数量为log2(玩家)+ 1,只要玩家是您在上面指定的数字之一。使用此信息,您可以计算出有多少回合。最后一轮包含最终获胜者。
我将玩家信息存储起来(最好的做法是推特)
Tournament
Name
Size
Players
Tournament
Name
Position (0 to tournament.size - 1)
Rounds
Tournament
Round
Position (max halves for each round)
Winner (player position)
请注意,在下面的所有查询中,我都没有包含“锦标赛= [锦标赛]”来识别锦标赛。他们都需要它。
使用一个查询查询它并根据不同轮次的需要拆分它是相当简单的。你可以做这样的事情来获得下一个对手(假设有一个)。对于第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
如果没有,下一位玩家没有决定,或者存在差距(不允许间隙!)
如果用户上次Round.Position很奇怪,你需要确保他们下面有一个用户并且他们下面有一个胜利者,否则他们应该自动晋升到下一轮(因为没有人可以玩) )
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表有点暧昧。实际上,它应该命名为匹配。比赛是两名获胜者之间的比赛。最终表应该看起来更像这样(只更改了名称): 火柴 比赛 回合 位置(每轮最多一半) 获胜者(球员位置)
希望这会让它更加清晰。当两个玩家相互竞争时(在匹配中),您将该信息存储在此匹配表中。这个特定的实现取决于比赛的位置,以了解哪些球员参加。
我开始将轮次编号为1,因为在我的实现中更清楚。如果你选择的话,你可以选择0(或者甚至做一些完全不同的东西,如后退词)。
在第一轮比赛中,比赛1意味着球员1和2参加。在比赛2中,球员3-4参加。基本上第一轮只是球员的位置和位置+ 1参加。如果您需要更多访问权限,也可以将此信息存储在轮次表中。每次我在程序中使用这些数据时,我都需要所有的回合和玩家信息。
在第一轮比赛结束后,你会看到最后一轮比赛。在第2轮比赛中,比赛1和2的获胜者参加比赛。第2轮比赛,比赛2,比赛3和4的获胜者参加。它应该看起来很熟悉,除了它在第1轮之后使用匹配表。我确信有更好的方法来完成这个重复的任务,我只是没有足够的时间来重构代码(它被重构,只是不是那样的多)。
答案 1 :(得分:0)
使用数组并从主阵列中删除丢失的团队。 (但请将它们放在一个单独的阵列上,以供参考和重用)。