Spielplan für eine Liga in PHP generieren

Nachdem ich seit geraumer Zeit schon auf der Suche nach einem Weg war um einen Spielplan zu generieren und die eigenen Versuche mit diversen Skizzen irgendwie nicht zum gewünschten Ergebnis geführt haben wurde ich schließlich im Internet fündig.

Auf der Internetseite http://www.x3m.ch wurde ich schließlich fündig. Andy Theiler hatte dort einen Algorithmus umgesetzt, welcher schnell und unkompliziert einen Spielplan generiert. Leider war es nicht möglich auch eine ungerade Zahl an Teams für die Berechnung zu verwenden.

Mit ein paar Veränderungen ist es nun möglich, auch z.B. einen Spielplan mit 5 Spielern zu generieren. In diesem Fall wird einfach in der Klasse die Anzahl der Teams um eins erhöht. Dadurch funktioniert die Berechnung. Da wir aber natürlich nur ein Team weniger haben, werden die Spiele, die mit dem zusätzlichen Team zusammenhängen aussortiert. Würde also bedeuten, dass pro Spieltag ein Team nicht dabei wäre. Im Endeffekt jedoch jeder einmal, bzw. mit Rückrunde zweimal, gegeneinander gespielt hat.

Im Anschluss befindet sich noch die in PHP programmierte Klasse zusammen mit meinen Ergänzungen. Wer das Original sucht, sollte hier einmal vorbei schauen.

/**
* Spielplan generieren
*
* Spielplan generieren nach dem „Kantenfärbungs Algorithums“.
* Quelle: http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo36.php
*
* ———————————————————————
* Support/Info/Download: http://codezonex.x3m.ch oder http://www.x3m.ch
* ———————————————————————
*
* @package    x3m
* @version    1.0.01 für PHP5
* @author     Andy Theiler <andy@x3m.ch>
* @copyright  Copyright (c) 1996 – 2007, Xtreme Software GmbH, Switzerland (www.x3m.ch)
* @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
*/
abstract class x3m_Spielplan {

public static function build ($teams = 4, $start_date = 20070101, $interval = 7, $mit_rueckrunde = true) {

$ungerade = false;
// Wenn ungerade werden Teams um 1 erhöht
if (($teams % 2) != 0) { $ungerade = true; $teams++; }

// — Spielpaarungen bestimmen —————————————
$n      = $teams – 1;
$spiele = array();

for ($i = 1; $i <= $teams – 1; $i++) {
$h = $teams;
$a = $i;
// heimspiel? auswärtsspiel?
if (($i % 2) != 0) {
$temp = $a;
$a    = $h;
$h    = $temp;
}

// Ist die Teamanzahl ungerade werden nur die Begegnungen der ursprünglichen Teams gezählt
if ($ungerade == true && ($h == $teams || $a == $teams)) {}
else {
$spiele[] = array(‚h‘        => $h,
‚a‘        => $a,
’spieltag‘ => $i);
}

for ($k = 1; $k <= (($teams / 2) – 1); $k++) {

if (($i-$k) < 0) {
$a = $n + ($i-$k);
}
else {
$a = ($i-$k) % $n;
$a = ($a == 0) ? $n : $a; // 0 -> n-1
}

$h = ($i+$k) % $n;
$h = ($h == 0) ? $n : $h;    // 0 -> n-1

// heimspiel? auswärtsspiel?
if (($k % 2) == 0) {
$temp = $a;
$a = $h;
$h = $temp;
}

if ($ungerade == true && ($h == $teams || $a == $teams)) {}
else {
$spiele[] = array(‚h‘        => $h,
‚a‘        => $a,
’spieltag‘ => $i);
}
}
}

// — mit Rückrunde? ——————————————————-
if ($mit_rueckrunde) {

$spiele_cnt = count($spiele);
for ($x = 0; $x < $spiele_cnt; $x++) {

$spiele[] = array(‚h‘        => $spiele[$x][‚a‘],
‚a‘        => $spiele[$x][‚h‘],
’spieltag‘ => $spiele[$x][’spieltag‘] + $n);
}
}

// — Spielplan erstellen ————————————————–
$spielplan  = array();
$spiele_cnt = count($spiele);

for ($x = 0; $x < $spiele_cnt; $x++) {

$spielplan[$spiele[$x][’spieltag‘]][] = array(‚h‘ => $spiele[$x][‚h‘],
‚a‘ => $spiele[$x][‚a‘]);
}

$start_date = strtotime($start_date);
$game_date  = date(„d.m.Y“, mktime(0, 0, 0, date(„m“, $start_date) ,
date(„d“, $start_date),
date(„Y“, $start_date)));

for ($x = 1; $x <= count($spielplan); $x++) {
$spielplan[$x][‚datum‘] = $game_date;
$game_date              = strtotime($game_date);
$game_date              = date(„d.m.Y“, mktime(0, 0, 0, date(„m“, $game_date) ,
date(„d“, $game_date)+$interval,
date(„Y“, $game_date)));
}

return $spielplan;
}
}

2 Gedanken zu „Spielplan für eine Liga in PHP generieren

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.