Table de berger pour la gestion de championnat

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 748 fois - Téléchargée 27 fois

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

Ajouter un commentaire

Commentaires

calfou
Messages postés
24
Date d'inscription
dimanche 16 février 2003
Statut
Membre
Dernière intervention
18 mars 2010
-
Bonjour,

merci pour cette source!! Vraiment pile poil ce dont j'avais besoin! Je sent le mal de tête disparaitre :p

Pour les commentaires, le peut que j'en ai lu m'a suffit pour la comprendre et voir les adaptations que j'aurais à faire.

Après divers test, tout est ok sur free. Encore merci
afassi00
Messages postés
4
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
6 avril 2006
-
Le code est bien expliqué mais je doit faire la meme chose mais en java mais jarrive pas a decripter le PHP . Est ce que kelkun laurai en java ou bien juste une partie .
merci
alexmoriani
Messages postés
3
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
13 février 2008
-
Bonjour,

j'ai testé le code mais un message d'erreru apparaît systématiquement :
"
Notice: Undefined variable: nb in c:\program files\easyphp1-7\www\berger\index.php on line 215
Notice: Undefined variable: nb in c:\program files\easyphp1-7\www\berger\index.php on line 221
"

j'ai testé plusieurs solutions (changemetn de variable, couper le code sur deux pages...) mais rien n'y fait.

pouvez vous m'aider ?
libop
Messages postés
18
Date d'inscription
vendredi 11 janvier 2002
Statut
Membre
Dernière intervention
14 décembre 2004
-
Parfaite cette source. Ca marche au poil et c'est exactement ce que je cherchais. Adapté en seulemetn qqs minutes à mon besoin.
Vraiment parfait !

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.