[PHP] Poules et Tournois

Bon un petit problème se pose a moi… je dois programmer un utilitaire pour l’intranet de la LAN qui ferait de la gestion automatique de poule ou tournoi (style on rentre les gagnants du match précédent et ca te dit automatique contre qui tu te battra).

J’ai 2 petits problèmes: Générer la page de tournoi dynamiquement (le nombre de joueur n’est pas su a l’avance) j’ai un exemple de la gueule que ca doita voir en HTML ici: http://clanpere.ath.cx/frag/test.html, mais ca devrait etre en dynamique, or je vois mal comment faire ca pour un nombre n de joueurs.

Ensuite je dois faire la meme chose pour des poules. Cad chaque équipe dans chaque poule doit rencontrer l’autre équipe. Il faudrait que les matchs soient executés en meme temps si possible. Exemple 4 équipes:

Round 1: 1 Vs 2, 3 Vs 4
Round 2: 1 Vs 3, 2 Vs 4
Round 3: 1 Vs 4, 2 Vs 3

Seulement je suis infoutu de trouver l’algo qui va bien pour un nombre n d’équipes…

A priori ton premier probleme n’est pas d’ordre algorithmique mais
plutot du coté des regles du jeu : comment se passent les éliminations
si le nombre d"équipes n’est pas une puissance de 2 ?

A priori, les eliminations par poules doivent te ramener à une
puissance de 2. A toi de voir en fonction du temps de jeu ou du nombre
de parties que tu comptes faire jouer pour le nombre et la taille de
chaque poule.

Dans les matchs de poules, tout le monde doit jouer contre tous les
autres membres de la poule, donc ca c’est de l’algorithmique
combinatoire de base, c’est à dire tu essayes toutes les combinaisons en
éliminant de facon intelligente les combinaisons impossibles ou déjà
prises.

Ensuite, si tu gardes les n premiers de chaque poule, ce n’est pas de
l’algo, c’est une décision arbitraire ou bien aléatoire à prendre (par
exemple pour les 1/4 de finales de la coupe de monde de rugby
actuellement :

Q1:1er groupe D / 2ème groupe C

Q2:1er groupe A / 2ème groupe B

Q3:1er groupe B / 2ème groupe A

Q4:1er groupe C / 2ème groupe D

Pour le reste c’est une bete descente d’arbre (remontée en fait) donc rien de bien compliqué.

Pour le premier souci , il me semble qu’un moyen de s’en sortir est de laisser à chaque fois que le nombre de participants est impair (ça arrive forcément à un moment si on n’a pas une puissance de 2) un des participant passer le tour sans jouer. Pour éviter qu’un joueur puisse passer tous les tours tranquille, il suffit de décaler l’indice du joueur qui passe.
(première fois que ca arrive, c’est le joueur 1 de la liste, la 2ème fois, soit le 2eme soit le 3eme -pour conserver une présentation agréable)
(d’un autre côté, si tu parles de poules, c’est que tu peux t’arranger pour avoir 2^n participants dans les éliminatoires)

Sinon, PERE, tu veux faire un graphique avec les matches ou seulement avoir les données pour chaque tour?

Pour les poules, il faut, je pense, définir à l’avance combien tu veux de participants à la fin des matches de poules et combien tu veux de “gagnants” par poule. En fonction de celà, tu sais combien il te faut de poules et tu calcules le nombre d’équipes par poule en fonction du nombre total (nb : les poules n’auront pas forcément le même nombre de participants).
Ensuite, pour les matches de poule, il doivent forcément avoir lieu en même temps (ex : poule de 4, A vs B en même temps que C vs D) ou ca peut se jouer en “différé”?

EDIT : ajouts

Ce message a été édité par Shinigami le 16/10/2003

[quote]Pour le premier souci , il me semble qu’un moyen de s’en sortir est de laisser à chaque fois que le nombre de participants est impair (ça arrive forcément à un moment si on n’a pas une puissance de 2) un des participant passer le tour sans jouer. Pour éviter qu’un joueur puisse passer tous les tours tranquille, il suffit de décaler l’indice du joueur qui passe.
(première fois que ca arrive, c’est le joueur 1 de la liste, la 2ème fois, soit le 2eme soit le 3eme -pour conserver une présentation agréable)
(d’un autre côté, si tu parles de poules, c’est que tu peux t’arranger pour avoir 2^n participants dans les éliminatoires)

Bah en fait c’est soit l’un soit l’autre… ca devrait au mieux composer dynamiquement avec le nombre de joueurs présents et générer tout seul au mieux les poules et les agencements des matches.

Sinon, PERE, tu veux faire un graphique avec les matches ou seulement avoir les données pour chaque tour?

les deux: le graphique pour les résultats, les données pour indiquer aux gens contre qui ils vont se battre.

Pour les poules, il faut, je pense, définir à l’avance combien tu veux de participants à la fin des matches de poules et combien tu veux de “gagnants” par poule. En fonction de celà, tu sais combien il te faut de poules et tu calcules le nombre d’équipes par poule en fonction du nombre total (nb : les poules n’auront pas forcément le même nombre de participants).

Bah ca je le sais déjà: si le nombre d’équipe n’est pas premier, il faut trouver un arrangement de telle sorte que nombres de poules * nombres d’équipe par poule = nombre total d’équipes, mais que ca soit équilibrés (par exemple je préfère avoir 4 poules de 4 équipes que 2 poules de 8).

Ensuite, pour les matches de poule, il doivent forcément avoir lieu en même temps (ex : poule de 4, A vs B en même temps que C vs D) ou ca peut se jouer en “différé”?

non pas de différé possible (sinon ca prend trop de temps)

EDIT : ajouts

Ce message a été édité par Shinigami le 16/10/2003[/quote]

C’est sans doute à ça qu’on reconnaît le geek : un quidam se serait contenté d’un bon vieux tableau velleda des familles et d’un bête feutre noir…  Bon j’arrête de troller.

Ouais ben non moi je veux que l’intranet automatise tous les tournois. Pour les curieux, j’ai trouvé la solution a base d’une fonction récursive.

Je sais ca a l’air de prime abord assez inbitable, si quelqu’un veut une explication, je me ferais un plaisir

function Tourney(&$result,$arFirstGroup,$arSecondGroup,$level) {   if(($arFirstGroup==null) || ($arSecondGroup==null))   return;   for($shift=0;$shift<count($arFirstGroup);$shift++)   for($i=0;$i<count($arFirstGroup);$i++)   if($arSecondGroup[($i+$shift)%count($arFirstGroup)]!="")   $result[count($result)+1] = ($level+1)*100+$shift.";".$arFirstGroup[$i].";".$arSecondGroup[($i+$shift)%count($arFirstGroup)];   $arFirstPart = array_chunk($arFirstGroup, ceil(count($arFirstGroup)/2));   $arSecondPart = array_chunk($arSecondGroup, ceil(count($arSecondGroup)/2));     Tourney($result,$arFirstPart[0],$arFirstPart[1],$level+1);   Tourney($result,$arSecondPart[0],$arSecondPart[1],$level+1);  }[/quote][i]Ce message a été édité par [PERE]Cil le 23/10/2003[/i]

L’association NeXeN organisatrice de LAN a déjà un logiciel en PHP (adminbot) qui gère ce type de problème :
http://nexen.fr.st/

Je l’ai jamais installé mais utilisé en temps que client, et ça marchait plutôt pas mal.

Ca fait appel à du PHP/MySQL (ça on le savait) et à du Perl avec module KKrcon (http://kkrcon.sf.net/) pour la gestion des serveurs de jeux logiques.

Bon courage