Liga Spielplan generieren

caschti84

Grünschnabel
Hallo zusammen!

Ich sitze nun schon länger hier und versuche nen Ansatz für nen Liga Spielplan hinzukriegen. Leider misslingt mir selbst der Ansatz :-(.

So schauts aus:

Habe eine MYSQL Tabelle mit Teilnehmern. Aus dieser Tabelle möchte ich gerne, dass jeder mal gegen jeden spielt. die Reihenfolge ist dabei egal.
Die Zahl der Mitspieler ist immer unterschiedlich, deswegen ermittel ich zuerst die Teilnehmer + mögliche Spiele

Bei 11 Spielern also gibt es dann 100 Spiele, weil jeder gegen jede, nur nicht gegen sich selbst spielt, sprich 10 * 10

Wie mach ich des nun um den Spielplan zu generieren?
Lese ich die Teilnehmer am besten in 2 Arrays und lasse sie dann in irgendeiner weise ausgeben? Habt ihr einen besseren Ansatz?

Würde mich freuen

mfg
Caschti
 
Das, was man normalerweise nicht anstrebt, könnte hier von Vorteil sein: Das karthesische Produkt.

SQL:
SELECT
    `t1`.`person` AS `player1`,
    `t2`.`person` AS `player2`
FROM
    `tabelle` AS `t1`,
    `tabelle` AS `t2`
WHERE
    `t1`.`id` != `t2`.`id`

Oder mit etwas mehr Kontrolle über die Leute, die teilnehmen sollen oder nicht:
SQL:
SELECT
    `t1`.`person` AS `player1`,
    `t2`.`person` AS `player2`
FROM
    `tabelle` AS `t1`,
    `tabelle` AS `t2`
WHERE
    `t1`.`id` != `t2`.`id` AND
    `t1`.`id` IN (<spielerliste>) AND
    `t2`.`id` IN (<spielerliste>)
(<spielerliste> ist dabei ein Pseudoplatzhalter für eine Liste der erlaubten Spieler-IDs)
 
puh, damit kann ich irgendwie nichts anfangen :-/.
Problem die Spalte der Teilnahmen ist nicht irgendwie durchnummeriert oder so, sondern nur mit usernamen bestückt. Eine Nummerierung ist auch schlecht möglich.
ich hätte ehrlich gedacht, dass man es in irgendeiner mit ner schleife generieren kann. :-(.

Hat wer noch nen weiteren Ansatz?
 
Also maeTimmae's 1. Beispiel sieht doch super aus. Versuch es doch erst einmal, bevor du nach einer anderen Lösung suchst ;) Wenn du keine ID's hast, solltest du dir vielleicht nochmal Gedanken um deine Tabellenstruktur machen!

Falls die Usernames UNIQUE sind, brauchst du in der WHERE Bedingung nur ID durch Username ersetzen.
 
Hallo,
ich würde das Rutschsystem empfehlen, welches hier anschaulich dargestellt ist. Das Prinzip dahinter ist simpel, man kann es sich so vorstellen, dass die Teilnehmer/Teams an einem Tisch paarweise einander gegenüber sitzen, nach jeder Partie rutschen alle bis auf einen, der immer auf seinem Platz bleibt, einen Platz weiter. Bei ungerader Anzahl an Teilnehmern/Teams rutschen alle ein weiter und der letzte muss aussetzen. Eine Umsetzung in PHP könnte man folgenderweise realisieren:
PHP:
<?php
// Datenbankverbindung herstellen
mysql_connect('server', 'user', 'passwort') or die('Konnte keine Verbindung zum DB-Server herstellen');
mysql_select_db('datenbank') or die('Konnte Datenbank nicht auswählen');

// Teams aus DB holen
$sql = "SELECT
			name
		FROM
			liga_teams";
$res = mysql_query($sql);

$teams = array();
while (($row = mysql_fetch_assoc($res)) !== false)
	$teams[] = $row['name'];

// Benötigte Variablen setzen
$anzahl  = count($teams);									   // Anzahl der Teams
$paare   = floor($anzahl / 2);								  // Anzahl der möglichen Spielpaare
$plan	= array();            								 // Array für den kompletten Spielplan
$tage	= ($anzahl % 2) ? count($teams) : count($teams)-1;	 // bei ungerader Anzahl an Teams brauchen wir einen Spieltag mehr
$base	= ($anzahl % 2) ? $anzahl-2 : $anzahl-1;			   // die Basis für den Array-Index, bei ungerader Anzahl an Teams
															    // fangen wir beim vorletzten Team an

for ($tag = 1; $tag <= $tage; $tag++) {
	if ($anzahl % 2) {
		// letztes Element nach vorne
		array_unshift($teams, array_pop($teams));
	} else {
		// zweites Element mit array(letztes Element, zweites Element) ersetzen,
		// also letztes Element zwischen 1. und 2. Element einfügen
		array_splice($teams, 1, 1, array(array_pop($teams), $teams[1]));
	}

	for ($spiel = 0; $spiel < $paare; $spiel++) {
		$heim = $teams[$spiel];
		$gast = $teams[$base-$spiel];

		$plan[$tag][] = array($heim, $gast);

		/* Rückrunde */
		//$plan[$tag+$tage][] = array($heim, $gast);
	}
}
ksort($plan);

// Spielplan ausgeben
echo "<h1>Spielplan</h1>\n";
foreach ($plan as $spieltag => $spiele) {
	echo "<h2>" . $spieltag . ". Spieltag</h2>\n";
	echo "<ul>\n";
	foreach ($spiele as $spielnummer => $paarung) {
		echo "<li>" . $paarung[0] . " - " . $paarung[1] . "</li>\n";
	}
	echo "</ul>\n";
}

?>

Ich hoffe, dass hilft dir weiter bei deinem Vorhaben. Falls noch Erklärungsbedarf besteht zöger nicht nachzufragen (Der, die, das, wer, wie, was, ... ;))

Schönen Gruß
Marvin
 
Zurück