Problème jeu Same game python [Résolu]

Signaler
Messages postés
3
Date d'inscription
mardi 24 décembre 2019
Statut
Membre
Dernière intervention
26 décembre 2019
-
 trifou -
Bonjour,
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 alors qu'il devrait continuer. Merci d'avance pour vos réponses.



Et là, le programme ne continue pas alors qu'il devrait déplacer la dernière colonne :


Configuration: Macintosh / Safari 13.0.4

2 réponses

Bonsoir,

Ton code en l'état n'est pas testable, car tu n'as pas utilisé les balises codes, le module ezCLI doit certainement être un module fourni par ton école, et il serait fastidieux de devoir saisir des valeurs pour tester à chaque changement de code.

Faire de simples tests, c'est aller au plus simple sans fioritures.
On part avec un simple tableau.

board = [
    [1, 0, 0, 2, 0],
    [1, 0, 1, 4, 0],
    [4, 0, 4, 1, 0],
    [2, 0, 0, 0, 0],
    [2, 0, 0, 4, 0],
    [1, 0, 0, 2, 0],
]

BOARD_W = len(board[0])
BOARD_H = len(board)


Puis on écrit en procédant logiquement les deux fonctions pour réunir les valeurs des lignes et colonnes.

def agglomerate_lines():
    for i in range(BOARD_W):
        # Construction des valeurs des colonnes excluant les 0
        values = [board[j][i] for j in range(BOARD_H) if board[j][i]]
        # Contruction de la colonne en ajoutant en 1er les 0
        # afin de compléter la colonne
        column = [0] * (BOARD_H - len(values))
        # Ajout des valeurs
        column.extend(values)
        # Mise à jour des colonnes
        for j in range(BOARD_H):
            board[j][i] = column[j]


def agglomerate_columns():
    # index de la dernière ligne du tableau où les valeurs sont à 0
    zeros_index = []
    for i in range(BOARD_W):
        if board[-1][i] == 0:
            zeros_index.append(i)
    # Suppression des dernières valeurs
    # Car inutile de déplacer les colonnes à 0 de fin
    for i in range(BOARD_W - 1, -1, -1):
        if i not in zeros_index:
            break
        zeros_index.pop()
    # Reconstruction des lignes
    for line in board:
        for i in zeros_index:
            line.append(line.pop(i))


Il ne reste plus qu'à tester.
print('>> Tableau de départ')
print(*board, sep='\n')
print('>> Tableau après agglomération des lignes')
agglomerate_lines()
print(*board, sep='\n')
print('>> Tableau après agglomération des colonnes')
agglomerate_columns()
print(*board, sep='\n')


En procédant de cette façon, on peut tester rapidement en changeant simplement les valeurs du tableau pour s'assurer que l'on obtient le résultat attendu, on peut même éventuellement créer une liste de plusieurs tableaux.
Messages postés
3
Date d'inscription
mardi 24 décembre 2019
Statut
Membre
Dernière intervention
26 décembre 2019

D'accord, je vais essayer ça. Ça m'a l'air bien ! Merci beaucoup !
>
Messages postés
3
Date d'inscription
mardi 24 décembre 2019
Statut
Membre
Dernière intervention
26 décembre 2019

Bonsoir,

J'espère que tu as testé, en le faisant tu constateras que ça ne donne pas le bon résultat avec l'agglomération des colonnes.
Bien regarder ce qu'il se passe avec la dernière boucle de la fonction agglomerate_columns ;)
Bonjour,

Pourquoi il y a un break dans gravitelignes ?

Et si tu veux de l'aide, poste du code (pas d'images) avec un jeu de test permettant de reproduire le problème.
Messages postés
3
Date d'inscription
mardi 24 décembre 2019
Statut
Membre
Dernière intervention
26 décembre 2019

Bonjour, merci pour la réponse ! A vrai dire, je ne sais plus exactement, c'est mon prof qui m'avait dit de le mettre car sinon le programme tournait même quand il avait trouve un 0.
D'accord le code est :

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))

#une fonction gravite gaut-bas et une fonction gravité pour les colonnes

if __name__ == "__main__":
n=Noyau(6,6,3)

Un test :
─┬─┬─┬─┬─┬─┐
│1│2│2│2│2│3│
├─┼─┼─┼─┼─┼─┤
│2│3│1│2│1│1│
├─┼─┼─┼─┼─┼─┤
│1│1│1│2│1│3│
├─┼─┼─┼─┼─┼─┤
│3│3│1│2│3│1│
├─┼─┼─┼─┼─┼─┤
│2│2│1│1│2│2│
├─┼─┼─┼─┼─┼─┤
│1│3│3│1│2│2│
└─┴─┴─┴─┴─┴─┘
x = 2
y= 2

─┬─┬─┬─┬─┬─┐
│0│0│0│0│2│3│
├─┼─┼─┼─┼─┼─┤
│1│2│0│0│1│1│
├─┼─┼─┼─┼─┼─┤
│2│3│0│2│1│3│
├─┼─┼─┼─┼─┼─┤
│3│3│0│2│3│1│
├─┼─┼─┼─┼─┼─┤
│2│2│2│2│2│2│
├─┼─┼─┼─┼─┼─┤
│1│3│3│2│2│2│
└─┴─┴─┴─┴─┴─┘
x = 4
y= 2

┌─┬─┬─┬─┬─┬─┐
│0│0│0│0│0│0│
├─┼─┼─┼─┼─┼─┤
│0│0│0│0│0│0│
├─┼─┼─┼─┼─┼─┤
│1│2│0│0│2│3│
├─┼─┼─┼─┼─┼─┤
│2│3│0│0│1│1│
├─┼─┼─┼─┼─┼─┤
│3│3│0│0│1│3│
├─┼─┼─┼─┼─┼─┤
│1│3│3│0│3│1│
└─┴─┴─┴─┴─┴─┘

Et là il s'arrete, il ne supprime pas la colonne de 0 :/