Gestion d'arbre de tournoi

Eléphanteau du PHP | 11 Messages

09 juil. 2016, 13:35

Bonjour à tous,

Je travaille actuellement sur un site permettant la création de tournoi pour mon association. J'y rencontre quelques soucis que les membres de PHPFrance m'ont aidée à corriger.

Ici je rencontre le plus gros probléme, en effet les conditions de création de l'arbre sont :
- Avoir le nombres exacts de joueurs (c'est à dire que tant qu'il n'y a pas 32 joueurs l'arbre ne se lance pas)
- Cliquer sur le bouton qui va lancer le tournoi

J'ai récemment ajoutée un datetimepicker qui va permettre de faire lancer le tournoi a une heure exacte mais il ne se lanceras pas tant qu'on aura pas le nombre de joueurs requis. La possibilité aurait était de créer manuellement des équipes, les rentrer dans le tournoi puis ensuite mettre la victoire à l'adversaire. Mais le soucis se passe lorsque le tournoi est a 128 équipes et qu'on a 65 participants.

Le but serait donc que lorsqu'une équipe n'a pas d'adversaire de directement mettre une victoire gratuite. A l'exemple de ce que peut faire par exemple Wannawar : http://www.wannawar.com/tournoi-league- ... up-91.html

Au 1erTour il y a écrit - FreeWin -

Le soucis est que j'ai cherché pendant une semaine sur google une idée a ce sujet sans avoir trouvée le moindre élement de réponse ou une piste a exploitée.

Voici le code qui génere le 1er tour du tournoi.

Code : Tout sélectionner

<?php session_start(); date_default_timezone_set('Europe/Paris'); include('./lib/class-db.php'); include('./lib/objects/class-tournament.php'); $ez_tournament = new ezAdmin_Tournament(); if(!isset($_SESSION['ez_admin'])) { header("Location: login.php"); } else { $username = $_SESSION['ez_admin']; } if( isset( $_POST['form'] ) && isset( $_POST['tournament_id'] ) ) { $form = trim( $_POST['form'] ); $tournament_id = trim( $_POST['tournament_id'] ); if( $form == 'generate-matches' ) { // clear any previously generated matchups first $ez_tournament->clear_tournament_matchups( $tournament_id ); // randomize tournament matchups and store them $tournament_max_teams = trim( $_POST['max_teams'] ); $teams = $ez_tournament->get_tournament_teams( $tournament_id ); shuffle( $teams ); ?> <li class="spacer">&nbsp;</li> <!-- wrap score inside span element --> <li class="game game-top"><?php echo $teams[0]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[1]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[0]['guild'], $teams[0]['id'], $teams[1]['guild'], $teams[1]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[2]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[3]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[2]['guild'], $teams[2]['id'], $teams[3]['guild'], $teams[3]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php if( $tournament_max_teams >= 8 ) { ?> <li class="game game-top "><?php echo $teams[4]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[5]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[4]['guild'], $teams[4]['id'], $teams[5]['guild'], $teams[5]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[6]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[7]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[6]['guild'], $teams[6]['id'], $teams[7]['guild'], $teams[7]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } if( $tournament_max_teams >= 16 ) { ?> <li class="game game-top "><?php echo $teams[8]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[9]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[8]['guild'], $teams[8]['id'], $teams[9]['guild'], $teams[9]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[10]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[11]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[10]['guild'], $teams[10]['id'], $teams[11]['guild'], $teams[11]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top "><?php echo $teams[12]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[13]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[12]['guild'], $teams[12]['id'], $teams[13]['guild'], $teams[13]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[14]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[15]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[14]['guild'], $teams[14]['id'], $teams[15]['guild'], $teams[15]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } if( $tournament_max_teams >= 32 ) { ?> <li class="game game-top "><?php echo $teams[16]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[17]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[16]['guild'], $teams[16]['id'], $teams[17]['guild'], $teams[17]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[18]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[19]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[18]['guild'], $teams[18]['id'], $teams[19]['guild'], $teams[19]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top "><?php echo $teams[20]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[21]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[20]['guild'], $teams[20]['id'], $teams[21]['guild'], $teams[21]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[22]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[23]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[22]['guild'], $teams[22]['id'], $teams[23]['guild'], $teams[23]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top "><?php echo $teams[24]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[25]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[24]['guild'], $teams[24]['id'], $teams[25]['guild'], $teams[25]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[26]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[27]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[26]['guild'], $teams[26]['id'], $teams[27]['guild'], $teams[27]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top "><?php echo $teams[28]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom"><?php echo $teams[29]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[28]['guild'], $teams[28]['id'], $teams[29]['guild'], $teams[29]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <li class="game game-top"><?php echo $teams[30]['guild']; ?></li> <li class="game game-spacer">&nbsp;</li> <li class="game game-bottom "><?php echo $teams[31]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[30]['guild'], $teams[30]['id'], $teams[31]['guild'], $teams[31]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } ?> <?php } if( $form == 'clear-matches' ) { $ez_tournament->clear_tournament_matchups( $tournament_id ); } } ?>
Bon week end à tous et merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 juil. 2016, 10:43

salut,

pour commencer il faut alléger ton code.
tu peux remplacer ta succession de li par une boucle for (avec un incrément de deux) tu y gagneras en lisibilité et en flexibilité ton code ne gère pas plus de 32 équipes ils se passe quoi si tu veux en mettre 33 ? ;)

Tu n'as pas besoin de if pour savoir combien tu dois afficher d'élément c'est la méthode get_tournament_teams qui doit gérer cela (idem pour le suffle il n'a rien à faire la c'est de la logique métier met ça dans la classe qui te permet de récupérer la chose.

C'est lors de la récupération des données qu'il faut que tu comptes le nombre d'équipe et s'il en manque que tu faces avancer certaine(s) équipe(s) d'une cran directement (si tu as 15 participants il faut qu'il y ai une équipe qui passe directement en 1/4 de final.
Pour cela il faut que tu saches laquelle avantager par rapport aux autres (cela qui a le plus de points ? celle qui en a le moins ? pifométrique ?).
Le plus simple pour modéliser la chose correctement c'est d'avoir un objet 'Match' qui va contenir deux équipes et chaque adversaire aura des infos (nom d'équipe etc).
si l'une des deux équipes est null tu affiches match gagné, accès directe manche suivantes etc etc.
Le tout c'est que dans ta base tu gardes le fait que la seule équipe de cette rencontre doit $être dans la phase suivante.
je te conseil de toujours faire en sorte que ce soit l'équipe "droite" qui ne soit pas renseignée dans ce cas là pour te simplifier la vie. (voir code si dessous).

L'avantage de cette façon de faire c'est que s'il manque 6 équipes tu peux quand mêmes faire 2 matchs de 8ème de final (oui je sais c'est pas de bol pour les quatre équipes en 8 ème :) ).

Avant d'aller plus loin il faut que tu définisses ces règles de gestion pour les implémenter ensuite ;)

exemple de code des objets Team et Math
<?php

class Team
{
    private $name;
    private $guild;
    private $id;
  // pourquoi pas la liste des joueurs, je ne met pas les assesseurs poru limiter le code
}

class Match
{
    // left / right pour l'affichage ;)
  private $leftTeam;
    private $rightTeam;

    public function getLeftTeam() : Team
    {
        return $this->leftTeam;
    }

    public function setLeftTeam(Team $t)
    {
        $this->leftTeam = $t;
    }
    public function getRightTeam() : Team
    {
        return $this->leftTeam;
    }

    public function setRightTeam(Team $t)
    {
        $this->rightTeam = $t;
    }
}
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

13 juil. 2016, 15:25

Bonjour !

(Désolé de la réponse tardive)
Alors en effet actuellement on c'est arrêter a 32 équipes, la 33eme ne pourras pas y participer.

D'ailleurs est ce que ma méthode est vraiment la meilleure ?
C'est à dire que pour chaque tour j'ai un fichier PHP.

Si j'ai 32 équipes je vais commencer par le fichier tour1, si c'est 16 équipes le tour 2 etc ...

On compte augmenter le nombre de participants en fonction du succès de nos tournois.

Je fais les modifications et je te tiens au jus.

Cordialement,

Eléphanteau du PHP | 11 Messages

13 juil. 2016, 17:37

J'ai donc commencer a faire l'incrémentation pour raccourcir le code en utilisant la boucle for.

J'ai cependant un gros soucis puisque rien ne s'affiche malgrés mes nombreuses tentatives à ce niveau là.

Je viens aussi d'essayer ceci

Code : Tout sélectionner

<?php session_start(); date_default_timezone_set('Europe/Paris'); include('./lib/class-db.php'); include('./lib/objects/class-tournament.php'); $ez_tournament = new ezAdmin_Tournament(); if(!isset($_SESSION['ez_admin'])) { header("Location: login.php"); } else { $username = $_SESSION['ez_admin']; } if( isset( $_POST['form'] ) && isset( $_POST['tournament_id'] ) ) { $form = trim( $_POST['form'] ); $tournament_id = trim( $_POST['tournament_id'] ); if( $form == 'generate-matches' ) { // clear any previously generated matchups first $ez_tournament->clear_tournament_matchups( $tournament_id ); // randomize tournament matchups and store them $tournament_max_teams = trim( $_POST['max_teams'] ); $teams = $ez_tournament->get_tournament_teams( $tournament_id ); shuffle( $teams ); } ?> <li class="spacer">&nbsp;</li> <?php for($i=0;$i<=$tournament_max_teams;$i+2;) { ?> <li class="game game-top"><?php echo $teams[$i]['guild']; ?></li> <li class="game game-spacer">&nbsp; <li class="game game-bottom "><?php echo $teams[$i++]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[$i]['guild'], $teams[$i]['id'], $teams[$i++]['guild'], $teams[$i++]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } ?> <?php } if( $form == 'clear-matches' ) { $ez_tournament->clear_tournament_matchups( $tournament_id ); } } ?>

Eléphanteau du PHP | 11 Messages

14 juil. 2016, 14:24

(Désolé pour le "spam")

Du coup on m'a donné un petit coup de main en me disant que j'avais fais quelques erreurs de syntaxe.

Code : Tout sélectionner

<?php for($i=0; $i < $tournament_max_teams; $i += 2;) { ?> <li class="game game-top"><?php echo $teams[$i]['guild']; ?></li> <li class="game game-spacer">&nbsp; <li class="game game-bottom "><?php echo $teams[$i+1]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[$i]['guild'], $teams[$i]['id'], $teams[$i+1]['guild'], $teams[$i+1]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } ?>
Le résultat final

Code : Tout sélectionner

<?php session_start(); date_default_timezone_set('Europe/Paris'); include('./lib/class-db.php'); include('./lib/objects/class-tournament.php'); $ez_tournament = new ezAdmin_Tournament(); if(!isset($_SESSION['ez_admin'])) { header("Location: login.php"); } else { $username = $_SESSION['ez_admin']; } if( isset( $_POST['form'] ) && isset( $_POST['tournament_id'] ) ) { $form = trim( $_POST['form'] ); $tournament_id = trim( $_POST['tournament_id'] ); if( $form == 'generate-matches' ) { // clear any previously generated matchups first $ez_tournament->clear_tournament_matchups( $tournament_id ); // randomize tournament matchups and store them $tournament_max_teams = trim( $_POST['max_teams'] ); $teams = $ez_tournament->get_tournament_teams( $tournament_id ); shuffle( $teams ); } ?> <li class="spacer">&nbsp;</li> <?php for($i=0; $i < $tournament_max_teams; $i += 2;) { ?> <li class="game game-top"><?php echo $teams[$i]['guild']; ?></li> <li class="game game-spacer">&nbsp; <li class="game game-bottom "><?php echo $teams[$i+1]['guild']; ?></li> <?php $ez_tournament->set_tournament_matchups($tournament_id, $teams[$i]['guild'], $teams[$i]['id'], $teams[$i+1]['guild'], $teams[$i+1]['id'], '1'); ?> <li class="spacer">&nbsp;</li> <?php } ?> <?php } if( $form == 'clear-matches' ) { $ez_tournament->clear_tournament_matchups( $tournament_id ); } } ?>
Le soucis est qu'à présent mon arbre ne se génere plus du tout.