Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classe Objets et indice des listes-tuples

Sujet résolu
    9 mars 2011 à 18:02:06

    Bonjour,
    Je suis en train de créer un mini jeux de combats :diable: en objet (uniquement dans le shell, pas d'interface encore).
    J'utilise python 3.1. La quasi totalité est en anglais car je suis inscrit à une mailing list anglaise, et ils m'aident régulièrement. Pour leur transmettre mon code, c'est plus facile de l'écrire directement en anglais !
    J'ai donc plusieurs classes, personnage, objet, pouvoir, et effet.
    J’attribue un pouvoir à un héros, un effet à un pouvoir, un effet à un objet de cette façon :
    Effect('Congelation' , 'Immobilise l\'ennemi') # C'est l'effet qui porte l'id 0
    Power('Froid devorant', 'Gèle l\'enemi sur place et lui applique', effectAll[(0)])
    


    La création de classe :

    class Effect(object):
    	EffectCount = 1
    	global effectAll
    	effectAll = []
    
    	def __init__(self, name, desc):
    		""" Create an item """
    		self.id = Effect.EffectCount
    		self.name = name
    		self.desc = desc
    		Effect.EffectCount += 1
    		effectAll.append((self))
    		print (colors.green,'Creation of' , colors.bold , self.name , colors.reset)
    
    	def __str__(self):
    		""" Display an Object with the Print function """
    		return self.name
    


    Voici mes questions :
    1)-Je voulais savoir si je pouvais appliquer au pouvoir un effet autrement que par effect[(ID)], car au bout de 100 pouvoirs, je vais devoir rechercher l'id à chaque fois, pas fun !

    2)-Suis-je sur la bonne piste de manière générale dans mon programme de combat ^ ?

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      9 mars 2011 à 18:47:02

      Beaucoup de chose que je ne comprend pas

      1) Le rôle de effectAll (pourquoi ajouter l'objet?)
      2) EffectCount = 1 dans ton code est une constante et apparemment tu veux que cette variable varie
      3) Tu aurais pu mettre la classe colors, plus sympa pour le traitement du code.

      Citation

      Power('Froid devorant', 'Gèle l\'enemi sur place et lui applique', effectAll[(0)])



      Et là c'est le final je comprend plus rien, que vas-tu faire de ton objet situé dans effectAll? La classe Power aurait été indispensable dans ton code.
      • Partager sur Facebook
      • Partager sur Twitter
        9 mars 2011 à 18:50:36

        Je t'ai pas tous mis. J'ai une classe Character, Power, Item, et Effect.
        1) J'ajoute l'effet à un pouvoir. Et cet effet est un objet.
        2) Ah, je dois supprimer l'affectation a 1 ? je veux un compteur dans chaque classe..
        3) J'ai une classe colors dans un autre fichier. Je l'importe en haut.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          9 mars 2011 à 19:01:01

          Pour ton compteur voici un exemple

          class Test(object):
              def __init__(self, x):
                  self.compteur = x
              def get(self):
                  self.compteur += 1
                  return self.compteur
          
          c = Test(15)
          for i in range(20): print c.get()
          


          Citation

          1) J'ajoute l'effet à un pouvoir. Et cet effet est un objet.



          Toujours pas compris ce que tu allais faire de cet objet

          ta liste effectAll sera de cette forme

          [<__main__.Effect object at 0x7f26f2394b10>] # tu fais quoi de cet objet dans ta liste


          Citation

          3) J'ai une classe colors dans un autre fichier. Je l'importe en haut.



          Ok

          • Partager sur Facebook
          • Partager sur Twitter
            9 mars 2011 à 19:06:15

            1) Tu as mal compris je crois. Je veux qu'à chaque fois que je créé un objet de ce type, la variable s'incrémente. > Pour savoir quand je veux combien il y a d'objet créée dans cette classe. Une variable static je crois (dans les autres langages)

            2) Avec ma classe personnage je créé un objet personnage.
            Avec ma classe pouvoir je créé un objet pouvoir.
            Avec ma classe effet, je créé un objet effet.
            J'affecte à l'objet pouvoir un objet effet.
            J'affecte à l'objet personnage un objet pouvoir.

            Voila ma vision de ma POO ici... Peut-être est-elle incorrecte ? :(
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              9 mars 2011 à 19:10:59

              Ba test ça et tu me diras si ta variable bouge

              class Test(object):
                  compteur = 0
                  def get(self):
                      compteur += 1
                      return compteur
              
              c = Test()
              for i in range(20): print c.get()
              


              • Partager sur Facebook
              • Partager sur Twitter
                9 mars 2011 à 19:15:54

                Sachant que les attaques sont des interactions entre classes, je pense que l'utilisation de méthodes ou -mieux- la surcharge d'opérateur seraient plus approprié. En gros, faire un truc comme ça :

                Jean() >> 'Ice spell' >> Marie()
                


                Mais c'est assez difficile à mettre en oeuvre
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  9 mars 2011 à 19:20:31

                  Pour la première question de Klaitos, je verrais bien un dico...

                  class Effect:
                      REFS = {} # un dico
                      def __init__(self, name, desc):
                          Effect.REFS[name] = (self, desc)
                          # suite de l'initialisation...
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    9 mars 2011 à 19:48:27

                    J'ai compris où tu voulais en venir

                    class Test(object):
                        compteur = 0
                        def __init__(self):
                            Test.compteur += 1
                    
                    for i in range(20): Test()
                    print Test.compteur
                    


                    Mais c'est source d'erreurs, et il est préférable de créer une méthode pour ton compteur.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 mars 2011 à 19:57:18

                      Je vais étudier tout sa. Je reviens vers vous plus tard =)
                      Merci !

                      EDIT 10 MARS :


                      Yohann, aurais tu des pistes pour ce que tu as dit ? Ta technique m'intéresse et je crois que tu vise le même objectif que je cherche à atteindre.
                      J'ai ma classe pouvoir et personnage.
                      Un personnage à une stat force. (15 de force par exemple) et j'ai crée une méthode dans cette classe.
                      >'Taper un personnage(cible)' ou la cible est un objet personnage.
                      Je fais personnage1.Taperunpersonnage(personnage2). Ce qui fait réduire les hp de la cible en fonction de la force du personnage1. C'est correct ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 mars 2011 à 17:02:16

                        Le Pattern Decorator en Python par NoHar. Ce tutoriel est une mine d'information, ça vaut le détour. Voilà ce le mot de la fin du tutoriel (ça te donne une idée de ce qu'on peut faire dans ce tuto)

                        >>> a = Cheeseburger('ketchup/mayo') << sans_oignon << supp_fromage
                        >>> print(a)
                        Cheeseburger sauce ketchup/mayo, sans oignons, supplément fromage
                          1x cornichons      0.10 €
                          1x salade          0.20 €
                          3x fromage         1.50 €
                          1x tomates         0.20 €
                          1x base            2.00 €
                          1x steak           0.50 €
                        Total                4.50 €
                        

                        C'est classe, non ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 mars 2011 à 17:06:45

                          Sa a l'air interessant mais vu mon niveau sa va être chaud. Je m'y met dès maintenant... Merci =)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Classe Objets et indice des listes-tuples

                          × 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