Auteur Sujet: [php] Créer Un Calendrier De Matchs...  (Lu 5536 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« le: 02 décembre 2003 à 21:18:21 »
Je suis en train de construire un jeu et je n'arrive pas à résoudre un problème.

Les personnes devront s'affronter dans un championnat de X joueurs.

Les joueurs devront tous s'affronter au moins deux fois !! (matchs aller-retour)
Le calendrier des matchs doit être créé automatiquement dès qu'assez de joueurs sont inscrits...

Le problème est de créer ce calendrier, tel joueur joue contre tel joueur ce jour-ci... etc
Un peu à la manière d'un championnat de foot, il y aura 2*(NbEquipes-1) journées de NbEquipes/2 matchs...

Pour 10 équipes, 18 journées de 5 matchs chacune...

Cela fait des heures et des heures que j'essaie de réaliser cette fonction mais je n'y arrive toujours pas... quelqu'un pourrait m'aider svp ?
Merci.
« Modifié: 02 décembre 2003 à 21:48:23 par manu0086 »

Hors ligne Penelope

  • Habitué
  • **
  • Messages: 212
    • http://
[php] Créer Un Calendrier De Matchs...
« Réponse #1 le: 03 décembre 2003 à 17:18:14 »
Une piste :

Ton problème revient à remplir un tableau de NbEquipes par NbEquipes. Chaque ligne correspond à l'équipe qui accueille. Chaque colonne correspond à l'équipe qui se déplace. Et dans chaque cas, tu mets la journée correspondante.
La diagonale qui part d'en haut à gauche n'est pas renseignée puisqu'une équipe ne joue pas contre elle-même

par exemple, pour 4 équipes

[ . 1 2 3 4 ]
[ 1 X ? ? ? ]
[ 2 ? X ? ? ]
[ 3 ? ? X ? ]
[ 4 ? ? ? X ]


Tu peux remplir ce tableau comme tu veux.
Il faut vérifier :
* qu'une équipe ne fasse pas deux match le même jour.
   C'est-à-dire que sur la ligne et sur la colonne correspondant à une équipe, tous les jours doivent être différents.
Au passage, ça implique que le jour du match retour est différent du jour du match aller.  En notation matricielle : mij != mji


Exemple de remplissage :
    Si i=j            => non définit (pas de match contre soi-même)
    Si i<j            =>  mij = (i+j)*2-5 modulo le nombre d'équipes
    Si i>j            =>  mij = mji + 1

Avec cette règle, le match retour à lieu le jour suivant du match aller. Ca donne ça :

[ . 1 2 3 4 ]
[ 1 X 1 3 5 ]
[ 2 2 X 5 1 ]
[ 3 4 6 X 3 ]
[ 4 6 2 4 X ]
« Modifié: 03 décembre 2003 à 17:58:49 par Penelope »
[color=ff9999]Cordialement, Penelope [/color]

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #2 le: 03 décembre 2003 à 23:17:13 »
Merci beaucoup pour ton aide.

En ce qui concerne le tableau
[ . 1 2 3 4 ]
[ 1 X ? ? ? ]
[ 2 ? X ? ? ]
[ 3 ? ? X ? ]
[ 4 ? ? ? X ]

J'en ai déjà créé un.

Le problème avec ta solution c'est que le match retour suit le match aller...
Alors que moi je veux d'abord qu'il y ai tous les matchs aller, puis les matchs retour...

Je suis proche du but mais à partir de la 5eme journée (qd y'a 10 équipes) ça commencer à merder...

Donc je cherche diverses solutions pr y arriver.

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #3 le: 03 décembre 2003 à 23:35:14 »
en fait, j'ai pensé à un truc, il ne faudrait dans un premier temps que les matchs aller...
les matchs retour seront faciles à faire ensuite...

Donc cela s'implifie un peu...

Hors ligne bob413242

  • Connaisseur
  • ***
  • Messages: 461
[php] Créer Un Calendrier De Matchs...
« Réponse #4 le: 04 décembre 2003 à 00:01:38 »
en effet, tu peux d'abord faire tous les matchs aller, puis obtenir le calendrier des matchs retour par décalage
soit n le nombre d'équipes, et p le nombre de matchs par jour, les équipes sont 0,1 ... n-1
il y a n(n-1)/2 matchs aller
soit t[i,j] la date du match de i avec j.
dans le programme, d(i) est le nombre de matchs déjà rentrés pour l'équipe i
pour les matchs aller, on va supposer i<j (triangle supérieur de la matrice)

pour tout k, t[k,k]=-1 et d(k)=0
pour tout k<>l, t[k,l]=0
i=0
c=0
s=0
r=0
cmax=(n(n-1)/2)-1
tant que (c<=cmax et s<n-1 et r<n-1) faire
  s=0
  j=i+1
  tant que (t[i,j]<>0 et s<n-1) faire
    s=s+1
    j=(j+1) mod n
  fintant
  si (s<n-1) alors
    t[i,j]=c mod p
    t[j,i]=t[i,j]+(cmax+1)/p
    d(i)=d(i)+1
    d(j)=d(j)+1
    c=c+1
  finsi
  r=0
  i=(j+1) mod n
  tant que (d(i)=n-1 et r<n-1) faire
    i=(j+1) mod n
    r=r+1
  fintant
fintant

théoriquement les tests s<n-1 et r<n-1 ne devraient jamais intervenir, ils servent juste à assurer que les boucles terminent ... mais en fait la condition intéressante est c<=cmax, tant qu'elle n'est pas vérifiée, on pourra toujours trouver des i et des j tels que les bouclent terminent
« Modifié: 04 décembre 2003 à 00:06:40 par Prof Vince »

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #5 le: 04 décembre 2003 à 00:10:26 »
Merci bcp, je vais tester ça dès maintenant si j'en ai encore la force...

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #6 le: 04 décembre 2003 à 01:09:11 »
Il faut bien traduire mod par % ?
Je ne l'utilise jamais...

J'ai codé tout le code mais cela ne fonctionne pas...

Voici mon code :

$nbEquipes = 4;

$dateMatch = array();
$nbM = array();

for($k=0; $k < $nbEquipes;$k++){
$dateMatch[$k][$k] = -1;
$nbM[$k] = 0;
for($l=0;$l < $nbEquipes;$l++)
  if($k != $l)
   $dateMatch[$k][$l] = 0;
}

$i=0;
$c=0;
$s=0;
$r=0;
$p=$nbEquipes/2;

$cmax = ($nbEquipes*($nbEquipes-1)/2)-1;

//tant que (c<=cmax et s<n-1 et r<n-1) faire
while($c <= $cmax && $s < ($nbEquipes-1) && $r < ($nbEquipes-1)){
$s=0;
$j=$i+1;
// tant que (t[i,j]<>0 et s<n-1) faire
while($dateMatch[$i][$j] != 0 && $s < ($nbEquipes-1)){
  $s=$s+1;
  $j=($j+1) % $nbEquipes;// mod n
}
if($s < ($nbEquipes-1)){
  $dateMatch[$i][$j]=$c % $p;// mod p
  $nbM[$i]=$nbM[$i]+1;
  $nbM[$j]=$nbM[$j]+1;
  $c=$c+1;
}//finsi
$r=0;
$i=($j+1) % $nbEquipes; // mod n
//tant que (d(i)=n-1 et r<n-1) faire
while($nbM[$i] == ($nbEquipes-1) && $r < ($nbEquipes-1)){
  $i=($j+1) % $nbEquipes;// mod n
  $r=$r+1;
}//fintant
}//fintant

for($k=0; $k < $nbEquipes;$k++){
for($l=0;$l < $nbEquipes;$l++)
  echo $dateMatch[$k][$l]."<br>";
}

Et voici ce que cela me donne :
-1
0
0
0
0
-1
0
0
1
0
-1
1
0
0
0
-1

Bref, je commence à fatiguer... il est tard, au dodo, je réfléchirai mieux demain.
« Modifié: 04 décembre 2003 à 01:19:22 par manu0086 »

Hors ligne didiou

  • Connaisseur
  • ***
  • Messages: 367
    • Guichen Poker Club
[php] Créer Un Calendrier De Matchs...
« Réponse #7 le: 04 décembre 2003 à 01:25:31 »
% n  


Hors ligne Penelope

  • Habitué
  • **
  • Messages: 212
    • http://
[php] Créer Un Calendrier De Matchs...
« Réponse #8 le: 04 décembre 2003 à 09:45:47 »
Citer
Le problème avec ta solution c'est que le match retour suit le match aller...
Alors que moi je veux d'abord qu'il y ai tous les matchs aller, puis les matchs retour...
Tu aurais pu le préciser dès le début ....   :(
Moi j'y connais rien au foot.

Je continue sur mon idée ...

Formule de remplissage :
Si i=j => non définit (pas de match contre soi-même)
Si i<j => mij = i+j-2 modulo nbEquipes (triangle en haut à droite)
Si i>j => mij = mji + nbEquipes - 1  (triangle en bas à gauche)

Avec cette règle, le match retour à lieu (nbEquipes - 1 ) après le match aller. Ca donne ça :


[ . 1 2 3 4 ]
[ 1 X 1 2 3 ]
[ 2 4 X 3 1 ]
[ 3 5 6 X 2 ]
[ 4 6 4 5 X ]
« Modifié: 04 décembre 2003 à 09:47:24 par Penelope »
[color=ff9999]Cordialement, Penelope [/color]

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #9 le: 04 décembre 2003 à 10:43:00 »
Il y a un problème toujours...

[ . 1 2 3 4 ]
[ 1 X 1 2 3 ]
[ 2 4 X 3 1 ]
[ 3 5 6 X 2 ]
[ 4 6 4 5 X ]

Lors de la quatrieme journée... le 2 joue contre le 1 et le 4 joue contre le 2...

Si les matrices ne réussissent même pas, comment vais-je faire.... :(

Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #10 le: 04 décembre 2003 à 11:24:37 »
Hep Prof Vince,

T'aurai pu signaler que tu avais remodifié ton code :)

"t[j,i]=t[i,j]+(cmax+1)/p" cette ligne n'y était pas au début...

Grâce à elle, on se rapproche du but...

-1
0
4
0
3
-1
0
0
1
3
-1
1
0
0
4
-1

Ce qui donne
1ere journée : 2 vs 1 et 2 vs 3 (problème donc)
2nde : rien
3eme : 1 vs 0 et 2 vs 1 (encore un pb)
4eme : 0 vs 2 et 3 vs 2
5eme...
6eme...

Bref, tjrs des problèmes...
 

Hors ligne didiou

  • Connaisseur
  • ***
  • Messages: 367
    • Guichen Poker Club
[php] Créer Un Calendrier De Matchs...
« Réponse #11 le: 04 décembre 2003 à 12:34:23 »
Personnellement, je trouve que tu te compliques la vie, moi j'ai fais la même chose que toi, mais pour un championnat de fléchettes !
Voici comment je procède:

Pour l'affichage à l'écran (les équipes sont classées du 1er au dernier par ordre de points puis par le goalaverage
=================

EQ / JOUR 1_2_3_4_5_n  [PTS] [GOAL]
equipe 1   5_3_6_2_4_5  [5] [25]
equipe 2   3_5_6_4_2_1  [4] [23]
equipe 3   3_5_4_6_2_2  [3] [22]
equipe 4   5_2_2_6_0_1  [2] [16]
equipe n   2_1_2_0_1_3  [1] [09]

Pour la structure de la BDD:
====================

Une table equipes : id_equipe, nom_equipe
Une table scores :   jour, id_equipe, pts, goal
ex pour reprendre mon affichage:
TABLE SCORES:
1,1,1,5
1,2,1,3
1,3,1,3
1,4,1,5
1,n,0,2
2,1,1,3
2,2,1,5
2,3,1,5
2,4,0,2
2,n,0,1
3,1,1,6
3,2,1,6
3,3,1,4
3,4,0,2
3,n,0,2
etc...

POUR LA REQUETE SQL !
=================
Se repporter à la sympatique réponse d'une certaine Pénélope, folle du sql ! c'est la dernière requête du lien.


Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #12 le: 04 décembre 2003 à 12:56:51 »
euuuuh, je me complique la vie ?
Ce que je veux est complétement différent de ce que tu a fait...

Le problème n'est pas dans les scores mais dans le calendrier des futurs matchs à venir... Donc rien à voir avec le SQL...

Voilà ce que devrait donner les matchs aller s'il y avait 10 équipes

1ere journée
9 vs 1
8 vs 2
7 vs 3
6 vs 4
5 vs 0
2nde
2 vs 9
3 vs 8
4 vs 7
5 vs 6
0 vs 1
3eme
9 vs 3
8 vs 4
7 vs 5
6 vs 0
1 vs 2
4eme
4 vs 9
5 vs 8
6 vs 7
0 vs 2
3 vs 1
5eme
9 vs 5
8 vs 6
7 vs 0
2 vs 3
1 vs 4
6eme
6 vs 9
7 vs 8
3 vs 0
4 vs 2
5 vs 1
7eme
9 vs 7
8 vs 0
4 vs 3
5 vs 2
6 vs 1
8eme
8 vs 9
0 vs 4
3 vs 5
2 vs 6
1 vs 7
9eme
9 vs 0
8 vs 1
7 vs 2
6 vs 3
5 vs 4

Je ne réussit à créer cela "que" jusqu'à la 4eme journée...
Enfin je vais retourner sur ce code là car c'est avec celui là que je m'approche le plus de la solution...
 

Hors ligne didiou

  • Connaisseur
  • ***
  • Messages: 367
    • Guichen Poker Club
[php] Créer Un Calendrier De Matchs...
« Réponse #13 le: 04 décembre 2003 à 13:06:15 »
OK désolé, autant pour moi, je n'avais pas bien saisi la différence ! :(
Cela dit le sujet est intéressant, et je vais peut-être m'y intéresser si j'en ai le temps !
En fait tu veux trouver la formule qui te donne l'ordre des rencontres en fonction de la journée j, c bien ça?
Le problème c que l'idéal serait que chaque équipe joue 1 fois à domicile et 1 fois à l'extérieur, mais hélas c impossible, il faut donc trouver qui joue 2 fois à domicile et qui joue 2 fois à l'extérieur! Je pense que dans la réalité, ce genre de tableau est élaboré à la main, pas par une fonction!  :(  
« Modifié: 04 décembre 2003 à 13:37:44 par didiou »


Hors ligne manu0086

  • Débutant
  • *
  • Messages: 59
    • http://footland.carafriends.com
[php] Créer Un Calendrier De Matchs...
« Réponse #14 le: 04 décembre 2003 à 13:35:50 »
Oui le sujet est très intéressant, c'est un ptit casse tête très prenant...

Je suis proche du but en ce moment sauf qu'il me manque le dernier match d'une journée sur deux... car les 2 équipes restantes ont déjà joué l'une contre l'autre...
La seule solution, créer d'autres journées pour les matchs en retard... enfin ça me fait un peu c... mais si j'ai pas le choix...
Je continue de chercher :)