Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec ma classe

    13 août 2017 à 15:08:41

    bonjour, je suis en train de realiser un jeu pour un projet scolaire et je remarque que je ne comprend pas bien un point dans les classes.

    comment appeller une méthode d'une classe?je vais vous montrer mon code, il y a déja des appel des méthodes mais j'essaie actuelement avec ma classe "Perso" et j'ai toujours un soucis car il faudrait que les valeur "case_x" et "casey" de la classe "Perso" soyent dans les variables "posx" et "posy". je me suis basé sur le TP DKlaby qui m'a bien aidé mais la je ne trouve pas ma réponse

    import os
    import time
    import sys
    import pygame
    from pygame.locals import *
    import random
    
    
    
    
    
    pygame.init()
    window = pygame.display.set_mode((850,850), RESIZABLE)
    
    
    def initialisation():   
        window.blit(pygame.image.load("menu.png").convert(), (0, 0))
        pygame.display.flip()
        
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                   sys.exit()
                if event.type == KEYDOWN:
                    if event.key == K_0:
                        labyrinthe()
                    if event.key == K_1:
                        help()
    
    def help():
        window.blit(pygame.image.load("help.png").convert(), (0, 0))
        pygame.display.flip()
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                if event.type == KEYDOWN:
                    initialisation()
                if event.type == MOUSEBUTTONDOWN:
                    if event.button == 1:
                        initialisation()
        
        
    def rand_niveau():
        
        rand = str(random.randint(1,5))
        rand_niveau = ("labyrinthe\lab" + rand + ".txt")
        return rand_niveau
        
    def gagner(struct,posx,posy):
        if struct[posx][posy]=='a':
            return 1
        else:
            return 0
        
        
    def labyrinthe():
        random_niveau ="labyrinthe\lab1.txt" #rand_niveau()
        niveau=Niveau(random_niveau)
        perso = Perso()
        niveau.generer()
        niveau.afficherLabyrinthe()
        
        struct_lvl = niveau.structure
        
        posx = perso.case_x
        posy = perso.case_y 
        
        while gagner(struct_lvl,posx,posy) == 0:
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                elif event.key == K_RIGHT:
                    perso.deplacer("droite")
                elif event.key == K_LEFT:
                    perso.deplacer("gauche") 
                elif event.key == K_UP:
                    perso.deplacer("haut")
                elif event.key == K_DOWN:
                    perso.deplacer("bas")
                    
            afficherPerso(strucut_lvl)
            return 0
        
    class Niveau():
        
        def __init__(self,random_niveau):
            self.fichier = random_niveau
            self.structure = []
            
        def generer(self):
            with open(self.fichier,"r") as fichier:
                struct_niveau=[]
                for ligne in fichier:   
                    ligne_niveau = []
                    for case in ligne:
                        if case !='\n':
                            ligne_niveau.append(case)
                    struct_niveau.append(ligne_niveau)
                self.structure = struct_niveau
            
        def afficherLabyrinthe(self):
            mur = pygame.image.load("mur.png").convert()
            depart = pygame.image.load("echelle_monter.png").convert_alpha()
            arrivee = pygame.image.load("echelle_descendre.png").convert_alpha()
            
            num_ligne = 0
            for ligne in self.structure:
                num_case = 0
                for sprite in ligne:
                    x = num_case * 17
                    y = num_ligne * 17
                    if sprite == 'm':
                        window.blit(mur,(x,y))
                    elif sprite == 'd':
                        window.blit(depart,(x,y))
                    elif sprite == 'a':
                        window.blit(arrivee,(x,y))
                    num_case = num_case+1
                num_ligne = num_ligne+1
            pygame.display.flip()
            
            return 0
        
        
    class Perso():
        def __init__(self,hero):
            
            self.case_x = 0
            self.case_y = 0
            self.x = 0
            self.x = 0
        
            self.niveau = niveau
                
        def deplacer(self,deplacement):
            if deplacement == 'haut':
                if self.niveau.structure[self.case_y+1][self.case_x] !='m':
                    self.case_y +=1
                    self.y = self.case_y * 17
                    
            if deplacement == 'bas':
                        if self.niveau.structure[self.case_y-1][self.case_x] !='m':
                            self.case_y -=1
                            self.y = self.case_y * 17
                            
            if deplacement == 'gauche':
                        if self.niveau.structure[self.case_y][self.case_x-1] !='m':
                            self.case_x -=1
                            self.x = self.case_x * 17
    
    
            if deplacement == 'droite':
                        if self.niveau.structure[self.case_y][self.case_x+1] !='m':
                            self.case_x +=1
                            self.x = self.case_x * 17
            
        def afficherPerso(structure,posx,posy):
            hero = pygame.image.load("petit_hero.png").convert_alpha()
            num_ligne = 0
            for ligne in self.structure:
                num_case = 0
                for sprite in ligne:
                    x = num_case * 17
                    y = num_ligne * 17
                    if sprite == 'j':
                        window.blit(hero,(x,y))
                    num_case = num_case+1
                num_ligne = num_ligne+1
            pygame.display.flip()
           
            
            
            
            
        
    
    initialisation()
    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2017 à 15:19:33

      DorianDemaiffe a écrit:

      comment appeller une méthode d'une classe?je vais vous montrer mon code,

      [178 lignes]

      Bonjour,

      pourrais tu être plus spécifique dans ta question, que tu peux probablement formuler autrement qu'on nous jetant en pature 178 lignes code, à charge pour nous de deviner la question exacte à partir de "j'ai un souci".

      Parce que l'appel d'une méthode, tu le fais dès les premières lignes

      niveau.generer()

      donc c'est pas la question.



      -
      Edité par michelbillaud 13 août 2017 à 15:20:21

      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2017 à 15:22:06

        pour la classe "Niveau" j'avais mis un argument qui est "random niveau" et pour la classe "Perso" je n'ais rien mis car cela ne m'était pas nécéssaire et il me dit qu'il me manque un paramètre, j'aimerais odnc bien savoir quel est ce paramètre manquand qu'il me demande
        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2017 à 16:44:54

          Salut,

          Je crois que vous allez trop vite. Votre question n'est pas compliqué, si vous comprenez le code ! (J'espère que c'est vous qui l'avez écrit)

          Vous avez créé une classe Niveau().

          class Niveau():
              def __init__(self,random_niveau):
                  self.fichier = random_niveau
                  self.structure = []

          Vous demandez un argument, qui est le random_niveau.

          Comme vous avez dit, Votre citation: """pour la classe "Niveau" j'avais mis un argument qui est "random niveau" """

          def labyrinthe():
              random_niveau ="labyrinthe\lab1.txt" #rand_niveau()
              niveau=Niveau(random_niveau)


          Ensuite, dans votre classe Perso(), vous initialisez la classe, avec un paramètre (hero).

          class Perso():
              def __init__(self, hero):

          Aucun idée à quoi elle sert, vous la sauvegarder même pas.

          class Perso():
              def __init__(self, hero):
                  self.hero = hero

          Pourtant, vous appelez cette classe, sans argument.

          def labyrinthe():
              perso = Perso() ## Il manque le hero.

          Suffit d'inclure le nom du hero (ou peu importe, ce que la variable hero est supposé recevoir.)

          perso = Perso('Goldorak')

          Bonne chance

          A+

          -
          Edité par nolimitech 13 août 2017 à 16:45:18

          • Partager sur Facebook
          • Partager sur Twitter
            14 août 2017 à 16:57:41

            merci de votre aide^^.j'ai bien écris tout le code mais j'ai un peut de mal a cerner les classes :/
            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2017 à 20:37:43

              Salut,

              En fait, un petit truc. Lorsque vous savez pas ce que vous voulez sauvegarder (Des fois, plus on avance, plus on a besoin d'arguments), suffit de créer une classe vide. Ensuite, vous pouvez ajouter des attribues comme bon vous semblera.

              Example:

              class maClasse(object):
                  def __init__(self):
                      pass
              
              abc = maClasse()
              abc.hero = 'Salut'
              abc.posX = 30
              abc.posY = 40
              
              print(abc.__dict__)
              
              print(getattr(abc, 'name', None))
              print(getattr(abc, 'posX', None))
              
              setattr(abc, 'name', 'HakunaMatata')
              print(getattr(abc, 'name', 'Aucune idée'))
              

              Avec les méthodes getattr() et setattr(), on peut regardez ou sauvegardez, si l'attribue existe et recevoir le résultat.

              name = getattr(abc, 'name', None)
              if not name:
                  print('Nom vide (None)')
              else:
                  print('Bonjour', name)
              

              Bonne chance

              A+




              -
              Edité par nolimitech 14 août 2017 à 20:38:01

              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2017 à 18:08:21

                merci^^' 

                mais je ne comprend pas du tou ce que sont ces variables "getattr"... j'ai peut être du les louper lors de l'apprentissage du cours d'open classroom :/

                • Partager sur Facebook
                • Partager sur Twitter
                  15 août 2017 à 18:35:09

                  C'est de l'utilisation avancée de Python, ce qu'on appelle "reflection" (en) ou introspection.

                  Python est un langage dynamique où les classes sont elles-mêmes des objets, contenant leur propre description.  getattr permet de récupérer un attribut d'un objet, à partir d'une chaine de caractères contenant le nom de l'attribut.

                  C'est pratique pour un certain nombre de choses, mais absolument aucun intérêt dans cet exemple qui fait un usage basique des classes.

                  La difficulté ici, c'est de poser correctement la question.

                  Parce que quand on écrit "  il me dit qu'il me manque un paramètre, j'aimerais odnc bien savoir quel est ce paramètre manquand qu'il me demande", il faudrait au minimum reporter les messages qui indiquent DE QUELLE FONCTION, DE QUELLE LIGNE il s'agit. Genre

                  Traceback (most recent call last):
                    File "<pyshell#0>", line 1, in <module>
                      g(3)
                    File "/home/toto/xxx.py", line 5, in g
                      return f(n)
                  TypeError: f() takes exactly 2 arguments (1 given)
                  



                  -
                  Edité par michelbillaud 15 août 2017 à 18:36:26

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 août 2017 à 17:44:55

                    merci pour cette précision, je vient de trouver l'argument manquant...un "self" que je n'avais pas ecrit au début de la méthode :p

                    j'ai un petit peut avancer dans mon code et je me retrouve confronté a un autre soucis, a la ligne 73 de mon code dans la fonction 'labyrinthe' j'ai cette erreur.

                    "AttributeError: 'Event' object has no attribute 'key' "

                    je ne me suis pas très familliarisé avec pygame donc j'ai un peut du mal a comprendre comment résoudre cette erreur, il faut savoir qu'il y a 5min je pouvais déplacer mon perso dans le jeu mais que après quelques seconde cettre erreur apparaissait en le faisant bien évidement planter.

                    auriez vous une idée de comment résoudre ce soucis? si vous avez besoin d'autre info je suis a vous^^

                    def labyrinthe():
                        random_niveau ="labyrinthe\lab1.txt" #rand_niveau()
                        niveau=Niveau(random_niveau)
                        perso = Perso()
                        niveau.generer()
                        niveau.afficherLabyrinthe()
                        
                        struct_lvl = niveau.structure
                        
                        posx = perso.case_x
                        posy = perso.case_y 
                        
                        while gagner(struct_lvl,posx,posy) == 0:
                            for event in pygame.event.get():
                                if event.type == QUIT:
                                    sys.exit()
                                elif event.key == K_RIGHT:
                                    perso.deplacer("droite",struct_lvl)
                                elif event.key == K_LEFT:
                                    perso.deplacer("gauche",struct_lvl) 
                                elif event.key == K_UP:
                                    perso.deplacer("haut",struct_lvl)
                                elif event.key == K_DOWN:
                                    perso.deplacer("bas",struct_lvl)
                                    
                            niveau.afficherLabyrinthe()
                            perso.afficherPerso(struct_lvl)
                        print ("gagner")
                        return 0

                    le code qui pose problème

                    class Perso():
                        def __init__(self):
                            
                            self.case_x = 1
                            self.case_y = 1
                        
                                
                        def deplacer(self,deplacement,struct_lvl):
                            if deplacement == 'haut':
                                if struct_lvl[self.case_y+1][self.case_x] !='m':
                                    self.case_y +=1
                                    
                            elif deplacement == 'bas':
                                        if struct_lvl[self.case_y-1][self.case_x] !='m':
                                            self.case_y -=1
                                            
                            elif deplacement == 'gauche':
                                        if struct_lvl[self.case_y][self.case_x-1] !='m':
                                            self.case_x -=1
                    
                            elif deplacement == 'droite':
                                        if struct_lvl[self.case_y][self.case_x+1] !='m':
                                            self.case_x +=1

                    la méthode de déplacement du personnage

                    edit: lorsque je lance le code des murs disparraissent pour donner place a un espace vide... de plus mon perso clignote mais cela est du au moyen que j'utilise pour reffraichier l'écran(je cjercjerais plus tard comment le résoudre)

                    -
                    Edité par DorianDemaiffe 16 août 2017 à 17:47:14

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 août 2017 à 17:59:33

                      Je ne vois pas de ligne 73 ici, il va falloir faire un effort pour indiquer de laquelle il s'agit dans l'extrait.

                      Dans les exemples qu'on trouve, avant d'utiliser event.key, on verifie d'abord que l'évènement est de type "appui sur une touche".

                         if event.type == pygame.KEYDOWN:
                              if event.key == K_LEFT:
                                  ....



                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 août 2017 à 18:08:54

                        oups, je n'avais pas remarqué que ce n'etait pas la ligne du code entier c'est la ligne 18 qui pose problème et le plantage survient quand je déplace la souris
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 août 2017 à 20:17:28

                          Bin vaut mieux ouvrir les yeux parce que l'ordinateur ne le fera pas à ta place. C'est probablement ligne 17 et pas 18.

                          Quand tu bouges la souris, ça provoque des évènements de type "mousemove" qui n'ont pas d'attribut "key".

                          C'est pourquoi il faut vérifier que le type est "keydown".

                          -
                          Edité par michelbillaud 16 août 2017 à 20:18:33

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 août 2017 à 0:36:22

                            merci pour cette précision^^

                            j'ai rajouter les KEYDOWN et cela fonctionne beaucoup mieux^^ merci pour toute tes aides et excuse moi te toutes ces imprécision que je t'avais posé :/

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 août 2017 à 10:17:47

                              Y a pas de mal. En général si le débutant a un problème, c'est qu'il n'a pas pris conscience qu'il fallait faire gaffe aux éléments qu'il a sous les yeux. Genre: y a une erreur je sais pas pourquoi. Bin l'erreur, elle a lieu à une certaine ligne, et elle produit un certain message. Faut le lire, sinon y a pas moyen de dire quoi (sinon, on joue aux devinettes avec les erreurs typiques standard, mais ça donne l'impression qu'on trouve les erreurs par magie).  Donc, faut faire un peu le grumpy cat pour réveiller. Rien de personnel.

                              -
                              Edité par michelbillaud 18 août 2017 à 10:19:03

                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 août 2017 à 2:52:37

                                Les erreurs je les lisait mais c est vrai que j avais vompletement oublié de les poster. Par contre j acais du mal a comprendre pourquoi elle se produisait^^ mais x est finis maintenant car le labyrinthe fonctionne sans bug^^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 août 2017 à 16:45:10

                                  C'est jamais fini.

                                  Tu écriras peut être d'autres programmes, et chaque fois que tu écriras des programmes, tu auras des erreurs. Et il faudra y faire face.

                                  Donc

                                  • encore ouvrir les yeux
                                  • et peut être que ça aiderait de se rappeler ce qui a causé le même message, la dernière fois.

                                   le mieux pour ça, c'est de prendre trente secondes pour reformuler : il n'y avait pas l'attribut voulu parce que l'événement était d'un autre type que celui qu'on attendait.

                                  -
                                  Edité par michelbillaud 26 août 2017 à 16:48:10

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  problème avec ma classe

                                  × 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