IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Initiation à la poo, méthode indéfinie


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut [POO] Initiation à la poo, méthode indéfinie
    Bonjour à tous, n'arrêtant pas d'entendre parlé de poo en php dans tous les magazines ou livres que je lis, j'ai décidé de m'y essayer en commençant un jeu basique, premier essai, 1er problème, j'ai une erreur que je n'arrive pas à comprendre :

    Fatal error: Call to undefined method departJeu::arr_personnage() in D:\test\jeu.php on line 25

    Voici la "chose" que j'ai faite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
     
    class departJeu
    {
      private $vie;
      private $force;
      private $resistance;
      private $magie;
      private $temperament;
      private $personnage;
      private $arr_personnage;
     
      public function __construct()
      {
        $this -> vie = 20;
        $this -> force = 10;
        $this -> resistance = 20;
        $this -> magie = 20;
        $this -> temperament = 50;
        $this -> arr_personnage = array(1 => 'brutus', 'agilicius', 'maleficius', 'angelicius');
      }
     
      private function capacite_personnage($id_personnage)
      {
        $this -> personnage = $this->arr_personnage($id_personnage);
        if( $this -> personnage == 'brutus' )
          $this->force*=3;
        if( $this -> personnage == 'agilicius' )
          $this->resistance*=3;
        if( $this -> personnage == 'maleficius' )
        {
          $this -> magie+=20;
          $this->temperament-=20;
        }
        if( $this -> personnage == 'angelicus' )
        {
          $this -> magie+=20;
          $this->temperament+=20;
        }
      }
     
      public function choix_personnage($id_personnage)
      {
        $this->capacite_personnage($id_personnage);
        return array($this->personnage, $this->vie, $this->force, $this->resitance, $this->magie, $this->temperament);
      }
    }
     
    $jeu = new departJeu;
    $id = 1;
     
    $attributs = $jeu->choix_personnage($id);
     
    print_r($attributs);
     
    ?>
    Bon, je me doute qu'il y sans doute des trucs qui vont pas et peut-être même illogiques, mais j'ai jamais fait de poo.

    Pourquoi ai-je cette erreur ?

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    ici tu appelles une fonction alors qu'il s'agit d'un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->arr_personnage($id_personnage);
    $this->arr_personnage[$id_personnage];
    Bye

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Je cherchais un truc compliqué alors que c'était simple.

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Comme je sais pas si c'est une bonne idée de faire un sujet à chaque problème, je vais continuer ici.

    J'ai un peu de mal à concevoir un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class typeAttaque
    {
        protected $arr_attaque;
        function __construct()
        {
            $this->arr_attaque(1 => 'poing', 'épée', 'arc', 'magie noire', 'magie blanche');
        }
        // autres fonctions
    }
    Comment je pourrais faire que en fonction du type d'attaque, ce soit telle ou telle fonction qui soit utilisée ?

    Par exemple si c'est l'épée qui est choisie, que ce soit la fonction AttaqueEppe qui sera choisie, si c'est la magie blanche, que ce soit AttaqueMagieBlanche qui soit utilisée.

    Ces fonctions que je n'ai pas encore créées serviront à calculer les dégâts infligés en fonction de l'arme et des attributs du personnage.

  5. #5
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    tu peux faire une seule méthode Attaque qui, en fonction de l'arme, soit se débrouille toute seule pour calculer, soit appelle une méthode privée d'attaque correspodant à l'arme

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Ah oui, je vois un peu ce que tu veux dire, et ces méthodes, je dois les déclarées normalement ou abstraites ?

  7. #7
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    tu les déclares normalement

    si tu veux faire comme ça, il faut que Attaque prenne une arme et un perso en paramètres
    tu fais un switch sur l'arme, tu fais tes calculs directement ou t'appelles la fonction qui va bien en lui passant le perso en paramètre

  8. #8
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Sinon tu revois ton modèle et tu tentes un truc du genre :

    class perso {
    var hp
    function basicAttack()
    }

    class mage extends perso {
    var mp
    function magicAttack()

    }

    class thief extends perso
    }

    etc.

    Ca dépend si ce que tu veux faire est compliqué ou non et si les perso vont posséder de grosse différence ou non.

    Bye

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Merci, je crois que je vais faire comme ça, en appelant une fonction spécifique suivant le type.

    Ah oui Djakisback, faire des classes héritées, j'y avais pensé, mais j'ai un peu de mal à concevoir comment les mettre en place.

    Suivant ton schéma, si j'appelle la classe mage par exemple, elle hérite de perso, mais à quoi pourrait me servir l'héritage ?

  10. #10
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Bin disons que pour ce type de jeu en PHP c'est peut-être pas très probant. L'avantage dans l'exemple c'est que quand tu crées un objet Thief il aura pas de variable $mp ni de méthode magicAttack() donc déjà t'utilises que la mémoire nécessaire à chaque perso, ensuite t'évites des if / else ou des switch et des tableaux contenant les armes etc., par exemple pour ta fonction attack().
    Puis dans ton code ca devrait être plus clair au final, par exemple que de faire une classe typeAttaque(), là tu vas être obligé de créer un objet, etc. alors que sinon tu auras :

    $perso->attack($ennemi);

    et cela ne produira aucun test de type d'attaque ou type de perso (t'auras un seul switch dans le constructeur de debutJeu).

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Ok, de toute façon, je crois que je vais recommencé en partant sur de meilleures bases, car là j'y suis un peu allé à tâtons.

    Merci de vos réponses

  12. #12
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par Xunil
    Ok, de toute façon, je crois que je vais recommencé en partant sur de meilleures bases, car là j'y suis un peu allé à tâtons.

    Merci de vos réponses
    C'est comme ça qu'on apprends et qu'on s'améliore

  13. #13
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    si tes persos n'ont pas de très grandes différences, l'héritage est peut-être inutile, par contre une classe Perso te facilitera certainement la tâche.

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Même si t'a pas beaucoup de perso, un classe perso sera utile. Car le jour ou tu voudras rajouter un type de personnage ça sera trivial alors que sinon tu vas devoir te replonger dans ton code.

    l'héritage est vraiment très pratique pour ton type d'application. Car ce qui compte avant tout c'est que ton personnage Attaque, après en fonction de c'est caractéristique personnel il va effectuer l'action attaquer de façon différente. Donc la classe Perso va définir les Actions possibles d'un personnage quelle qu'il soit. Et la classe du type de Perso à pour rôle de redéfinir l'action exacte de l'action.

    On voit bien dans cette exemple que rajouter un type de personnage reviens à recréer un classe en redéfinissant les méthodes de la classe Perso. Conclusion on est complètement indépendant du reste des autres classes et donc on ne risque pas de créer un bug dans l'application en rajoutant un type de personnage.

    On appelle ça le polymorphisme.

    J'espère avoir été clair dans mon explication .

    Pour plus de renseignement sur le sujet je te conseil de lire les bases sur la POO et parcourir la partie UML du forum pour t'aider à modéliser ton application.

    Avant de te lancer dans un programme je pense qu'il faut que tu ais compris les notions de base: l'encapsulation et le polymorphisme. Après tu verras les choses de façon bien plus clair.

    Bon chance, moi la POO ça m'a vraiment simpifié la vie et je sais plus m'en passer maintenant .

    La suite risque de pas plair aux inconditionnel du PHP mais je te conseil de ne pas commencer par le PHP qui est un langage très peu typé mais plutôt dans un langage plus rigoureux qui te laisse moins de liberté. ça te fera ressortir plus facilement tes érreurs et sera donc plus formateur je pense. .

  15. #15
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    En ce qui concerne le nombre de personnage, oui ça va être évolutif(géré à partir d'une bdd), et puis cette application que j'ai choisie me semblait appropriée pour être faite à l'aide d'objet, et je veux réaliser ceci justement pour que j'arrive à comprendre la poo en php, car plus je lis des tutos dessus et moins je piges
    Des trucs comme __set, __get, __sleep, __wakeup, les interfaces dont j'arrive pas bien à comprendre à quoi tout ça sert...

    Donc le meilleur moyen est de passer à l'acte, y'a que comme ça que j'arriverais à assimiler le concept.

    UML, oui j'ai commencé à lire, mais c'est pas vraiment passionnant

    En fait en procédural, je me débrouille très bien, sinon j'aurais même pas tenté de faire ça.

    Et puis j'ai essayé d'autres langages avant comme le VBA(pouark ), le C++, et dernièrement du python, mais j'ai pas été emballé, je m'intéresserais plus à python dans l'avenir, vu qu'il est un peu orienté web, mais j'aime bien le php qui me semble un des langages les plus faciles à apprendre, enfin d'après ceux que j'ai essayé.

    Merci de vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/08/2008, 22h19
  2. [POO] Initiation par un petit projet
    Par Ministar dans le forum Langage
    Réponses: 1
    Dernier message: 30/01/2008, 11h01
  3. [POO] bouquin php et poo
    Par leblaireau dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 21h40
  4. [POO] Problème de compréhension POO
    Par fredrik dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 15h39
  5. [POO] site web en poo
    Par gforce dans le forum Langage
    Réponses: 13
    Dernier message: 28/04/2006, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo