不确定最佳方法是什么? 我想创建一个2、4、8、16、32等队伍的锦标赛表。
第一组的获胜者将与下一组的获胜者进行比赛,以此类推,直到决出胜者。 像这样
有人能帮我吗?
好的,更多信息。
首先,我想找到一种创建包含2、4、8、16等数量队伍的锦标赛表的方法。 然后,当我安排好所有用户时,如果他们是16名选手,则会有8个比赛场次。 此时,我将把比赛场次发送到数据库中。
当所有获胜者晋级下一轮时,我会再次进行另一个SQL查询,以便找到两个获胜者之间的比赛。
你能理解我的意思吗?
不确定最佳方法是什么? 我想创建一个2、4、8、16、32等队伍的锦标赛表。
第一组的获胜者将与下一组的获胜者进行比赛,以此类推,直到决出胜者。 像这样
有人能帮我吗?
好的,更多信息。
首先,我想找到一种创建包含2、4、8、16等数量队伍的锦标赛表的方法。 然后,当我安排好所有用户时,如果他们是16名选手,则会有8个比赛场次。 此时,我将把比赛场次发送到数据库中。
当所有获胜者晋级下一轮时,我会再次进行另一个SQL查询,以便找到两个获胜者之间的比赛。
你能理解我的意思吗?
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表。我相信有更有效的方法来执行这个重复的任务,只是我从来没有足够的时间重构那段代码(它被重构过,只是不多)。