Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tp : Mini jeu de combat

Bloquer

Sujet résolu
    22 mai 2019 à 16:19:01

    Bonjour,

    Je suis le cours de PHP et j'en suis au TP : Mini jeu de combat.

    Je suis complètement bloquer .. Je n'arrives pas à récupérer la liste des personnes à frapper, ni les informations de mon personnage du moins pas tout exactement.
    Je vous remercie d'avance de l'aide que vous me proposerez :)


    Je vous mets mes codes : 

    Index : 

    <?php
    // On enregistre notre autoload.
    function chargerClasse($classname)
    {
      require $classname.'.php';
    }
    
    spl_autoload_register('chargerClasse');
    
    session_start(); // On appelle session_start() APRÈS avoir enregistré l'autoload.
    
    if (isset($_GET['deconnexion']))
    {
      session_destroy();
      header('Location: rpg2.php');
      exit();
    }
    
    $db = new PDO('mysql:host=localhost;dbname=rpg', 'root', '');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // On émet une alerte à chaque fois qu'une requête a échoué.
    
    $manager = new PersonnagesManager($db);
    
    if (isset($_SESSION['perso'])) // Si la session perso existe, on restaure l'objet.
    {
      $perso = $_SESSION['perso'];
    }
    
    if (isset($_POST['creer']) && isset($_POST['nom'])) // Si on a voulu créer un personnage.
    {
      switch ($_POST['type']) 
      {
        case 'magicien':
    
          $perso = new Magicien(['nom' => $_POST['nom']]);
          break;
        
        case 'guerrier':
          $perso = new Guerrier(['nom' => $_POST['nom']]);
          break;
    
        default: 
          $message = 'Le type du personnage est invalide';
          break;
      }
    
      if(isset($perso)) // Si le type du personnage est valide, on créer un personnage.
      {
         if(!$perso->nomValide())
        {
          $message = 'Le nom choisi est invalide.';
          unset($perso);
        }
        elseif ($manager->exists($perso->nom()))
        {
          $message = 'Le nom du personnage est déjà pris.';
          unset($perso);
        }
        else
        {
          $manager->add($perso);
        }
      }
    }
    
    elseif (isset($_POST['utiliser']) && isset($_POST['nom'])) // Si on a voulu utiliser un personnage.
    {
      if ($manager->exists($_POST['nom'])) // Si celui-ci existe.
      {
        $perso = $manager->get($_POST['nom']);
      }
      else
      {
        $message = 'Ce personnage n\'existe pas !'; // S'il n'existe pas, on affichera ce message.
      }
    }
    
    elseif (isset($_GET['frapper'])) // Si on a cliqué sur un personnage pour le frapper.
    {
      if (!isset($perso))
      {
        $message = 'Merci de créer un personnage ou de vous identifier.';
      }
      
      else
      {
        if (!$manager->exists((int) $_GET['frapper']))
        {
          $message = 'Le personnage que vous voulez frapper n\'existe pas !';
        }
        
        else
        {
          $persoAFrapper = $manager->get((int) $_GET['frapper']);
          
          $retour = $perso->frapper($persoAFrapper); // On stocke dans $retour les éventuelles erreurs ou messages que renvoie la méthode frapper.
          
          switch ($retour)
          {
            case Personnage::CEST_MOI :
              $message = 'Mais... pourquoi voulez-vous vous frapper ???';
              break;
            
            case Personnage::PERSONNAGE_FRAPPE :
              $message = 'Le personnage a bien été frappé !';
              
              $manager->update($perso);
              $manager->update($persoAFrapper);
              
              break;
            
            case Personnage::PERSONNAGE_TUE :
              $message = 'Vous avez tué ce personnage !';
              
              $manager->update($perso);
              $manager->delete($persoAFrapper);
              
              break;
    
            case Personnage::PERSO_ENDORMI : 
            $message = 'Vous êtes endormi, vous ne pouvez pas frapper de personnage !!';
            break;
          }
        }
      }
    }
    
    elseif(isset($_GET['ensorceler']))
    {
      if(!isset($perso))
      {
        $messsage = 'Merci de créer un personnage ou de vous indentifier.';
      }
      else
      {
        if($perso->type() != 'magicien')
        {
          $message = 'Seuls les magiciens peuvent ensorceler des personnages !';
        }
        else
        {
          if(!$manager->exists((int) $_GET['ensorceler']))
          {
            $message = 'Le personnage que vous voulez frapper n\'existe pas !';
          }
          else
          {
            $persoAEnsorceler = $manager->get((int) $_GET['ensorceler']);
            $retour = $perso->lancerUnSort($persoAEnsorceler);
    
            switch ($retour) 
            {
              case Personnage::CEST_MOI :
                $message = 'Mais .. pourquoi voulez-vous vous ensorceler ???';
                break;
    
              case Personnage::PERSONNAGE_ENSORCELE :
              $message = 'Le personnage a bien été ensorcelé :';
    
              $manager->update($perso);
              $manager->update($persoAEnsorceler);
    
              break;
    
              case Personnage::PAS_DE_MAGIE :
              $message = 'Vous navez pas de magie !';
              break;
    
              case Personnage::PERSO_ENDORMI :
              $message = 'Vous etes endormi, vous ne pouvez pas lancer de sort !';
              break;
            }
          }
        }
      }
    }
    ?>
    <!DOCTYPE html>
    <html>
      <head>
        <title>TP : Mini jeu de combat</title>
        
        <meta charset="utf-8" />
      </head>
      <body>
        <p>Nombre de personnages créés : <?php echo $manager->count() ?></p>
    
    <?php
      if (isset($message)) // On a un message à afficher ?
      {
        echo '<p>', $message, '</p>'; // Si oui, on l'affiche.
      }
    
      if (isset($perso)) // Si on utilise un personnage (nouveau ou pas).
      {
    ?>
        <p><a href="?deconnexion=1">Déconnexion</a></p>
    
        <fieldset>
          <legend>Mes informations</legend>
          <p>
            Type : <?php echo ucfirst($perso->type()) ?><br>
            Nom : <?php echo $perso->nom() ?><br>
            Dégâts : <?php echo $perso->degats() ?><br>
    
    <?php
      // On affiche l'atout du personnage suivant son type
      switch ($perso->type()) 
      {
        case 'magicien':
          echo 'Magie : ';
          break;
        case 'guerrier':
          echo 'Protection: ';
          break;
      }
      echo $perso->atout();
    ?>
          </p>
        </fieldset>
        
        <fieldset>
          <legend>Qui frapper ?</legend>
          <p>
    <?php
    
      $retourPersos = $manager->getList($perso->nom());
    
      if (empty($retourPersos))
      {
        echo 'Personne à frapper !';
      }
    
      else
      {
        if($perso->estEndormi())
        {
          echo 'Un magicien vous a endormi ! Vous allez vous réveiller dans ', $perso->reveil(), '.';
        }
    
      else
      {
        foreach ($retourPersos as $unPerso)
        {
          echo '<a href="?frapper=', $unPerso->id(), '">', $unPerso->nom(), '</a> (dégâts : ', $unPerso->degats(), ' | type : ', $unPerso->type(), ')';
    
        // ajoute d'une ligne si le perso est magicien
          if($perso->type() == 'magicien')
          {
            echo ' | <a href="?ensorceler=', $unPerso->id(), '">Lancer un sort</a>';
          }
    
          echo '<br>';
        }
      }
    }
    ?>
          </p>
        </fieldset>
    <?php
      }
      else
      {
      ?>
          <form action="" method="post">
            <p>
              Nom : <input type="text" name="nom" maxlength="50" />
              <input type="submit" value="Utiliser ce personnage" name="utiliser" /><br><br>
              Type : 
              <select name="type">
                <option value="magicien">Magicien</option>
                <option value="guerrier">Guerrier</option>
              </select>
              <input type="submit" value="Créer ce personnage" name="creer" />
            </p>
          </form>
    <?php
      }
    ?>
      </body>
    </html>
    
    <?php
      if(isset($perso)) // Si on a créer un perso on le stock dans la variable.
      {
        $_SESSION['perso'] = $perso;
      }
    PersonnageManager : 
    <?php
    
    class PersonnagesManager
    {
      private $db; // Instance de PDO
      
      public function __construct($db)
      {
        $this->db = $db;
      }
      
      public function add(Personnage $perso)
      {
        $q = $this->db->prepare('INSERT INTO personnages_v2(nom,type) VALUES(:nom, :type)');
        $q->bindValue(':nom', $perso->nom());
        $q->bindValue(':type', $perso->type());
    
        $q->execute();
        
        $perso->hydrate([
          'id' => $this->db->lastInsertId(),
          'degats' => 0,
          'atout' => 0,
          'timeEndormi' => 0
        ]);
      }
      
      public function count()
      {
        return $this->db->query('SELECT COUNT(*) FROM personnages_v2')->fetchColumn();
      }
      
      public function delete(Personnage $perso)
      {
        $this->db->exec('DELETE FROM personnages_v2 WHERE id = '.$perso->id());
      }
      
      public function exists($info)
      {
        if (is_int($info)) // On veut voir si tel personnage ayant pour id $info existe.
        {
          return (bool) $this->db->query('SELECT COUNT(*) FROM personnages_v2 WHERE id = '.$info)->fetchColumn();
        }
        
        // Sinon, c'est qu'on veut vérifier que le nom existe ou pas.
        
        $q = $this->db->prepare('SELECT COUNT(*) FROM personnages_v2 WHERE nom = :nom');
        $q->execute([':nom' => $info]);
        
        return (bool) $q->fetchColumn();
      }
      
      public function get($info)
      {
        if (is_int($info))
        {
          $q = $this->db->query('SELECT id, nom, degats, timeEndormi, type, atout FROM personnages_v2 WHERE id = '.$info);
          $perso = $q->fetch(PDO::FETCH_ASSOC);
        }
        else
        {
          $q = $this->db->prepare('SELECT id, nom, degats, timeEndormi, type, atout FROM personnages_v2 WHERE nom = :nom');
          $q->execute([':nom' => $info]);
        
          $perso = $q->fetch(PDO::FETCH_ASSOC);
        }
    
        switch ($perso['type']) 
        {
          case 'guerrier': return new Guerrier($perso);
          case 'magicien': return new Magicien($perso);
          default: return null;
        }
      }
       
      public function getList($nom)
      {
        $persos = [];
        
        $q = $this->db->prepare('SELECT id, nom, degats, timeEndormi, type, atout FROM personnages_v2 WHERE nom <> :nom ORDER BY nom');
        $q->execute([':nom' => $nom]);
        
        while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
        {
          switch ($donnees['type'])
          {
            case 'guerrier': $persos[] = new Guerrier($donnees); break;
            case 'magicien': $persos[] = new Magicien($donnees); break;
          }
        }
        
        return $persos;
      }
      
      public function update(Personnage $perso)
      {
        $q = $this->db->prepare('UPDATE personnages_v2 SET degats = :degats, timeEndormi = :timeEndormi, atout = :atout WHERE id = :id');
        
        $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
        $q->bindValue(':timeEndormi', $perso->timeEndormi(), PDO::PARAM_INT);
        $q->bindValue(':atout', $perso->atout(), PDO::PARAM_INT);
        $q->bindValue(':id', $perso->id(), PDO::PARAM_INT);
        
        $q->execute();
      }
    }
    Personnage : 
    <?php
    
    abstract class Personnage
    {
    	protected $atout,
    			      $degats,
    			      $id,
    			      $nom,
    			      $timeEndormi,
    			      $type;
    
    	  const CEST_MOI = 1; // renvoyer la méthode "frapper" si on ce frappe soit meme
      	const PERSONNAGE_TUE = 2; // renvoyer la méthode 'frapper' si on a tué un personnage en le frappant
      	const PERSONNAGE_FRAPPE = 3; // renvoie la méthode 'frapper' si on a bien frappé le personnage
      	const PAS_DE_MAGIE = 5; // renvoie la méthode 'lanerunsort' si on veut jeter un sort alors que la magie du magicien est a 0
      	const PERSO_ENDORMI = 6; // renvoie la méthode 'frapper' si le personnage qui veut frapper est endormi
      	const PERSONNAGE_ENSORCELER = 4; // renvoie la méthode 'lancerunsort' si on a bien ensorcelé un personnage
    
      	public function __construct(array $donnees)
      	{
      		$this->hydrate($donnees);
      		$this->type = strtolower(static::class);
      	}
    
      	public function estEndormi()
      	{
      		return $this->timeEndormi > time();
      	}
    
      	public function frapper(Personnage $perso)
      	{
      		if($perso->id() == $this->id)
      		{
      			return self::CEST_MOI; // on retourne la const 1 si on veut ce frapper soit même
      		}
    
      		if($this->estEndormi())
      		{
      			return self::PERSO_ENDORMI; // on retourne la const 5 si le perso qui veut frapper est endormi
      		}
       		// On indique au personnage frappé qu'il doit recevoir des dégâts.
        	return $perso->recevoirDegats();
    	}
    
    	public function hydrate(array $donnees)
    	 {
    	    foreach ($donnees as $key => $value) 
    	    {
    	      $method = 'set'.ucfirst($key);
    	    }
    
    	    if(method_exists($this, $method))
    	    {
    	      $this->$method($value);
    	    }
    	}
    
    	public function reveil()
    	{
    		$secondes = $this->timeEndormi;
    		$secondes -= time();
    
    		$heures = floor($secondes / 3600);
    		$secondes -= $heures * 3600;
    
    		$minutes = floor($secondes / 60);
    		$secondes -= $minutes * 60;
    
    		$heures .= $heures <= 1 ? ' heure' : ' heures';
    		$minutes .= $minutes <= 1 ? ' minute' : ' minutes';
    		$secondes .= $secondes <= 1 ? ' seconde' : ' secondes';
    
    		return $heures .', ' .$minutes .' et ' .$secondes;
    
    	}
    
      	public function recevoirDegats()
      	{
    	  	// On augmente de 5 les dégâts.
    	    $this->_degats += 5;
    	    
    	    // Si on a 100 de dégâts ou plus, la méthode renverra une valeur signifiant que le personnage a été tué.
    	    if($this->_degats >= 100)
    	    {
    	    	return self::PERSONNAGE_TUE;
    	    }
    	    // Sinon, elle renverra une valeur signifiant que le personnage a bien été frappé.
    	    return self::PERSONNAGE_FRAPPE;
      	}
    
      	public function nomValide()
      	{
      		return !empty($this->nom);
      	}
    
      	public function atout()
      	{
      		return $this->atout;
      	}
    
      	public function degats()
      	{
      		return $this->degats;
      	}
    
      	public function id()
      	{
      		return $this->id;
      	}
    
      	public function nom()
      	{
      		return $this->nom;
      	}
    
      	public function timeEndormi()
      	{
      		return $this->timeEndormi;
      	}
    
      	public function type()
      	{
      		return $this->type;
      	}
    
      	public function setAtout($atout)
      	{
      		$atout = (int) $atout;
    
      		if($atout >=0 && $atout <= 100)
      		{
      			$this->atout = $atout;
      		}
      	}
    
      	public function setDegats($degats)
      	{
      		$degats = (int) $degats;
    
      		if($degats >= 0 && $degats <= 100)
      		{
      			$this->degats = $degats;
      		}
      	}
    
      	public function setID($id)
      	{
      		$id = (int) $id;
    
      		if($id > 0)
      		{
      			$this->id = $id;
      		}
      		
      	}
    
      	public function setNom($nom)
      	{
      		if(is_string($nom))
      		{
      			$this->nom = $nom;
      		}
      	}
    
      	public function setTimeEndormi($timeEndormi)
      	{
      		$this->timeEndormi = (int) $time;
      	}
    }
    
    
    Aperçu de mon page lorsque je choisis un personnage déjà en bdd :
    Ma base de données : 
    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2019 à 16:34:55

      Salut,

      Mes informations: le nom est vide, corrige ça et le reste viendra seul

      -
      Edité par christouphe 22 mai 2019 à 16:35:20

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2019 à 16:49:26

        Vous me parlez bien de cette ligne : 

        Nom : <?php echo $perso->nom() ?><br>



        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2019 à 16:59:13

          Bonjour.

          Non, regardes bien ta méthode add et plus précisément ce que tu définies dans la méthode hydrate dans cette même méthode.

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            22 mai 2019 à 17:02:49

            AH oui, il faut remonter pas à pas les appels pour voir ce qu'il se pase et oooohhhh !!!

            indice: MAJUSCULE au lieu de minuscule quelque part ;)

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2019 à 12:47:53

              Bon, j'ai chercher ce matin sans réussite... 

              Même essayer de voir d'autres code de ce TP pour éventuellement trouver mes erreurs :/
              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2019 à 12:52:53

                modifie l'hydrate en faisant un echo de la méthode appelée:

                <?php
                public function hydrate(array $donnees)
                     {
                        foreach ($donnees as $key => $value)
                        {
                          $method = 'set'.ucfirst($key);
                        }
                        echo '<br>Redherche de la methode "'.$method.'";
                        if(method_exists($this, $method))
                        {
                          echo '<br>OK";
                          $this->$method($value);
                        } else {
                          echo '<br>Pas de methode "'.$method.'";
                        }
                    }

                ça dit  quoi ?

                -
                Edité par christouphe 24 mai 2019 à 12:57:01

                • Partager sur Facebook
                • Partager sur Twitter
                  24 mai 2019 à 13:44:25

                  J'ai ces deux lignes : 


                  Recherche de la methode"setAtout"
                  OK


                  Edit : J'ai trouvé !!! Je devais mettre mon if dans le foreach pour qu'il cherche toute les methode :)

                  public function hydrate(array $donnees)
                  	 {
                  	    foreach ($donnees as $key => $value) 
                  	    {
                  	      $method = 'set'.ucfirst($key);
                          echo '<br>Recherche de la methode"'.$method.'"';
                        if(method_exists($this, $method))
                        {
                          echo'<br>OK';
                          $this->$method($value);
                        }
                        else
                        {
                          echo '<br>pas de methode"'.$method.'"';
                        }
                  	    }
                  
                  	}



                  -
                  Edité par MaxenceO 24 mai 2019 à 13:51:26

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mai 2019 à 13:54:35

                    ahhh tu vois quand tu veux ;) et maintenant en supprimant les debug tu as ce que tu veux?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mai 2019 à 13:54:47

                      Oui, j'ai ce que je veux ! Bon j'ai maintenant des bugs pour attaquer et lancer un sort! Je m'y mets dessus, je reviendrais vers vous si je n'y arrives pas :)

                      -
                      Edité par MaxenceO 24 mai 2019 à 13:56:13

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mai 2019 à 13:59:38

                        pense au bouton "Résolu" ;)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Tp : Mini jeu de combat

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown