Table de berger pour la gestion de championnat

Contenu du snippet

Ce petit programme affiche une page permettant de sélectionner un nombre d'équipes et affiche l'organisation des journées des matchs aller en se basant sur la table de Berger.

Source / Exemple :


<?php
	//*********************************************************************************************
	// Tables de Berger pour le volley
	//
	//*********************************************************************************************
	//
	// Sources : http://www.barrychessclub.org.uk/berger2001.htm (1)
	//           Ligue de Poitou-Charentes de Volley-Ball (2)
	//
	// (1) : constitution des journees (methode)
	// (2) : melange des journees pour obtenir le championnat (deduction pour 6, 8, 10 equipes)
	//
	//*********************************************************************************************
	// Version : 0.1
	//
	//*********************************************************************************************
	//
	// Principe :
	//   - pour n equipes (n pair)
	//   - constituer un tableau T1 de 2 colonnes et n/2 lignes
	//   - remplir le tableau en commencant en haut a gauche dans le sens anti-horaire
	//      1   n
	//      2  n-1
	//      3  n-2
	//       ...
	//    n/2  n/2 +1
	//   - a partir de T1, on cree T2 en gardant n fixe en haut a droite
	//  et en faisant tourner les autres d'un cran dans le sens horaire
	//      2     n
	//      3     1
	//      4     n-1
	//         ...
	//    n/2 +1  n/2 +2
	//   - on repete l'operation pour avoir n-1 tableaux
	//   - la correspondance entre les tableaux Ti et les journees de championnat Ji
	//  est alors :
	//     J1   -> T1
	//     J2   -> Tn/2
	//     J3   -> Tn-1
	//     J4   -> Tn/2-1
	//     J5   -> Tn-2
	//     J6   -> Tn/2-2
	//       ...
	//     Jn-2 -> T2
	//     Jn-1 -> Tn/2+1
	//   - pour les journees paires, pour le 1er match de la journee, on inverse
	//  Domicile et Exterieur (donc pour l'equipe n). Sinon, elle ferait tous ses matchs aller
	//  a l'exterieur...
	//
	//*********************************************************************************************
	//
	// Historique :
	//    v.0.1     mars 2003   Creation
	//
	//*********************************************************************************************

//-----------------------------------
// Page pour test
	echo "<html><title>Tables de Berger</title><body>\n";

	// Saisie du nombre d'equipes
	// Par defaut = 0
	if ( ! isset($HTTP_POST_VARS['nb'])) $nb=0;
	echo "<form name='form' action='' method='post'>\n",
		 "Nombre d'équipes du championnat :<br>\n",
		 "<select name='nombre' onchange='form.nb.value=form.nombre[form.nombre.selectedIndex].value'>\n",
		 "<option value='0'>----\n",
		 "<option value='6'>5-6\n",
		 "<option value='8'>7-8\n",
		 "<option value='10'>9-10\n",
		 "<option value='12'>11-12\n",
		 "<option value='14'>13-14\n",
		 "<option value='16'>15-16\n",
		 "<option value='18'>17-18\n",
		 "<option value='20'>19-20\n",
		 "<option value='22'>21-22\n",
		 "<option value='24'>23-24\n",
		 "</select>\n",
		 "<input type='hidden' name='nb' value=$nb>\n",
	     "<input type='submit' name='submit' value='afficher'>\n",
	     "</form>\n",
		 "<br><br>source<a href='berger.php3.txt'>ici</a><br>\n",
		 "<br><br>Fichier Excel pour comprendre<a href='berger.xls'>ici</a><br>\n";

	if ( $nb > 0 )
	{
		echo "<hr noshade>\n";
		echo "Nombre d'équipes : ".$nb."<br>\n";
		echo "Matchs aller uniquement<br>\n";
		echo berger_affiche ( berger_calcule ($nb) );
	}

	echo "</body></html>\n";
// Fin de la page
//-----------------------------------

//------------------------------------
// Fonction berger_calcule
//
// Parametres : nb_equipe = nombre d'equipes
// Retour     : tableau des journees a 3 dimensions
//              pour une journee j, le match m donne
//              $tableau[$j]["D"][$m] recoit $tableau[$j]["E"][$m]
//
// Calcule les journees
//
function berger_calcule ($nb_equipe)
{
	// Si le nombre d'equipes est impair
	// on passe au nombre pair juste apres
	if ( ($nb_equipe % 2) == 1 ) $nb_equipe++;
	// Moitie des equipes
	$moitie=$nb_equipe/2;
	// Tableau de sortie a deux dimensions : journee, matchs
	$tableau=array();
	for ($j=1; $j<=$nb_equipe-1; $j++)
	{
		$tableau[$j]=array();
		$tableau[$j]["D"]=array();   // Domicile
		$tableau[$j]["E"]=array();   // Exterieur
		// Traitement particulier de la premiere ligne
		$tableau[$j]["D"][1]=$j;
		$tableau[$j]["E"][1]=$nb_equipe;
		for ($m=2; $m<=$moitie; $m++)
		{
			$dom=$j+$m-1;
			if ( $dom >= $nb_equipe ) $dom++;
			$ext=$nb_equipe+$j-$m;
			if ( $ext >= $nb_equipe ) $ext++;
			$tableau[$j]["D"][$m]= ( $dom % $nb_equipe );
			$tableau[$j]["E"][$m]= ( $ext % $nb_equipe );
		}
	}
	// On cree journee a partir de tableau
	// en "melangeant" les colonnes (tableau[journee])
	$journee=array();
	for ($j=1; $j<=$nb_equipe-1; $j++)
	{
		$journee[$j]=array();
		$journee[$j]["D"]=array();
		$journee[$j]["E"]=array();
	}
	// 1ere journee
	$journee[1]=$tableau[1];
	$journee[2]=$tableau[$nb_equipe-1];
	// autres journees
	for ($j=2; $j<=$nb_equipe-1; $j++)
	{
		if ( ($j % 2) == 0)
		{
			// Cas $j pair
			$indice = ($nb_equipe / 2) - ( ($j -2)/2 );
		}
		else
		{
			// Cas $j impair
			$indice = $nb_equipe - ( ($j-1) / 2 );
		}
		$journee[$j]=$tableau[$indice];
	}
	// On balaye les journees paires
	// pour alterner Domicile-Exterieur pour l'equipe $nb_equipe
	// donc uniquement pour le 1er match de chaque journee
	for ($j=1; $j<=$nb_equipe-1; $j++)
	{
		// Journee paire
		if ( ($j % 2) == 0 )
		{
			// On recupere les valeurs
			$dom=$journee[$j]["D"][1];
			$ext=$journee[$j]["E"][1];
			// On inverse
			$journee[$j]["D"][1]=$ext;
			$journee[$j]["E"][1]=$dom;
		}
	}
	return $journee;
}
//
//------------------------------------

//------------------------------------
// Fonction berger_affiche
//
// Parametres : tableau des journees a 3 dimensions
//              pour une journee j, le match m donne
//              $tableau[$j]["D"][$m] recoit $tableau[$j]["E"][$m]
// Retour     : chaine d'affichage des journees (table)
//
// Genere la table d'affichage des journess
//
function berger_affiche ($journee)
{
	// Nombre de journees
	$nb_jour=sizeof($journee);
	// Largeur des colonnes
	$width=round(100/$nb_jour);
	// Nombre de matches ( (nombre de journees +1) / 2)
	$nb_match=($nb_jour+1)/2;
	// Initialisation de la table
	$sortie="<table width='100%' border='1'>\n";
	// Ligne d'entete
	$sortie .= "   <tr>\n";
	for ($j=1; $j<=$nb_jour; $j++)
	{
		$sortie .= "     <td align='center' width='".$width."%'><b>J ".$j."</b></td>\n";
	}
	$sortie .= "   </tr>\n";
	// Affichage des matches
	for ($m=1; $m<=$nb_match; $m++)
	{
		$sortie .= "   <TR>\n";
		for ($j=1; $j<=$nb_jour; $j++)
		{
			$sortie .= "     <td align='center' width='".$width."%'>".$journee[$j]["D"][$m]."-".$journee[$j]["E"][$m]."</td>\n";
		}
		$sortie .= "   </tr>\n";
	}
	// Fermeture de la table
	$sortie .= "</table>\n";
	return $sortie;
}
//
//------------------------------------

?>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.