如何在 PHP 和 MySQL 中生成循环锦标赛?
Posted
技术标签:
【中文标题】如何在 PHP 和 MySQL 中生成循环锦标赛?【英文标题】:How can I generate a round robin tournament in PHP and MySQL? 【发布时间】:2009-03-18 15:20:20 【问题描述】:我需要使用循环算法生成游戏序列。我有一个 php 页面,用户可以在其中输入将插入数据库的锦标赛名称,并且它有一个下拉菜单,最多 32 支球队(选择球队数量)。
因此,如果我在页面中选择 4 支球队,那么将从 1 队到 4 队,这将是 6 场比赛,因为每支球队都与另一支球队比赛一次。我知道算法是如何工作的,但我不太确定如何为此编写查询。
我创建了桌队:
Team_id 01 02 03 etc
Team_name Team1 Team2 Team3 etc.
我应该从这里做什么?
【问题讨论】:
这不是重复的:***.com/questions/631259/… 【参考方案1】:我从头开始创建了一个循环函数,因为我认为它可能更容易获得相同的结果,并且还允许我使用直接填充字符串而不是数字的数组。
因为我从数据库中提取了一个名称列表并添加到一个数组中,所以我现在可以使用下面的函数直接安排它。无需额外步骤即可将数字链接到名称等。
请随意尝试,如果有效,请发表评论。 我还有一个版本,它允许 2 路(家庭和返回)日程安排和/或随机播放选项。如果有人对此感兴趣,那么也发表评论。
<?php
/**
* @author D.D.M. van Zelst
* @copyright 2012
*/
function scheduler($teams)
if (count($teams)%2 != 0)
array_push($teams,"bye");
$away = array_splice($teams,(count($teams)/2));
$home = $teams;
for ($i=0; $i < count($home)+count($away)-1; $i++)
for ($j=0; $j<count($home); $j++)
$round[$i][$j]["Home"]=$home[$j];
$round[$i][$j]["Away"]=$away[$j];
if(count($home)+count($away)-1 > 2)
array_unshift($away,array_shift(array_splice($home,1,1)));
array_push($home,array_pop($away));
return $round;
?>
如何使用,例如创建一个数组,如:
<?php $members = array(1,2,3,4); ?>
或
<?php $members = array("name1","name2","name3","name4"); ?>
然后调用函数根据上面的数组创建你的日程安排:
<?php $schedule = scheduler($members); ?>
要显示结果数组时间表,只需执行以下操作或您喜欢的任何方式: 这个小代码以一种很好的格式显示日程安排,但你可以随意使用它。
<?php
foreach($schedule AS $round => $games)
echo "Round: ".($round+1)."<BR>";
foreach($games AS $play)
echo $play["Home"]." - ".$play["Away"]."<BR>";
echo "<BR>";
?>
如果它对您有用,或者如果您对带有随机播放的 2-way 版本感兴趣,请留言。
【讨论】:
工作完美! +1 由于一个错误,我最终使用了 array_unshift($visitTeams, current(array_splice($homeTeams,1,1)) );注意“current”而不是“array_shift” 赞成。看起来不错并且经过测试,但它有一个问题:一支球队一直在主场比赛。有没有办法解决这个问题?我也对 2-way 版本感兴趣。 这太酷了!!如果您也可以在这里发布,我也会很高兴看到带有家庭/离开选项的版本,谢谢:) 偶数时完美,奇数时失败【参考方案2】:循环赛有一个相当简单的算法,我的解决方案如下(伪代码):
以任意顺序将所有团队从数据库中提取到一个数组中 for (i = 1; i 第 #i 轮打印比赛: 阵列前半部分的球队与阵列后半部分的球队以相同的顺序匹配。也就是说,任何索引 [n] 的团队与索引 [n + 一半团队数量] 的团队匹配。如果您有 32 个团队,则 [0] 与 [16] 匹配,[1] 与 [17] 匹配,以此类推,直到 [15] 和 [31]。 现在,通过阵列“轮换”团队,但将阵列中的第一个留在原地。也就是说,[1] 变为 [2],[2] 变为 [3],...,直到 [31] 变为 [1],但不要移动索引 [0] 处的团队。就是这样,它将产生您需要的所有对决。
一个例子,有 4 个团队:
数组的前半部分在顶部,后半部分在底部,匹配是彼此上方/下方的数字。数组索引(为了说明我的确切意思):
[0] [1]
[2] [3]
第一轮:
1 2
3 4
第二轮:
1 4
2 3
第三轮:
1 3
4 2
【讨论】:
我的截止日期是星期五......我是这个编程的新手......你能帮帮我吗???? 我不想。您在“答案”中输入的代码尝试表明您根本不了解自己在做什么,并且仅仅将解决方案交给您作业对您的情况没有帮助。算法的所有步骤都很简单,去阅读一些基本的PHP教程。 嘿乍得,你能写下你解释给我的数组吗! 在您的建议下,我认为我走在了正确的轨道上:mysql_fetch_array...right 算法不错,但有一个问题——一支球队总是在主场比赛。如果一支球队在客场或主场参加的次数不超过 2 次,那就太好了。有可能吗?以上是关于如何在 PHP 和 MySQL 中生成循环锦标赛?的主要内容,如果未能解决你的问题,请参考以下文章