2016-09-02 3 views
0

J'utilise un Round Robin pour programmer des parties. Je voudrais que chaque équipe joue à "n" jeux, et j'ai "x" équipes. Tout est génial si "x" est pair, mais si "x" est impair, je dois ajouter une autre équipe, "bye" pour que ça marche. Quand j'ai 11 équipes jouant 4 parties chacune, avec les byes, ça fonctionne, donc 4 équipes sont en train de faire des byes. C'est inefficace, car ils pourraient simplement jouer les uns avec les autres pour que chaque équipe joue 4 parties. Après avoir programmé tous les jeux, y compris les jeux où une équipe est "bye", j'essaye de rendre toutes les équipes qui ont eu une "bye week" et de les faire jouer une partie l'une contre l'autre. Je dois m'assurer que les équipes n'ont pas joué avant.Round Robin Scheduler Remplir "byes"

Depuis que j'utilise un petit nombre d'équipes, j'utilise un randomizer pour essayer des combinaisons jusqu'à ce que l'on travaille. Cependant, je ne peux pas le faire fonctionner.

Voici mon code qui planifie les équipes qui ont eu par rounds de se jouer les uns les autres. Je voudrais passer en revue et vérifier pour voir s'ils ont joué avant, et s'ils ont, randomiser la liste afin que nous puissions essayer un combo différent. Je ne pense pas que le fait de vérifier si les équipes ont joué jusqu'à présent fonctionne, car il ne mélange jamais les équipes même si elles se chevauchent.

while (true){ 
         $needshuffled = "no"; 
        for ($j=0; $j < $maxgames/2; $j++){ 
         $k = $j*2; 
         $round[$maxgames][$j]["Home"]=$byeteams[$k]; 
         $round[$maxgames][$j]["Away"]=$byeteams[$k+1]; 

         $home = $round[$maxgames][$j]["Home"]; 
         $away = $round[$maxgames][$j]["Away"]; 

         $sql = "SELECT * FROM `temp` 
          WHERE (Home = '$home' and Away = '$away') 
           or (Home = '$away' and Away = '$home')"; 
         if ($conn->query($sql) === TRUE) { 
          if ($result=mysqli_query($conn,$sql)) 
          { 
            // Return the number of rows in result set 
            $rowcount=mysqli_num_rows($result); 
            if ($rowcount > 0) 
            { 
             $needshuffled = "yes"; 
            } 
          } 

         } 
        } 

        if ($needshuffled == "no"){ 
         break; 
        } 
       } 

Répondre

0

if ($conn->query($sql) === TRUE) n'est pas vrai si vous l'utilisez pour une déclaration select, voir documentation:

retour en cas d'échec. Pour les requêtes SELECT, SHOW, DESCRIBE ou EXPLAIN réussies, mysqli_query() retournera un objet mysqli_result. Pour les autres requêtes réussies, mysqli_query() retournera TRUE.

Puisque vous faites deux fois de toute façon, vous pouvez compléter supprimer cette ligne et il suffit d'utiliser

$sql = "SELECT * FROM `temp` 
     WHERE (Home = '$home' and Away = '$away') 
     or (Home = '$away' and Away = '$home')"; 
if ($result=mysqli_query($conn,$sql)) { 
    ... 

Alternativement, puisque vous avez votre programme complet dans votre $round variables déjà, vous pouvez l'utiliser pour vérifier pour les matchs existants.

Et vous pouvez essayer une autre stratégie:

Pour round robin avec un nombre impair d'équipes et un nombre de jours encore, il y aura exactement un jour dans le futur où le sous-ensemble des équipes qui ont eu un bye jouera déjà contre une équipe qui a déjà eu un bye, et toutes les équipes qui n'ont pas encore eu d'au revoir auront un bye ce jour-là ou joueront contre une équipe qui n'a encore rien vu.

Tout ce que vous devez faire est de continuer à générer la table ronde jusqu'à ce que vous trouviez ce jour et que vous utilisiez les matchs de cette journée.

+0

Cela aide à vérifier plus efficacement les deux combinaisons, n'était pas le problème que j'avais auparavant. J'ai mis à jour la question. – Ben

+0

@Ben J'ai mis à jour ma réponse. – Solarflare

+0

Voilà, la ligne if ($ conn-> query ($ sql) === TRUE). – Ben