Partage
  • Partager sur Facebook
  • Partager sur Twitter

Porblème projet isn bombes bomberman [Pygame]

Problème explosion des bombes

    19 mai 2015 à 16:19:17

    Bonjour,

    J'ai un gros soucis lorsque je pose mes bombes lorsque je pose mes bombes, mon problème est dure à décrire donc je vous donne mon code ci-joint:

    https://www.mediafire.com/folder/v65zt89lf2n5p/Bomberman

    Mais je vais tout de même essayer de vous expliquer mon problème.

    Lorsque je pose une bombe, l'affichage d'une explosion 3 seconde après se déroule correctement, mais l'explosion ne détruit pas les blocs autour de la bombe, mais à un autre endroit, ainsi mon personnage peut se déplacer sur les blocs qui devaient être détruits, mais pas sur ceux qui ont réellement été détruits. Je sais que ce n'est pas très explicite mais vous pouvez tester par vous même.

    Pistes déjà envisagés : J'ai déjà tenté l'affichage de ma liste permettant l'affichage du niveau et il ne semble rien avoir à signaler

    Quelques images:

    Avant explosionpendant l'explosionaprès l'explosionliste du niveau

    • Partager sur Facebook
    • Partager sur Twitter
    Are you a one or a zero ?
      20 mai 2015 à 14:41:16

      Tu as inversé lignes et colonnes ! :D
      • Partager sur Facebook
      • Partager sur Twitter
      OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
        20 mai 2015 à 20:05:13

        class Bombe:
            
            def __init__(self, explosion, niveau):
          
                self.explosion = pygame.image.load(explosion).convert()
                self.explosion.set_colorkey((255,255,255))
        
                self.case_x = 0
                self.case_y = 0
                self.x = 0
                self.y = 0
                self.direction = self.explosion
          
                self.niveau = niveau
        
            def boum(self):
        
                    if self.niveau.structure[self.case_x+1][self.case_y]=="d":
                        self.niveau.structure[self.case_x+1][self.case_y]="0"
        
        
        
                    if self.niveau.structure[self.case_x-1][self.case_y] == "d":
                        self.niveau.structure[self.case_x-1][self.case_y]= "0"
        
                    if self.niveau.structure[self.case_x][self.case_y+1]=="d":
                        self.niveau.structure[self.case_x][self.case_y+1]="0"
        
        
                    if self.niveau.structure[self.case_x][self.case_y-1]=="d":
                        self.niveau.structure[self.case_x][self.case_y-1]="0"


        J'ai presque le même problème, sauf que moi le mur ('d') dans ma liste ne se remplace pas par ('0') .... voici mon code :

        • Partager sur Facebook
        • Partager sur Twitter
        Jouer a jeu, c'est bien... l'avoir fait, c'est MIEUX!
          20 mai 2015 à 23:04:54

          Merci de me répondre, mais je m'étais rendu compte qu'il y avait une inversion x/y mais je ne vois vraiment pas à quel niveau :/
          • Partager sur Facebook
          • Partager sur Twitter
          Are you a one or a zero ?
            21 mai 2015 à 8:35:45

            Peux-tu poster la partie du code où la Bombe est censée exploser ?

            -
            Edité par IQbrod 21 mai 2015 à 8:35:56

            • Partager sur Facebook
            • Partager sur Twitter
            OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
              21 mai 2015 à 15:42:35

              Oui voici le code :

              class Bombe:
              	def __init__(self, img, exp, niveau):
              
              		self.img=pygame.image.load(img).convert_alpha()
              		self.exp=pygame.image.load(exp).convert()
              		self.x=0
              		self.y=0
              		self.case_x=0
              		self.case_y=0
              		self.niveau=niveau
              	
              	def explosion(self):
              
              		if self.niveau.structure[self.case_x+1][self.case_y]!="1":
              			fenetre.blit(self.exp,(self.x+30,self.y))
              			if self.niveau.structure[self.case_x+1][self.case_y]=="0":
              				self.niveau.structure[self.case_x+1][self.case_y]="_"
              		
              		if self.niveau.structure[self.case_x-1][self.case_y]!="1":
              			fenetre.blit(self.exp,(self.x-30,self.y))
              			if self.niveau.structure[self.case_x-1][self.case_y]=="0":
              				self.niveau.structure[self.case_x-1][self.case_y]="_"
              		
              		if self.niveau.structure[self.case_x][self.case_y+1]!="1":
              			fenetre.blit(self.exp,(self.x,self.y+30))
              			if self.niveau.structure[self.case_x][self.case_y+1]=="0":
              				self.niveau.structure[self.case_x][self.case_y+1]="_"
              		
              		if self.niveau.structure[self.case_x][self.case_y-1]!="1":
              			fenetre.blit(self.exp,(self.x,self.y-30))
              			if self.niveau.structure[self.case_x][self.case_y-1]=="0":
              				self.niveau.structure[self.case_x][self.case_y-1]="_"
              
              
              while continuer_jeu:
              		pygame.time.Clock().tick(30)
              		for event in pygame.event.get():
              			if event.type== QUIT:
              				continuer_jeu=0
              				continuer=0
              				pygame.quit()
              			elif event.type==KEYDOWN:
              				if event.key==K_ESCAPE:
              					continuer_jeu=0
              				elif event.key==K_RIGHT:
              					bb.deplacer("droite")
              				elif event.key==K_LEFT:
              					bb.deplacer("gauche")
              				elif event.key==K_DOWN:
              					bb.deplacer("bas")
              				elif event.key==K_UP:
              					bb.deplacer("haut")
              				elif event.key==K_RCTRL:
              					temps=time()-debut
              					if temps>=3 or temps<0:
              						debut=time()
              						bombe.x=bb.x
              						bombe.y=bb.y
              						bombe.case_x=bb.case_x
              						bombe.case_y=bb.case_y
              				elif event.key==K_d:
              					bb2.deplacer("droite")
              				elif event.key==K_a:
              					bb2.deplacer("gauche")
              				elif event.key==K_s:
              					bb2.deplacer("bas")
              				elif event.key==K_w:
              					bb2.deplacer("haut")
              					print(niveau.structure)
              				elif event.key==K_SPACE:
              					temps2=time()-debut2
              					if temps2>=3 or temps2<0:
              						print(niveau.structure)
              						debut2=time()
              						bombe2.x=bb2.x
              						bombe2.y=bb2.y
              						bombe2.case_x=bb2.case_x
              						bombe2.case_y=bb2.case_y
              					
              		fenetre.blit(fond, (0,0))
              		niveau.afficher(fenetre)
              		temps=time()-debut
              		temps2=time()-debut2
              		if temps<3 and temps>=0:
              			fenetre.blit(bombe.img,(bombe.x, bombe.y))
              		elif temps>=3 and temps <=4:
              			bombe.explosion()
              		if temps2<3 and temps2>=0:
              			fenetre.blit(bombe2.img,(bombe2.x,bombe2.y))
              		elif temps2>=3 and temps2 <=4:
              			bombe2.explosion()
              		fenetre.blit(bb.direction, (bb.x, bb.y))
              		fenetre.blit(bb2.direction, (bb2.x, bb2.y))
              		pygame.display.flip()


              -
              Edité par Yeny3n 21 mai 2015 à 15:48:10

              • Partager sur Facebook
              • Partager sur Twitter
              Are you a one or a zero ?
                21 mai 2015 à 15:44:53

                Et j'ai aussi bien définit la variable debut et debut2.

                -
                Edité par Yeny3n 21 mai 2015 à 15:49:05

                • Partager sur Facebook
                • Partager sur Twitter
                Are you a one or a zero ?
                  21 mai 2015 à 16:02:23

                  Salut,

                  Comme l'a souligné IQ, le problème c'est que tu as inversé ligne et colonnes. Mais pas au niveau de l'explosion, car on voit bien sur ton image que l'explosion est placée au bon endroit, mais au niveau de la destruction de tes murs. Regarde la partie où tu mets à jour les cases après l'explosion (notamment le code où tu changes les images).

                  PS: J'ai regardé en diagonal, mais tu peux remplacer tes if ... and ... en utilisant le mot-clé in, qui est plus compréhensible:

                  #Ancienne forme
                  if temps<3 and temps>=0:
                  if temps>=3 and temps<=4:
                  
                  #Nouvelle forme
                  if temps in range(3):
                  if temps in (3,4):



                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    21 mai 2015 à 17:49:33

                    Donc si je comprend bien c'est ici qu'il y a un problème ?

                    self.niveau.structure[self.case_x+1][self.case_y]="_"

                    Mais je ne vois vraiment pas.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Are you a one or a zero ?
                      21 mai 2015 à 18:33:26

                      Est-ce que tu ne supprimerai pas par hasard les cases à côté du personnage, au lieu de celles à côté de la bombe?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Précepte: Le mieux est l'ennemi du bien
                      Anonyme
                        21 mai 2015 à 18:58:10

                        Ca ne devrait pas plutôt être self.niveau.structure[self.case_y][self.case_x+1] (de même pour les autres lignes où tu inverses x et y) ?

                        PS: Pour le if temps in range(3): on peut aussi écrire if 0 <= temps < 3: mais les deux sont tout aussi propres :)

                        Edit: Désolé IQBrod, j'avais pas vu ton message, je pense que c'est ce que tu voulais dire :)

                        -
                        Edité par Anonyme 21 mai 2015 à 18:59:41

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 mai 2015 à 19:10:49

                          Olygrim a écrit:

                          Est-ce que tu ne supprimerai pas par hasard les cases à côté du personnage, au lieu de celles à côté de la bombe?

                          Non car lorsque je laisse le personnage statique sur la bombe le résultat est le même :/

                          AlphaZeta a écrit:

                          Ca ne devrait pas plutôt être self.niveau.structure[self.case_y][self.case_x+1] (de même pour les autres lignes où tu inverses x et y) ?

                          PS: Pour le if temps in range(3): on peut aussi écrire if 0 <= temps < 3: mais les deux sont tout aussi propres :)

                          Edit: Désolé IQBrod, j'avais pas vu ton message, je pense que c'est ce que tu voulais dire :)

                          -
                          Edité par AlphaZeta il y a 6 minutes

                          J'ai déjà essayer d’inverser x/y dans tous les sens :/





                          • Partager sur Facebook
                          • Partager sur Twitter
                          Are you a one or a zero ?
                            22 mai 2015 à 8:25:24

                            Dans ton tableau de structure je remarque que les cases sont rangées par lignes.

                            [['a','a','a'],['b','b','b'],['c','c','c']]
                            #aaa
                            #bbb
                            #ccc

                            En somme on ira d'abord chercher la profondeur (y) puis la largeur (x). Tu accèdera au deuxieme element de la derniere ligne par [3][2] et non pas [2][3].

                            En explosant tes bombes en fonction de [case_x][case_y] tu exploses l'opposé de chaque case par sa diagonale.
                            Tes case_x et case_y sont bons ce n'est que lors de la comparasion avec le fichier de structure que tu t'es mélangé les pinceaux :)

                            • Partager sur Facebook
                            • Partager sur Twitter
                            OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                              22 mai 2015 à 8:28:32

                              Yeny3n a écrit:

                              Oui voici le code :

                              class Bombe:
                              	def __init__(self, img, exp, niveau):
                              
                              		self.img=pygame.image.load(img).convert_alpha()
                              		self.exp=pygame.image.load(exp).convert()
                              		self.x=0
                              		self.y=0
                              		self.case_x=0
                              		self.case_y=0
                              		self.niveau=niveau
                              	
                              	def explosion(self):
                              
                              		if self.niveau.structure[self.case_x+1][self.case_y]!="1":
                              			fenetre.blit(self.exp,(self.x+30,self.y))
                              			if self.niveau.structure[self.case_x+1][self.case_y]=="0":
                              				self.niveau.structure[self.case_x+1][self.case_y]="_"
                              		
                              		if self.niveau.structure[self.case_x-1][self.case_y]!="1":
                              			fenetre.blit(self.exp,(self.x-30,self.y))
                              			if self.niveau.structure[self.case_x-1][self.case_y]=="0":
                              				self.niveau.structure[self.case_x-1][self.case_y]="_"
                              		
                              		if self.niveau.structure[self.case_x][self.case_y+1]!="1":
                              			fenetre.blit(self.exp,(self.x,self.y+30))
                              			if self.niveau.structure[self.case_x][self.case_y+1]=="0":
                              				self.niveau.structure[self.case_x][self.case_y+1]="_"
                              		
                              		if self.niveau.structure[self.case_x][self.case_y-1]!="1":
                              			fenetre.blit(self.exp,(self.x,self.y-30))
                              			if self.niveau.structure[self.case_x][self.case_y-1]=="0":
                              				self.niveau.structure[self.case_x][self.case_y-1]="_"

                              Ce code là est bon, seulement ton accès est en [x][y] et non [y][x].
                              Garde ton code en inversant simplement ton ordre d'accès.

                              Attention : Le code n'est pas à modifier : [self.case_x][self.case_y-1] devient [self.case_y-1][self.case_x]

                              • Partager sur Facebook
                              • Partager sur Twitter
                              OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                                22 mai 2015 à 8:41:38

                                "J'ai déjà essayer d’inverser x/y dans tous les sens :/"

                                Et qu'est-ce que ça te donne? Si rien ne change, peut-être n'exécutes-tu tout simplement pas le bon code?

                                @IQ Dans ton exemple, tu as bien une écriture [case_x][case_y]. La première ligne correspond au "aaa" qui correspond bien à ton premier élément de liste, et la deuxième colonne (le 2è "a") est accessible avec [0][1].

                                Sinon personnellement je ne vois pas l'erreur dans ce morceau de code. Elle se trouve sûrement ailleurs.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Précepte: Le mieux est l'ennemi du bien
                                  22 mai 2015 à 8:43:11

                                  @Oly : Meilleure réponse en dessous.

                                  @AlphaZeta : Oui c'est ce que je voulais dire, du coup j'ai tout récapitulé mais bon je t'en veux pas je t'aime bien quand même ;) 

                                  La solution se trouve dans mes 2 posts au dessus :)

                                  -
                                  Edité par IQbrod 22 mai 2015 à 8:55:54

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                                    22 mai 2015 à 8:50:02

                                    IQbrod a écrit:

                                    Dans ton tableau de structure je remarque que les cases sont rangées par lignes.

                                    [['a','a','a'],['b','b','b'],['c','c','c']]
                                    #aaa
                                    #bbb
                                    #ccc

                                    En somme on ira d'abord chercher la profondeur (y) puis la largeur (x). Tu accèdera au deuxieme element de la derniere ligne par [3][2] et non pas [2][3].

                                    En explosant tes bombes en fonction de [case_x][case_y] tu exploses l'opposé de chaque case par sa diagonale.
                                    Tes case_x et case_y sont bons ce n'est que lors de la comparasion avec le fichier de structure que tu t'es mélangé les pinceaux :)

                                    @Oly : Prenons le cas du deuxième "a".
                                    Tout le monde est d'accord pour dire que ses coordonnées sont (1,0).
                                    Tout le monde est d'accord pour dire qu'on y accède dans le tableau par [0][1]
                                    Les accès aux éléments de la grille se font donc par [y][x]

                                    En espérant éclairer ta lanterne :magicien:

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                                      22 mai 2015 à 10:15:46

                                      "Tout le monde est d'accord pour dire que ses coordonnées sont (1,0)"

                                      Je viens de comprendre qu'il fallait que j'aille voir dans son lien mediafire pour trouver l'erreur ^^. Et donc oui je suis enfin d'accord avec toi :).

                                      Sinon Yeny3n, tu peux directement corriger ton code à la source de ton erreur. La bonne réponse est (dans ta méthode generer() je crois):

                                      for sprite in ligne:
                                          x=n_ligne* t_sprite
                                          y=n_case* t_sprite

                                      -
                                      Edité par Olygrim 22 mai 2015 à 14:33:01

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Précepte: Le mieux est l'ennemi du bien

                                      Porblème projet isn bombes bomberman [Pygame]

                                      × 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