Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • f0b1c946de8d830d44f43dbf9ee395fd600d2fdb
  • master par défaut protégée
  • dev
  • dev-admin
  • migration-pg
  • dev-partie
  • dev-deplacement-msg-erreurs
  • dev-jeux-favoris
  • dev-update-forms
  • dev-header-profil-deconnexion
  • dev-contact
  • dev_page_accueil
  • dev-edit-profil
  • dev-classement
  • dev_espace_membre
  • dev-images
  • javascript_valid_form
  • application_design_views
  • dev-table
  • dev-nestor
20 résultats

Partie.php

Blame
  • Partie.php 8,47 Kio
    <?php
    include_once("ELO_function.php");
    
    /**
     * Created by PhpStorm.
     * User: phoenix
     * Date: 25/04/16
     * Time: 15:27
     */
    class Partie extends Model
    {
        public $joueurs, $scores, $lejeu, $date, $slug;
    
        public static function getFromSlug($slug_partie)
        {
            $db = Database::getInstance();
            $sql = "SELECT * FROM R_partie WHERE slug = :slug";
            $stmt = $db->prepare($sql);
            $stmt->setFetchMode(PDO::FETCH_CLASS, "Partie"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
            $stmt->execute(array(":slug" => $slug_partie));
            return $stmt->fetch();
        }
    
        public static function getList()
        {
            $db = Database::getInstance();
            $sql = "SELECT * FROM R_partie";
            $stmt = $db->query($sql);
            $stmt->setFetchMode(PDO::FETCH_CLASS, "Partie");
            return $stmt->fetchAll();
        }
    
        public static function checkExists($slug_partie)
        { // méthode permettant de vérifier si une partie existe dans la BDD
            $db = Database::getInstance(); // on récupère la connexion à la BDD
            $sql = "SELECT * FROM R_partie WHERE slug = :slug";
            $req = $db->prepare($sql); // on prépare la requête
            $req->execute(array(":slug" => $slug_partie)); // on remplace les variables dans la requête
    
            if ($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
                return true;
            }
    
            return false; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
        }
    
        private static function calcul_classement($R)
        {
            $m = count($R);
    
            $R_classement = array_fill(0, $m, 0);
            arsort($R);
            $i = 1;
            foreach ($R as $k => $val) {
                $R_classement[$k] = $i;
                $i++;
            }
            return $R_classement;
        }
    
    
        public static function updateClassement($jeu)
        {
            $db = Database::getInstance();
            $sql1 = "SELECT joueur FROM R_joueur_jeu ORDER BY score DESC";
            $sql2 = "UPDATE R_joueur_jeu SET classement = :classement WHERE joueur = :joueur AND jeu = :jeu;";
            $stmt1 = $db->prepare($sql1);
            $stmt2 = $db->prepare($sql2);
            if ($stmt1->execute()) {
                $i = 1;
                while ($row = $stmt1->fetch()) {
                    if ($stmt2->execute(array(":classement" => $i, ":joueur" => $row['joueur'], ":jeu" => $jeu->slug))) {
    
                    } else {
                        return 2;
                    }
                    $i++;
                }
            } else {
                return 2;
            }
            return 0;
        }
    
        public static function addPartie($joueurs, $scores, $jeu)
        {
            $db = Database::getInstance();
            $datestr = date("Y-m-d H:i:s");
            $sql1 = "INSERT INTO R_partie (jeu, date) VALUES (:id_jeu, :date);";
            $sql2 = "SELECT id FROM R_partie WHERE jeu = :id_jeu AND date = :date;";
            $sql3 = "SELECT score FROM R_joueur_jeu WHERE joueur = :id_joueur AND jeu = :id_jeu;";
            $sql4 = "INSERT INTO R_joueur_partie (partie, joueur, classement, score)
                    VALUES (:partie, :joueur,:classement, :score);";
            $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
            $sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);";
            $stmt1 = $db->prepare($sql1);
            $stmt2 = $db->prepare($sql2);
            $stmt3 = $db->prepare($sql3);
            $stmt4 = $db->prepare($sql4);
            $stmt5 = $db->prepare($sql5);
    
            if ($stmt1->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr))) {
                // insertion d'une nouvelle partie
                // on suppose que si l'insertion fonctionne, la lecture aussi, donc que les droits d'accés sont bons
                $stmt2->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr));
                $id_partie = $stmt2->fetch()['id'];
    
                $m = count($scores);
    
                $old_score = array_fill(0, $m, 0);
                $old_score_e = array();
                foreach ($joueurs as $k => $joueur) {
                    // version avec équipes
                    if ($jeu->type == 'equipes') {
                        $old_score_e[$k] = array();
                        foreach ($joueur as $kj => $j) {
                            if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug))) {
                                if ($row = $stmt3->fetch()) {
                                    // Le joueur a déja joué à ce jeu
                                    $old_score_e[$k][$kj] = $row[0];
                                } else {
                                    // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
                                    $old_score_e[$k][$kj] = 1000;
                                    $stmtN = $db->prepare($sqlN);
                                    if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
    
                                    } else
                                        return 2;
                                }
                            }
                        }
                        $old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]);
                    } else {
                        // récupération du score actuel de chaque joueur
                        if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug))) {
                            if ($row = $stmt3->fetch()) {
                                // Le joueur a déja joué à ce jeu
                                $old_score[$k] = $row[0];
                            } else {
                                // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
                                $old_score[$k] = 1000;
                                $stmtN = $db->prepare($sqlN);
                                if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
    
                                } else
                                    return 2;
                            }
    
                        }
                    }
                }
                // Calcul de la nouvelle différence de scores et du classement de chacun dans la partie
                $diff_scores = ELO_scores($old_score, $scores, 32);
                $classement = self::calcul_classement($diff_scores);
                foreach ($joueurs as $k => $joueur) {
                    if ($jeu->type == 'equipes') {
                        foreach ($joueur as $kj => $j) {
                            // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie)
                            // pour chaque joueur
                            if ($stmt4->execute(array(":partie" => $id_partie,
                                ":joueur" => $j->slug,
                                ":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj]))
                            ) {
                                $newS = $old_score_e[$k][$kj] + $diff_scores[$k];
                                // On met à jour le score du joueur actuel dans sa relation avec le jeu
                                if ($stmt5->execute(array(":new_score" => $newS,
                                    ":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug))
                                ) {
                                } else
                                    return 2;
                            } else
                                return 2;
                        }
                    } else {
                        // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie)
                        // pour chaque joueur
                        if ($stmt4->execute(array(":partie" => $id_partie,
                            ":joueur" => $joueur->slug,
                            ":classement" => $classement[$k], ":score" => $old_score[$k]))
                        ) {
                            $newS = $old_score[$k] + $diff_scores[$k];
                            // On met à jour le score du joueur actuel dans sa relation avec le jeu
                            if ($stmt5->execute(array(":new_score" => $newS,
                                ":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug))
                            ) {
                            } else
                                return 2;
                        } else
                            return 2;
                    }
                }
            } else
                return 2;
            // met à jour le classement de tous les joueurs
            return self::updateClassement($jeu);
        }
    }