Как я могу сгенерировать турнир с круговым турниром на PHP и MySQL? - PullRequest
2 голосов
/ 18 марта 2009

Мне нужно генерировать последовательности игр, используя алгоритм циклического перебора. У меня есть страница php, где пользователь может ввести название турнира, который будет вставлен в базу данных, и у него есть выпадающее меню до 32 команд (выберите количество команд).

Так что, если я выберу 4 команды на странице, то из команды 1 в команду 4 будет 6 матчей, потому что каждая команда играет одну команду один раз. Я знаю, как работает алгоритм, но я не совсем уверен, как написать запрос для этого.

Я создал таблицу команды:

Team_id    01     02     03     etc
Team_name  Team1  Team2  Team3  etc.

Что мне делать отсюда?

Ответы [ 2 ]

12 голосов
/ 27 апреля 2012

Я создал функцию roundrobin с нуля, так как думал, что будет проще получить те же результаты, а также позволил мне использовать массивы, заполненные строками, а не числами.

Поскольку я извлекаю список имен из базы данных и добавляю в массив, я теперь могу планировать это непосредственно с помощью функции ниже. Никаких дополнительных шагов не требуется, чтобы связать номера с именами и т. Д.

Пожалуйста, не стесняйтесь попробовать, и если это сработает, оставьте комментарий. У меня также есть версия, которая допускает двухстороннее (домой и обратно) расписание или вариант случайного выбора. Если кому-то это интересно, оставьте комментарий.

<?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>";
}
?>

Оставьте записку, если она сработала для вас или если вы заинтересованы в двухсторонней версии с перемешиванием.

8 голосов
/ 18 марта 2009

Существует довольно простой алгоритм выполнения циклического сопоставления, мое решение будет следующим (в псевдокоде):

  • извлекает все команды из базы данных в массив в любом порядке
  • для (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:

1 2
3 4

Раунд 2:

1 4
2 3

Раунд 3:

1 3
4 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...