Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'égalité avec les classes

    29 novembre 2020 à 14:56:29

    Bonjour je travaille sur un petit projet en utilisant les classes en python qui consiste à créer une classe Heroes puis 4 classes pour définir leur factions( des classes filles de Heroes) à savoir Humain , Nain , Elfe et Orc . J'ai sans problème réussit à programmer une grande partie de ce que je voulait faire.

    Mais je désirais que lorsque leur barre d'énergie atteigne 100, ils puissent utiliser un sort spécial tel que pour un Humain il puisse utiliser une capacité "lame_de_lumiere" qui double les dégats. Pour cela, comme mon code commençait à devenir long j'ai séparé mon code en deux avec une partie ou je mets mes classes et l'autre mes fonctions qui désignent chaque sort ( je ne sais pas vraiment si c'est la meilleure solution mais je ne voyait que ce moyen là pour que ces sorts puissent affecter différents attributs de mes classes. Cependant je rencontre un problème dans ma fonction de sort, je voulais que la fonction puisse retourner soit des dégats doublés, soit des dégats_critiques si la classe qui attaque à l'avantage sur son adversaire (tel que Humain > Nain) et là vient le problème je n'arrive pas à vérifier si l'objet appartient à telle ou telle classe.

        if heros.__class__ == V2_2_Classes.Humain:
            if adversaire.__class__ == V2_2_Classes.Nain:
                return degats_critiques
        elif heros.__class__ == V2_2_Classes.Nain:
            if adversaire.__class__ == V2_2_Classes.Elfe:
                return degats_critiques
        elif heros.__class__ == V2_2_Classes.Elfe:
            if adversaire.__class__ == V2_2_Classes.Orc:
                return degats_critiques
        elif heros.__class__ == V2_2_Classes.Orc:
            if adversaire.__class__ == V2_2_Classes.Humain:
                return degats_critiques
        else:
            return degats


    J'ai tester mon code en faisant combattre un personnage Humain contre Nain mais lorsque que l'humain utilise son sort cela retourne systématiquement les  dégats normaux et non les dégats critiques.

    J'espère que vous pourrez m'aider et me conseiller.

    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2020 à 15:04:14

      N'utilise pas l'attribut __class__ mais la fonction isinstance :

      if isinstance(heros, V2_2_Classes.Humain):


      Et sinon le problème viens de tes conditions. Tu ne teste que le cas où le heros est un humain et l'adversaire un nain, mais pas l'inverse.

      Tu devrais implémenter une méthode calculer_degats, directement dans les classes.
      Par exemple pour la classe humain :

      class Humain:
          ...
          def calculer_degats(self, joueur):
              if isinstance(joueur, Nain):
                  return degats_critiques
              return degats
      
      
      
      

      Ainsi, ça marchera dans les deux sens :

      degats_adversaire = heros.calculer_degats(adversaire)
      degats_heros = adversaire.calculer_degats(heros)




      -
      Edité par thelinekioubeur 29 novembre 2020 à 15:08:16

      • Partager sur Facebook
      • Partager sur Twitter
        29 novembre 2020 à 15:07:30

        D'accord merci je ne connaissais pas cette fonction.

        Ce n'est pas un problème car la faiblesse ne s'applique que dans le cas ou l'Humain attaque un Nain ( ou du moins pour l'instant) .

        Mais merci beaucoup :)

        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2020 à 16:28:15

          Les classes sont là pour éviter les if then else!

          Pourquoi ne pas passer par l'héritage d'un attribut degats?

          class Nain(...):
                 degats = ...
          
          class Humain(Nain):
                 ...
          
          joueur = Humain(...)
          if joueur.degats ==... :
          

          Du coup, plus rien à tester pour récupérer degats.
          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2020 à 17:34:48

            Super merci beaucoup de vos conseils/idées et au passage j'aurais une autre ptite question (qui est assez complexe à expliquer alors je m'excuse d'avance).

            class Humain(Heroes):
                    def calculer_degats(self,adversaire):
                        degats_ult = V2_2_Spells.choix_ultime()(self.adversaire)
                        if self.energy == 100:
                            if isinstance(adversaire, Nain):
                                degats = degats_ult[1]
                            else:
                                degats = degats_ult[1]
                        if isinstance(adversaire, Nain):
                            degats = round((self.strength + (self.strength * 0.5)) - adversaire.defense)
                        else:
                            degats = round(self.strength - adversaire.defense)
                        return degats

            J'ai fait un truc comme ça et le problème vient à la ligne 3 : 

            degats_ult = V2_2_Spells.choix_ultime()(self.adversaire)

            J'essaie de remplacer automatiquement choix_ultime() (qui est une fonction ci-dessous) par le nom de l'ultime à aller chercher dans mon autre fichier. Evidemment ça ne marche pas et j'aimerais savoir si ce que je veux faire est faisable et si oui comment sinon j'ai une autre alternative mais beaucoup moins jolie à écrire.

            class Humain(Heroes):
                def choix_ultime(self):
                    if self.nom == "Lancelot":
                        ult = V2_2_Spells.lame_de_lumiere       
                        return ult


            Merci d'avance !

            -
            Edité par TomaTwo 29 novembre 2020 à 17:40:42

            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2020 à 20:42:45

              En suivant l'idée précedente:

              class Lancelot (Humain):
                     def utl(self, other):
                           return V2_2_Spells.lame_de_lumiere(other)

              On surcharge la méthode utl définie autrement pour les autres Humain

              Et on écrit:

              class Humain(Heroes):
                      def calculer_degats(self,adversaire):
                          degats_ult = self.ult(self.adversaire)


              • Partager sur Facebook
              • Partager sur Twitter
                29 novembre 2020 à 21:10:16

                Ouais c'est une solution mais dans l'idée ça m'oblige à créer une classe pour chaque héros et c'est pas très pratique mais merci quand même.
                • Partager sur Facebook
                • Partager sur Twitter
                  30 novembre 2020 à 9:52:30

                  ThomasThéault a écrit:

                  mais dans l'idée ça m'oblige à créer une classe pour chaque héros et c'est pas très pratique mais merci quand même.


                  Le nom de vos héros doit être défini pour pouvoir faire quelque chose en fonction de...

                  Les dictionnaires peuvent aussi vous aider dans ce cas là

                  class Humain(Heroes):
                          def calculer_degats(self,adversaire):
                              degats_ult = self.ult[self.name](self.adversaire)

                  Et pour les nom indéfinis, .get permet de retourner une valeur par défaut.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème d'égalité avec les classes

                  × 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