我需要使用循环算法生成游戏序列。我有一个php页面,用户可以在其中输入将插入到数据库中的锦标赛名称,并且它有一个最多32个团队的下拉菜单(选择团队数量)。
因此,如果我在页面中选择4个团队,那么它将从团队1到团队4,这将是6个匹配,因为每个团队一次扮演另一个团队。我知道算法是如何工作的,但我不太清楚如何为此编写查询。
我创建了表团队:
Team_id 01 02 03 etc
Team_name Team1 Team2 Team3 etc.
我该怎么做?
答案 0 :(得分:12)
我从头开始创建了一个roundrobin函数,因为我认为可能更容易得到相同的结果,并且允许我直接使用填充字符串的数组而不是数字。
因为我从数据库中提取名称列表并添加到数组中,我现在可以使用以下函数直接计划。不需要额外的步骤将数字链接到名称等。
请随意尝试,如果有效,请发表评论。 我还有一个版本允许2路(家庭和返回)时间表和/或随机播放选项。如果somone对那个感兴趣,那么也可以留下一个cament。
<?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>";
}
?>
如果它适用于您,或者如果您对带有随机播放的双向版本感兴趣,请留言。
答案 1 :(得分:8)
有一个相当简单的算法来进行循环赛对战,我的解决方案如下(伪代码):
就是这样,这将产生你需要的所有比赛。
一个例子,有4个团队:
阵列的前半部分位于顶部,后半部分位于底部,匹配是数字高于/低于对方。数组索引(以说明我的意思):
[0] [1]
[2] [3]
第1轮:
1 2
3 4
第2轮:
1 4
2 3
第3轮:
1 3
4 2