Как я могу создать турнир с круговым движением в PHP и MySQL?

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

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

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

Team_id 01 02 03 etc Team_name Team1 Team2 Team3 etc. 

Что мне делать дальше?

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

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

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

 <?php /** * @author DDM 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>"; } ?> 

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

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

  • вывести все команды из базы данных в массив, в любом порядке
  • for (i = 1; i <количество команд; i ++)
    • печать матчей для Round #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