[Python] Tetris, besoin d'aide pour élimination d'une ligne complète

Tetris, besoin d'aide pour élimination d'une ligne complète [Python] - Python - Programmation

Marsh Posté le 06-05-2015 à 17:00:58    

Bonjour à tous =)  
 
Je viens ici pour avoir un peu d'aide sur une fonction bien précise de mon programme ;) celui-ci consiste à imiter en grande partie un Tetris que l'on peut retrouver n'importe où sur internet.
Cependant, même après des recherches, nous ne comprenons pas ce qu'il y a à disposition, car nous n'avons pas encore le niveau requis pour comprendre (Seulement une année d'informatique et science du numérique en terminale ^^" ). Donc je suis en terminale et nous souhaitons avec mon meilleur ami juste un peu d'aide afin de terminer notre projet de fin d'année pour le bac ^^  
 
Ainsi, l'endroit où nous bloquons est le moment où nous devons éliminer une ligne, puis faire descendre d'un bloc tout les blocs situés au-dessus. (Je préfère le dire maintenant, nous n'utilisons pas les classes ^^" ). Bref, nous avons déjà supprimé la ligne complète, et nous avons tenté de faire descendre tout les blocs au-dessus. Les positions des blocs sont stockés dans une liste appelée "liste_sprite_occupés". Nous avons fait descendre toutes les positions des blocs au-dessus d'une liste (Cette liste est composée de 13 listes qui équivalent à une hauteur d'un seul carré).
 
Le problème étant que nous n'arrivons pas à faire descendre visuellement les blocs, ce qui pose problème au niveau des lignes ! Dans les listes, elles sont bien descendues, mais pas visuellement. Ce que je n'ai pas précisé, c'est que pour que les blocs s'arrêtent les un au-dessus des autres, nous avons utilisé une reconnaissance de couleur (un .get_at). Ainsi, les nouveaux blocs arrivant se posent sur les anciens blocs, mais qui ne sont pas à la bonne position ! Cela entraine donc des problèmes car des listes qui sont vides ont à leur place (visuellement) des blocs, ce qui empêche de continuer la partie très longtemps car l'élimination des lignes ne se fait plus correctement ...
 
Enfin bon ! Je vous met ci-dessous un petit aperçu de nos fonctions permettant d'éliminer la ligne, puis ce qu'on a tenté d'écrire pour faire descendre tout les blocs au-dessus ...
 
 
 
def suppression_ligne_complete(liste_sprite_occupés,fond,fenetre):
    index,effacer_ligne=supprimer_ligne_complète_partie1(liste_sprite_occupés)
    if effacer_ligne==True:
        creation_du_bloc_à_descendre(index)
        suppression_ligne_complète_partie2(liste_sprite_occupés,fond,fenetre,index)
     
def supprimer_ligne_complète_partie1(liste_sprite_occupés):
    effacer_ligne=False
    index=0
    for i in range (0,len(liste_sprite_occupés)):
        if len(liste_sprite_occupés[i])==10:
            effacer_ligne=True
            index=i
    return(index,effacer_ligne)
 
 
def suppression_ligne_complète_partie2(liste_sprite_occupés,fond,fenetre,index):
    surface_bloc_a_descendre=pygame.image.load("bloc_a_descendre.pbm" )
    rect_bloc_a_descendre=surface_bloc_a_descendre.get_rect()
    liste_sprite_occupés[index]=[]
    for i in range(0,index-1):
        liste_sprite_occupés[index-i]=liste_sprite_occupés[index-i-1]
    pygame.draw.rect(fond, (200, 173, 127, 255), (0,index*50,500,50))
    for i in range (0,50):
        rect_bloc_a_descendre.move(0,1)
        pygame.display.flip()
 
def creation_du_bloc_à_descendre(index):
    image=open("bloc_a_descendre.pbm","w" )
    image.write("P3\n" )
    image.write("500\n" )
    image.write(str(index*50)+"\n)
    image.write("255\n" )
    for i in range (0,index*50):
        for j in range (0,500):
            image.write(str(255)+" "+str(255)+" "+str(255)+" " )
        image.write("\n" )
    image.close()
 
 
Je ne sais pas si vous comprendrez tout, on nous a dit quelque fois que notre travail était un peu farfelu mais qu'il marchait très bien quand même ^^"  
 
Bref, je reste ici afin de répondre à vos questions si vous en avez, mais aussi pour voir si quelqu'un réussi à m'aider :D
 
Merci d'avoir jeté un coup d’œil à ma requête ! J'espère que quelqu'un pourra nous aider :D


Message édité par tetrisisn le 06-05-2015 à 17:22:18
Reply

Marsh Posté le 06-05-2015 à 17:00:58   

Reply

Marsh Posté le 07-05-2015 à 14:27:24    

D'accord, tu utilises Pygame, ça tombe bien, moi aussi ( je n'étais pas sûr du module utilisé au début... Je fais mes premiers pas en Python ^^ ).
 
J'ai effectivement du mal à lire ton code... ( le fait qu'il y ait trois fonctions de suppression et que vous vous êtes il me semble un peu embrouillés dans le nom de celles-ci me perturbe un peu ). Mais il faut dire que mes connaissances sont aussi minimalistes.
 
Si c'est vraiment le manque de notions qui est en cause, pensez à faire quelques recherches, et utiliser au mieux les documentations que vous avez à votre disposition :
 
 
https://docs.python.org/3/index.html#
https://www.pygame.org/docs/
 
 
Pour mieux comprendre, peut-être que d'autres informations sur votre code pourrait aider :
 
* Comment est structuré le fichier bloc_a_descendre.pbm ?
* De quelle taille est votre fenêtre ainsi que le sprite correspondant à un bloc ?
* Pourrais-tu nous montrer un bref aperçu de cette liste de listes ?
 
Ensuite, un léger détail de concision que j'ai remarqué dans votre code ( mais qui ne doit pas être le seul, je sais ) :
 

Code :
  1. image.write(str(255)+" "+str(255)+" "+str(255)+" " )


 
Pourquoi ne pas plutôt écrire cela comme ceci :
 

Code :
  1. image.write("255 255 255 " )


 
?
Je ne connais pas trop la méthode write(), donc peut-être est-ce correct mais ça me semble bizarre d'utiliser str() pour convertir un nombre " brut " ( qui n'est pas compris dans une variable )...
 
A part ça, pour l'instant, je ne comprend pas assez bien votre code pour donner une solution, je répond simplement pour donner des pistes et parce que personne d'autre ne le fait, aussi, peut-être que votre problème vient du fait que vous ne mettez pas à jour la fenêtre d'affichage après chaque déplacement / suppression de ligne ( quelque chose qui est réalisé au niveau du programme, mais pas visuellement, me fait tout de suite penser à ce genre d'erreur ), on ne sait jamais...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed