如何在 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 中生成循环锦标赛?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中生成时间和日期并为 mysql 格式化?

在 PHP 中生成带有动态图像的 ODT 文档

如何在 PHP 中生成 300X200 尺寸的图像缩略图?

如何使用javascript在php的输入框中生成随机值

如何在jquery中生成uuid

在php中生成连续数字[关闭]