比赛支架

时间:2010-04-28 22:54:15

标签: php sql

不确定最好的方法吗? 我想创建一个由2,4,8,16,32等队组成的锦标赛。

前两名获胜者将获得下两场比赛的冠军。 一直到有胜利者为止。 Like this

任何人都可以帮助我吗?

确定更多信息。

最初我想想办法用2,4,8,16等创建锦标赛。 然后当我拥有所有用户时,如果他们是16个玩家,则有8个装置。 此时我将把夹具发送到数据库。

当所有获胜的玩家都进入下一轮时,我会再次想要为2位获胜者再次进行sql查询。

你能理解我的意思吗?

2 个答案:

答案 0 :(得分:6)

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

锦标赛中的回合数量为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)

使用数组并从主阵列中删除丢失的团队。 (但请将它们放在一个单独的阵列上,以供参考和重用)。