Problème jeu Same game python

Résolu/Fermé
MarieA_ Messages postés 3 Date d'inscription mardi 24 décembre 2019 Statut Membre Dernière intervention 26 décembre 2019 - Modifié le 24 déc. 2019 à 00:09
 trifou - 26 déc. 2019 à 20:28
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
A voir également:

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.
1
MarieA_ Messages postés 3 Date d'inscription mardi 24 décembre 2019 Statut Membre Dernière intervention 26 décembre 2019
26 déc. 2019 à 01:08
D'accord, je vais essayer ça. Ça m'a l'air bien ! Merci beaucoup !
0
trifou > MarieA_ Messages postés 3 Date d'inscription mardi 24 décembre 2019 Statut Membre Dernière intervention 26 décembre 2019
26 déc. 2019 à 20:28
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 ;)
0
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.
0
MarieA_ Messages postés 3 Date d'inscription mardi 24 décembre 2019 Statut Membre Dernière intervention 26 décembre 2019
24 déc. 2019 à 16:31
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 :/
0