Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Tetris en Python




  1. #1
    henryallen

    Tetris en Python

    Bonjour à tous et à toutes,

    J'essaye actuellement, comme l'indique le titre, de créer le jeu Tetris en Python (et en utilisant Pygame pour l'affichage). J'ai donc commencé, mais je me heurte ici à un problème: parfois une pièce ne tombe pas comme elle devrait le faire, et la conséquence est qu'une autre pièce est créée ... Ce qui est tout à fait anormal. Je vous explique certaines choses avant de mettre le code: j'utilise comme différentes pièces celles que l'on retrouve sur la page Wikipédia du jeu, mais je les gère en fait case par case: je n'importe pas l'image de l'objet, mais une case de la couleur correspondante, que je colle autant de fois que nécessaire. En lançant le programme, on voit bien le problème: une pièce nouvellement créée va apparaître de plus en plus tard.

    Voici le code:

    Code:
    import pygame
    from pygame.locals import *
    pygame.init()
    
    from random import randrange
    
    #Liste contenant des tuples de la forme (nom de la piece, [coordonnees]).
    pieces=(("i", [[5*25, 0], [6*25, 0], [7*25, 0], [8*25, 0]]), ("j", [[5*25, 0], [6*25, 0], [7*25, 0], [7*25, 25]]), ("l", [[5*25, 0], [5*25, 25], [5*25, 50], [4*25, 0]]), ("o", [[5*25, 0], [6*25, 0], [5*25, 25], [6*25, 25]]), ("s", [[4*25, 25], [5*25, 25], [5*25, 0], [6*25, 0]]), ("t", [[5*25, 0], [6*25, 0], [6*25, 25], [7*25, 0]]), ("z", [[4*25, 0], [5*25, 0], [5*25, 25], [6*25, 25]]))
    
    class Tetris:
        """Classe pour chaque pièce de 4 cases."""
        def __init__(self, grille):
            """Crée une nouvelle pièce qui tombe."""
            al=randrange(len(pieces))
            self.categorie=pieces[al][0] #On choisit aléatoirement la catégorie.
            self.image=pygame.image.load("images/"+self.categorie+".jpg").convert() #On prend l'image correspondante.
            self.coordonnees=pieces[al][1] #Et de même pour les coordonnées.
            for (x, y) in self.coordonnees:
                grille[x, y]=self.categorie #Pour chaque case occupée par la pièce, on l'indique dans le dictionnaire grille.
        def afficher(self, fenetre):
            """Permet l'affichage de la pièce."""
            for (x, y) in self.coordonnees:
                fenetre.blit(self.image, (200+x, y)) #On colle l'image à chaque case occupée.
        def tombe(self, grille):
            """Détermine si la pièce peut tomber."""
            for (x, y) in self.coordonnees: #Pour chacune de ses cases:
                if y==475 or ([x, y+25] not in self.coordonnees and grille[x, y+25]!=""): #Si elle est tout en bas, ou qu'une case en-dessous est occupée:
                    return False #Elle ne tombe pas.
            return True #Sinon elle tombe.
        def tomber(self, grille):
            """Permet de faire tomber la pièce."""
            for (x, y) in self.coordonnees:
                grille[x, y]="" #On enlève les cases occupées par la pièce dans grille.
            for n in range(len(self.coordonnees)):
                self.coordonnees[n][1]+=25 #On fait descendre la pièce.
            for (x, y) in self.coordonnees:
                grille[x, y]=self.categorie #On re-remplit la grille.
            
    
    fenetre=pygame.display.set_mode((500, 500))
    
    fond_gauche=pygame.image.load("images/fond_gauche.png").convert()
    fond_droite=pygame.image.load("images/fond_droite.png").convert()
    
    continuer=True
    
    grille={} #Contient des clés [x, y] qui sont associées au contenu de la case qu'elles indiquent.
    for a in range(12):
        for b in range(20):
            grille[a*25, b*25]=""
    
    pygame.key.set_repeat(300, 17)
    
    liste_pieces=[Tetris(grille)] #Liste contenant les différentes pièces (on en crée déjà une).
    
    while continuer:
        pygame.time.Clock().tick(6)
        fenetre.blit(fond_gauche, (0, 0))
        fenetre.blit(fond_droite, (200, 0)) #On affiche le fond.
        """Le problème semble se situer juste après. En effet, il semblerait que la fonction tombe soit utilisée pour des pièces en-dehors de la dernière créée."""
        if liste_pieces[-1].tombe(grille): #Si la dernière pièce de la liste peut tomber:
            liste_pieces[-1].tomber(grille) #Elle tombe.
        else:
            liste_pieces.append(Tetris(grille)) #Sinon, on en crée une autre qu'on ajoute à la fin de la liste.
        for piece in liste_pieces:
            piece.afficher(fenetre) #On affiche chaque pièce.
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type==QUIT:
                continuer=False
    pygame.quit()
    Je joins également les différentes images (qui, comme on peut le voir dans le code, doivent être placées dans un dossier "images". Après, libre à vous de modifier cette ligne si vous le souhaitez).

    Je ne sais pas si j'ai été clair, dans le cas contraire n'hésitez pas à me poser des questions.
    Je me doute aussi que mon code est loin d'être optimal, j'essayerai de réfléchir aux améliorations possibles une fois que j'aurai résolu ce problème et que je me serai avancé dans le reste du jeu.

    Si vous pouviez donc m'aider, ce serait vraiment sympa ...
    Merci d'avance
    Bonne journée

    -----

    Fichiers attachés Fichiers attachés

  2. #2
    henryallen

    Re : Tetris en Python

    J'ai finalement trouvé l'origine de mon problème: dans le constructeur de la classe Tetris, lorsque je faisais self.coordonnees=pieces[al][1], je faisais une égalité entre deux listes ... Erreur que j'ai tendance à faire trop souvent à mon goût. Et donc lorsqu'une liste était modifiée, l'autre l'était également, donc la création de nouvelles pièces posait problème ...

    Merci à ceux qui ont pris le temps de lire
    Bonne journée

Discussions similaires

  1. Tetris Python
    Par Celeniaa dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 29/03/2017, 23h46
  2. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 19h56
  3. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 16h47
  4. Tétris
    Par azoth dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 05/01/2006, 15h22
  5. relation du tétris
    Par milsabor dans le forum Mathématiques du supérieur
    Réponses: 27
    Dernier message: 18/10/2005, 22h08