Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Implémenter le jeu "same game"


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Implémenter le jeu "same game"
    Bonjour,
    Pour un projet, je dois implémenter le jeu Same game. J'ai commence par réaliser le noyau du jeu, sans interface graphique comme demandé par mon professeur. Tout marche sauf la fin de mon algorithme qui est censé repérer les colonnes vides et les remplacer par la colonne juste avant. Comme vous pouvez le voir, la fonction parcourt bien ma grille, fait bien ce qu'elle est censé faire une première fois mais ne continue pas alors qu'elle a reperé une autre colonne vide. J'ai tout essayé, mais je ne vois pas le problème. J'ai joint mon code, la capture du début où on voit la grille avec là colonne à 0, et la capture de fin quand le programme s'arrête. Merci d'avance pour vos réponses.

  2. #2
    Membre habitué
    Poste le code entier entre les balises (icône "#" du bandeau supérieur de la fenêtre de réponse) car le soucis doit être dans la connexion de tes fonctions
    Savoir pour comprendre et vice versa.

  3. #3
    Candidat au Club
    Bonjour, merci pour la réponse.
    D'accord, voici le code :

    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    from ezCLI import *
    from random import randrange
    # ------------------------------------------------------------------------------
    class Noyau(object):
        # ----------------------------------------------------------------------------
        def __init__(self, height, width, nb_colors):      
            self.height = height
            self.width = width
            self.nb_colors = nb_colors
            self.mat = [[0 for j in range (self.width)] for i in range (self.height)]
            for i in range (self.height):
               for j in range (self.width) :
                   self.mat[i][j] =  randrange(1,nb_colors+1)
            print (grid(self.mat))
            while self.mat[self.height-1][self.width-1] != 0 :
                x = input("x = ")
                y = input("y= ")
                x= int(x)
                y=int(y)
                c= self.mat[x][y]
                self.voisin(x,y,c,True)
                print(grid(self.mat))
                self.gravitelignes()
                self.gravitecolonnes()
                print (grid(self.mat))
     
        def voisin(self,x,y,c, first):
            self.x = x
            self.y = y
            self.c = c  
            if self.mat[x][y] == c and c != 0 :
                    if not first: self.mat[x][y] = 0
                    if x >0 : self.voisin (x-1,y,c,False)
                    if x < (self.height - 1 ) : self.voisin (x+1,y,c, False)
                    if y > 0 : self.voisin (x,y-1,c,False)
                    if y < (self.width - 1)  : self.voisin (x,y+1,c,False)
            #print(grid(self.mat))
     
     
        def gravitelignes (self) : 
            for j in range (self.width) :
                for i in range (self.height-1,-1,-1) :
                    if self.mat[i][j] == 0 :
                        for k in range(i-1, -1, -1):
                            if self.mat[k][j] == 0: continue
                            self.mat[i][j] = self.mat[k][j]
                            self.mat[k][j] = 0
                            #print (i, j, k, grid(self.mat))
                            break
     
        def gravitecolonnes (self):
            for j in range (self.width) :
                if self.mat[self.height-1][j] == 0 :
                    print (j) 
                    for k in range(j+1,self.width-2) :
                        if self.mat[self.height-1][k] == 0 :continue
                        else :
                            for i in range (self.height) :
                                self.mat[i][j] = self.mat[i][k]
                                self.mat[i][k] = 0
                                print (i, j, k, grid(self.mat))
     
     
     
     
    if __name__ == "__main__":
     n=Noyau(6,6,3)

  4. #4
    Membre habitué
    Sans rien y comprendre je dirais qu'il faut que tu incrémente x (si tu lis en colonnes) quelque part entre deux fonctions.
    Les experts t'en diront plus et mieux, patience, ils doivent êtres occupés aux festivités.
    Savoir pour comprendre et vice versa.

  5. #5
    Rédacteur/Modérateur

    Il aurait fallu que tu expliques le principe du jeu, je l'ai recherché, et le voici.

    On a une grille, remplie avec des symboles différents. Par exemple 4 symboles différents, pour une grille 12*12
    Quand on 'clique' sur une case, le programme teste si parmi les voisins de cette case, on a au moins 2 cases avec le même symbole (2 en tout, en incluant la case cliquée). Si ce n'est pas le cas, le mouvement est invalide.
    Si c'est le cas, on supprime du jeu tous les jetons en question.
    Puis les jetons qui étaient en dessus tombent, en restant sur la même colonne. Et si on se retrouve avec une colonne vide, on décale les colonnes de droite, pour ne plus avoir de colonne vide.

    Dans ce genre de programme, quand on doit supprimer un élément au milieu d'un tableau (ici supprimer une colonne), il y a une erreur très courante.

    L'erreur classique c'est : On a une boucle pour i = 1 a n , si colonne i est vide, alors décaler les colonnes suivantes.
    La bonne pratique, c'est de faire une boucle : pour i = n à 1 pas -1, si colonne i est vide, alors décaler les colonnes suivantes.
    Dans ton cas, si j'ai bien suivi, c'est dans la ligne 52 qu'il faudrait inverser l'ordre de parcours.

    C'est une configuration très courante, et pas uniquement dans les jeux.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Candidat au Club
    D'accord, merci beaucoup. Je saurais pour la prochaine fois. Effectivement, cela a fonctionne. Merci beaucoup !