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
trifou - 26 déc. 2019 à 20:28
A voir également:
- Problème jeu Same game python
- 94 jeu - Télécharger - Puzzle & Réflexion
- Zuma game - Télécharger - Jeux vidéo
- Citizen code python avis - Accueil - Outils
- Jeu 94 degrés - Télécharger - Divers Jeux
- Game twists - Télécharger - Divers Jeux
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.
Puis on écrit en procédant logiquement les deux fonctions pour réunir les valeurs des lignes et colonnes.
Il ne reste plus qu'à tester.
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.
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.
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.
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.
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
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 :/
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 :/
26 déc. 2019 à 01:08
26 déc. 2019 à 20:28
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 ;)