probleme avec des classes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : probleme avec des classes

Re: probleme avec des classes

par Blobowy » 16 juil. 2012, 17:33

j'ai fais sa comme code:

Code : Tout sélectionner

 <?php         public function frapper(Personnage $perso)         {             if ($perso->id() == $this->_id)             {                 return self::CEST_MOI;             }                          if ($this->_degats <= 1)             {                           return $perso->gagnerDegats();                           }                          // On indique au personnage qu'il doit recevoir des dégâts             // Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE             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 nomValide()         {             return !empty($this->_nom);         }                   public function motdepassevalid()         {             return !empty($this->_motdepasse);         }                                    public function recevoirDegats()         {             $this->_degats -= 5;                                               return self::PERSONNAGE_FRAPPE;         }                                   public function gagnerDegats()                  {             $this->_degats += 5;             }     ?>                 

Re: probleme avec des classes

par Blobowy » 15 juil. 2012, 13:56

Je viens de les lire ,mon probleme c'est que pour recevoir degats il y a une conditions dans frapper je sais pas comment mettre gagner , je doit mettre la condition if ($this->_degats <= 1)? parce que apres je rajoute la public function mais sa modifie rien quand je le fait , mais bon au moins j'ai pas des erreurs c'est deja sa .

Re: probleme avec des classes

par moogli » 15 juil. 2012, 13:39

donc la il faut que je crée dans public fonction frapper une autre condition qui retourne a gagnerDegats ?
ensuite je dois rajouter une public function avec gagnerDegats et la je mets $this->_degats += +5; ?
en gros oui.

Mais je pense que tu devrais regarder des cours (même simple) sur la poo.

on parle de méthode pour les 'public fonction' et de propriété ou de variables de classes

donc tu ajoute une méthode gagnerDegats que tu peux utiliser dans la méthode frapper.

@+

Re: probleme avec des classes

par Blobowy » 15 juil. 2012, 12:53

Sa m'emmerde pas x) j'essaye juste de comprendre :) donc la il faut que je crée dans public fonction frapper une autre condition qui retourne a gagnerDegats ?
ensuite je dois rajouter une public function avec gagnerDegats et la je mets $this->_degats += +5; ?
sinon oui degats c'est plutot la vie j'ai pas encore modifié mais si je modifies je risque d'etre encore plus perdu.

Re: probleme avec des classes

par moogli » 15 juil. 2012, 11:49

avec ton cas deux solutions :
- soit dans la méthode frapper tu récupère les pv de $perso et compare à zéro (pour voir s'il est mort) et la tu ajout les PV (avec un $this-> pv += 20 par exemple);
- soit c'est le manager qui se charge de la chose. (donc avec une méthode similaire a ce que j'ai indiqué avant).

Je ne vois nul part les PV du perso, c'est $_degats qui fait la chose ? si oui le nom est mal choisis :mrgreen:

je ce que j'ai mis avant, c'est pas pou t'emmerder mais pour t'aider, modéliser c'est pas toujours simple, parfois chiant mais globalement nécessaire (si c'est pour afficher ta collection de photo de vacances c'est pas utile hein faut pas déconner non plus :) ).

Lorsque tu modélise la chose correctement tu y a gagne en terme de maintenabilité, tu pourra corriger des bug ou ajouter des nouvelles fonctionnalité sans devoir recorder tout le truc et surtout sans te prendre la tête à chercher comment ça fonctionne (et la je parle en connaissance de cause mes premier script sont bien bordélique et c'est galère de s'y retrouver, même pour moi :) ).


@+

Re: probleme avec des classes

par Blobowy » 14 juil. 2012, 22:43

j'ai mis $message car dans la suite du script j'ai :

case Personnage::PERSONNAGE_TUE :
$message = 'Vous avez tué ce personnage !';

$manager->update($perso);
$manager->delete($persoAFrapper);

Re: probleme avec des classes

par Blobowy » 14 juil. 2012, 22:39

ok alors j'ai fais sa :
<?php
    class Personnage
    {
        private $_degats,
                $_id,
                $_nom;
				
               
				
        const CEST_MOI = 1; // Constante renvoyée par la méthode `frapper` si on se frappe soit-même
        const PERSONNAGE_TUE = 2; // Constante renvoyée par la méthode `frapper` si on a tué le personnage en le frappant
        const PERSONNAGE_FRAPPE = 3; // Constante renvoyée par la méthode `frapper` si on a bien frappé le personnage
        
        
        public function __construct(array $donnees)
        {
            $this->hydrate($donnees);
        }
        
		 public function gagnerDegats(Personnage $perso)
        {
            $this->_degats += +5;
            
            
           }
		
		
		 public function gagner(Personnage $perso)
        {
            if ( 
                        $message = 'Vous avez tué ce personnage !')
            {
                return $perso-> gagnerDegats();
            }
            
            // On indique au personnage qu'il doit recevoir des dégâts
            // Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE
            
        }
        
		
        public function frapper(Personnage $perso)
        {
            if ($perso->id() == $this->_id)
            {
                return self::CEST_MOI;
            }
            
            // On indique au personnage qu'il doit recevoir des dégâts
            // Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE
            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 nomValide()
        {
            return !empty($this->_nom);
        }
        
		 public function motdepassevalid()
        {
            return !empty($this->_motdepasse);
        }
		
		
		
        public function recevoirDegats()
        {
            $this->_degats += -5;
            
            
            if ($this->_degats <= 1)
            {
               
         return self::PERSONNAGE_FRAPPE;
			 
			}
			    
        // Sinon, on se contente de dire que le personnage a bien été frappé
            return self::PERSONNAGE_FRAPPE;
        }
       
	    
        

        public function degats()
        {
            return $this->_degats;
        }
        
        public function id()
        {
            return $this->_id;
        }
        
        public function nom()
        {
            return $this->_nom;
        }
        
		public function motdepasse()
        {
            return $this->_motdepasse;
        }
		
		
		
        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 setMotdepasse($motdepasse)
        {
            if (is_string($motdepasse))
            {
                $this->_motdepasse = $motdepasse;
            }
        }
		
		
		
		
        public function setNom($nom)
        {
            if (is_string($nom))
            {
                $this->_nom = $nom;
            }
        }
    }

?>
mais ce sera toujours this parce que j'utilise toujours if et la sa rajoute meme pas de point de vie a celui qui a ete "tuer"

Re: probleme avec des classes

par xTG » 14 juil. 2012, 22:08

Bah oui créer une fonction publique pour modifier un attribut privé c'est un peu le principe...
Sinon je vois mal comment on peut le modifier cet attribut privé. ;)

Re: probleme avec des classes

par Blobowy » 14 juil. 2012, 21:44

ok , mais la je doit refaire une autre public function juste pour redonner de la vie quand on a tuer un perso
parce que là avec :
<?php
public function recevoirDegats()
        {
            $this->_degats += -5;
           
           
            if ($this->_degats <= 1)
            {
               this->_degats += +10;
           
                         
                        }
?>
cela redonne 10 de point de vie a celui qui a eu les point de vie inferieur a 1 moi je voudrais juste modifier pour qu'a la place de this sa soit my et ainsi sa rajoute 10 point de vie a mon propre personnage et non aux personnage qui a eu les point de vie inférieur a 1

Re: probleme avec des classes

par xTG » 14 juil. 2012, 21:25

Au contraire si tu rapatrie encore des données de la bdd à partir d'un autre objet c'est là que tu vas complexifier.
Ce que te propose moogli est le plus simple et le plus lisible.

Re: probleme avec des classes

par Blobowy » 14 juil. 2012, 19:35

il y a pas un moyen plus simple ? par exemple en reprenant la valeur dans la base de donné et en lui ajoutant une valeur dans le if ? j'ai pas trop envie de complexifié le codage de peur de m'y perdre apres si je le reprends

Re: probleme avec des classes

par moogli » 14 juil. 2012, 19:04

salut,

la c'est plutot de l'ordre de la gestion des objets et pas du code de la classe elle même.

par exemple si tu a un objet "baston" qui prend en paramètre deux objets personnages l'objet baston gère le combat et utilise les méthodesd de personnage pour infliger des degats ou redonner des PV à un des deux personnages.

par exemple
addPV(nbpv) : ajoute des pv => pv += nbpv
moinsPV (nbpv) : retire des PV (correspond au dégats fait par l'autre perso avec ta sauce à toi si tu veux avoir des multiplicateur de dégats; des résistances etc etc)
=> pv -= nbpv

après il faut une méthode pour connaitre les pv des personnages (getPV() par exemple.

A partir de la baston peu faire
$perso1->moinsPV(412);
if ($perso1->getPV() === 0){
echo 't\'es mort ;) );
$perso2->addPV($perso2->getPV() * 0.2); // ajoute 20%
}
et ceci dans une méthode à lui.

les objets telque personnage, n'ont à avoir de logique "métier", en java on te parlera de POJO, ce sont des objets qui représente quelque chose (suite à une modélisation).
par exemple
une voiture peux contenir une marque, un modèle, une vitesse et un nombre de kilomètre, avancer / reculer) mais c'est l'objet conducteur qui choisis dans quel sens va la voiture et a qu'elle vitesse, c'est pas la voiture qui choisis suite à l'utilisation de la méthode avance (enfin par encore p'tet un jour :mrgreen: )

@+

probleme avec des classes

par Blobowy » 14 juil. 2012, 18:36

Bonjours , je m'ntraine en ce moment au php , j'ai donc voulu modifier un peu le cript du tp :mini jeu de combats pour ceux qui connaisse, j'ai penser a faire un systeme plus de vie avec notre vie qui diminue en fonction des degats pris , cela je l'ai fait sans probleme car j'ai modifier la valeur de degats en mettant 100 et j'ai mit -5 au lieu de +5 quand on doit recevoir des degats , j'ai voulu faire ensuite faire un systeme ou on regagnait de la vie quand on tuait un personnage , et la viens mon probleme par rapport a la fonction if , car j'arrive a rajouter de la vie au personnage qu'on attaque si sa vie passe en dessous de 50 par exemple mais j'arrive pas a rajouter de la vie a notre propre personnage quan on n'arrive a en tuer un autre .
<?php
    class Personnage
    {
        private $_degats,
                $_id,
                $_nom;
        
        const CEST_MOI = 1; // Constante renvoyée par la méthode `frapper` si on se frappe soit-même
        const PERSONNAGE_TUE = 2; // Constante renvoyée par la méthode `frapper` si on a tué le personnage en le frappant
        const PERSONNAGE_FRAPPE = 3; // Constante renvoyée par la méthode `frapper` si on a bien frappé le personnage
        
        
        public function __construct(array $donnees)
        {
            $this->hydrate($donnees);
        }
        
        public function frapper(Personnage $perso)
        {
            if ($perso->id() == $this->_id)
            {
                return self::CEST_MOI;
            }
            
            // On indique au personnage qu'il doit recevoir des dégâts
            // Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE
            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 nomValide()
        {
            return !empty($this->_nom);
        }
        
        public function recevoirDegats()
        {
            $this->_degats += -5;
            
            
            if ($this->_degats <= 1)
            {
               $perso->_degats += +10;
            
			 
			}
			
			
			
			
			
			
            
            // Sinon, on se contente de dire que le personnage a bien été frappé
            return self::PERSONNAGE_FRAPPE;
        }
       
	   
      
        

        public function degats()
        {
            return $this->_degats;
        }
        
        public function id()
        {
            return $this->_id;
        }
        
        public function nom()
        {
            return $this->_nom;
        }
        
        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;
            }
        }
    }

?>

mon probleme vient surtout de :
<?php
public function recevoirDegats()
        {
            $this->_degats += -5;
            
            
            if ($this->_degats <= 1)
            {
               $perso->_degats += +10;
            
			 
			}
?>
je sais pas quoi mettre a la place de $perso pour que sa soit notre degat qui augmente
par contre j'ai pas encore remplacer degats mais a la place c'est plutot la vie