Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec un générateur

Sujet résolu
    26 mars 2011 à 11:25:30

    Bonjour

    Ayant débuté en python il y a peu, je me suis lancé dans la réalisation d'un tetris.
    Mon problème vient lorsque j'essaye d'insérer mon objet en haut de la grille de jeu.

    Voici le code:
    from random import randrange
    
    objet = (
    ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
    ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0)),
    ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
    ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0))
    )
    orientation = randrange(0, 3)
    
    def generateur():
    	for ligne in range(len(objet[orientation])):
    		for valeur in range(len(objet[orientation][ligne])):
    			yield objet[orientation][ligne][valeur]
    
    grille = [0] * 20
    for i in range(len(grille)):
    	grille[i] = [0] * 10
    
    for i in range(len(grille)):
    	for j in range(len(grille[i])):
    		if i<4:
    			grille[i][3] = next(generateur())
    			
    print(grille)
    


    Il n'y a que des zéros qui s'affichent dans ma grille au lieu d'avoir les valeurs de l'objet.
    Merci par avance de votre aide
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 mars 2011 à 11:35:37

      Un exemple ne sera que plus efficace

      >>> def test():
      ...     for i in range(10):
      ...         yield i
      ... 
      >>> c = test()
      >>> c.next()
      0
      >>> c.next()
      1
      >>> c.next()
      2
      >>> c.next()
      3
      >>> c.next()
      4
      >>> c.next()
      5
      


      Edit : Attention à respecter les règles de la PEP 8 en ce qui concerne l'indentation.

      Citation

      grille[i][3]



      Je rêve où tu es en train d'affecter à un nombre une valeur

      En gros c'est comme si tu faisais 3 = 5 :o

      à moins que j'ai mal compris, mais bon j'ai un gros doute quand même
      • Partager sur Facebook
      • Partager sur Twitter
        26 mars 2011 à 11:59:21

        Je comprends bien l'exemple, cependant j'ai l'impression de reproduire la même démarche dans le bout de code précédent, je ne comprends toujours pas d'où vient l'erreur..
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          26 mars 2011 à 12:08:58

          Citation

          next(generateur())



          Euh non tu ne reproduis pas du tout. Mais oublie ce que j'ai mis avant c'était pour la version 2.x et apparemment pour la version 3 c'est complètement différent.

          Par contre

          >>> def test():
          ...     for i in range(10):
          ...         yield i
          ... 
          >>> next(test())
          0
          >>> next(test())
          0
          >>> next(test())
          0
          


          Tu dois juste faire ceci

          >>> c = test() # cette phase est importante
          >>> next(c)
          0
          >>> next(c)
          1
          >>> next(c)
          2
          


          J'ai édité plus haut pour d'autres erreurs.

          • Partager sur Facebook
          • Partager sur Twitter
            26 mars 2011 à 12:14:40

            C'est déjà mieux merci,
            la ca semble fonctionner, seulement mon second problème vient du fait que la fonction yield renvoie StopIteration lorsqu'elle a finit de lister les valeurs de mon objet. Comment faire pour continuer a exécuter la suite du programme (afficher la grille)?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              26 mars 2011 à 12:20:33

              orientation est une constante?

              car tu ne la modifies jamais elle est toujours égale à 2.

              Tu aurais pu très bien écrire

              orientation = 2 # ça aurait été la même chose.
              


              En gros ton générateur te renverra toujours la valeur 0
              • Partager sur Facebook
              • Partager sur Twitter
                26 mars 2011 à 12:34:34

                orientation ne change pas au cours du programme, mais doit être aléatoire pour le début du jeu, pour pouvoir choisir une figure au hasard.
                J'aimerais que le générateur retourne 16 valeurs qui correspondent à celles de la pièce
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  26 mars 2011 à 13:36:41

                  Pour éviter le Message Stopiteration, tu dois créer une boucle

                  c = generateur()
                  
                  while True:
                      try:
                          print(next(c))
                      except StopIteration:
                          break
                  


                  En gros ça te donne ceci mais ton problème n'est pas réglé, tu as toujours le même problème

                  from random import randrange
                  
                  objet = (
                  ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
                  ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0)),
                  ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
                  ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0))
                  )
                  orientation = randrange(0, 3)
                  
                  def generateur():
                  	for ligne in range(len(objet[orientation])):
                  		for valeur in range(len(objet[orientation][ligne])):
                  			yield objet[orientation][ligne][valeur]
                  
                  c = generateur()
                  grille = [0] * 20
                  for i in range(len(grille)):
                  	grille[i] = [0] * 10
                  
                  for i in range(len(grille)):
                  	for j in range(len(grille[i])):
                  		while True:
                  			try:
                  				grille[i][3] = next(c)
                  			except StopIteration:
                  				break
                  			
                  print(grille)
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mars 2011 à 13:44:55

                    Ca marche très bien. Cependant je n'arrive toujours pas a comprendre pourquoi mon générateur renvoie 0

                    Merci pour ton aide en tout cas!
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      26 mars 2011 à 14:21:34

                      Bon j'ai trouvé enfin je pense, je te donne le résultat, tu replaceras juste tes len(...) correctement, c'était pour mes tests.

                      from random import randrange
                      
                      objet = (
                      ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
                      ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0)),
                      ((0, 0, 0, 0), (0, 0, 2, 1), (0, 1, 1, 0), (0, 0, 0, 0)),
                      ((0, 0, 1, 0), (0, 0, 2, 1), (0, 0, 0, 1), (0, 0, 0, 0))
                      )
                      orientation = randrange(0, 3)
                      
                      def generateur():
                      	for ligne in range(len(objet[orientation])):
                      		for valeur in range(len(objet[orientation][ligne])):
                      			yield objet[orientation][ligne][valeur]
                      
                      grille = [0]*20
                      for i in range(20):
                          grille[i] = [0]*10
                      
                      for i in range(20):
                      	c = generateur()
                      	for j in range(10):
                      		grille[i][j] = next(c)
                      
                      print(grille)
                      


                      Je suis pratiquement sûr qu'il y a plus simple que ta démarche, mais c'est ton code :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 mars 2011 à 14:27:21

                        Le code fonctionne bien. Merci a toi
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème avec un générateur

                        × 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