def simple_display(plateau): """ Affichage simple, sans formatage, de la grille du plateau passé en paramètre. Les valeurs sont alignées et affichées en colonne. :param plateau: Un dictionnaire correspondant à un plateau de jeu. """ display = "" n = plateau['n'] for row in range(0, n): for column in range(0, n): display += str(get_value(plateau, row, column)).rjust( 4) # Ajout de la tuile courante avec un espacement # supplémentaire (rjust) pour l'alignement. display += "\n" print(display)
def full_display(plateau): n = plateau['n'] background = colored(' ', "grey", "on_grey") chars_per_line = 9 * n + 2 for row in range(0, n): space_line, number_line = background, background # Initialisation a 'background' (gris). for column in range( 0, n): # Construction des lignes contenant les tuiles. value = get_value(plateau, row, column) if value == 0 or value == 1: space_line += colored(' ' * 7, "blue", "on_blue") number_line += colored( str(value).rjust(4) + ' '.rjust(3), "grey", "on_blue") elif value == 2: space_line += colored(' ' * 7, "red", "on_red") number_line += colored( str(value).rjust(4) + ' '.rjust(3), "grey", "on_red") else: space_line += colored(' ' * 7, "white", "on_white") number_line += colored( str(value).rjust(4) + ' '.rjust(3), "grey", "on_white") space_line += background number_line += background print(colored(' ' * chars_per_line, "grey", "on_grey")) for i in range(0, 3): # Assemblage des lignes créées. print(space_line if i != 1 else number_line) print(colored(' ' * chars_per_line, "grey", "on_grey")) # Ajout de la ligne de background manquante.
def test_get_value(): """ Fonction de test de check_value(). """ p = {'n': 4, 'nb_cases_libres': 6, 'tiles': [6, 2, 3, 2, 0, 2, 6, 2, 0, 2, 2, 0, 1, 0, 0, 0]} assert get_value(p, 0, 0) == 6, 'Erreur : fonction get_value().' assert get_value(p, 2, 3) == 0, 'Erreur : fonction get_value().' assert get_value(p, 1, 3) == 2, 'Erreur : fonction get_value().' assert get_value(p, 3, 0) == 1, 'Erreur : fonction get_value().' try : get_value(p, 18, 3) # lève une erreur except AssertionError: print('get_value(p, 18, 3) a bien levé une erreur.') else: assert True == False, 'get_value(p, 18, 3) aurait du lever une erreur.' print('Fonction get_value() : OK')
def test_column_move(): tiles = [1, 2, 2, 6, 2, 2, 3, 3, 0, 3, 6, 6, 6, 12, 3, 6] plateau = {'n': 4, 'nombre_cases_libres': 5, 'tiles': tiles} # Vérification avec une fusion (1, 2). column_move(plateau, 0, 1) # Mouvement de la colonne 0 vers le haut. assert get_value(plateau, 0, 0) == 3 assert get_value(plateau, 1, 0) == 0 assert get_value(plateau, 2, 0) == 6 assert get_value(plateau, 3, 0) == 0 # Vérification avec une fusion de deux multiples de 3 identiques. column_move(plateau, 3, 0) # Mouvement de la colonne 3 vers le bas. assert get_value(plateau, 0, 3) == 0 assert get_value(plateau, 1, 3) == 6 assert get_value(plateau, 2, 3) == 3 assert get_value(plateau, 3, 3) == 12 # Vérification avec la non fusion de deux nombres différents multiples de 3. column_move(plateau, 1, 0) # Mouvement de la colonne 1 vers le bas. assert get_value(plateau, 0, 1) == 2 assert get_value(plateau, 1, 1) == 2 assert get_value(plateau, 2, 1) == 3 assert get_value(plateau, 3, 1) == 12 # Vérification avec la non fusion de deux nombres identiques non multiples de 3. column_move(plateau, 1, 1) # Mouvement de la colonne 1 vers le bas. assert get_value(plateau, 0, 1) == 2 assert get_value(plateau, 1, 1) == 2 assert get_value(plateau, 2, 1) == 3 assert get_value(plateau, 3, 1) == 12 print("Test de la fonction column_move: Ok")
def full_display(plateau): """ Affichage en couleurs un plateau passé en paramètre. """ line_separator = ' ' * (plateau['n'] + 1) + ' ' * plateau[ 'n'] # Définition d'une chaine de caractères utilisée # pour afficher des lignes de séparations entre les lignes qui représentent les cases message = '\n' # message est une chaine de caractères qui va être modifiée jusqu'à ce qu'elle contienne tout # l'affichage du plateau de jeu for i in range(0, plateau['n'] * 3): # On parcours le tableau ligne par ligne, ici la valeur 3 permet d'afficher des cases de 3 lignes de haut if i % 3 == 0: # A chaque nouvelle ligne parcourue du plateau, on ajoute une ligne de séparation avant message += colored(line_separator, None, 'on_grey') + '\n' for j in range(0, plateau['n']): # On parcours les lignes case par case message += colored(' ', None, 'on_grey') # A chaque nouvelle case parcourue du plateau, on ajoute une case de séparation avant val = get_value( plateau, i // 3, j ) # On cherche la valeur de la case et on la garde en mémoire dans val if val == 0: # Si la valeur de la case est 0, on définie la couleur de la police en bleu # pour que la valeur ne soit pas visible sur la couleur de fond bleue que l'on définie aussi color = 'blue' on_color = 'on_blue' elif val == 1: # Si la valeur de la case est 1, on définie la couleur de la police en blanc et la couleur de fond bleue color = 'white' on_color = 'on_blue' elif val == 2: # Si la valeur de la case est 2, on définie la couleur de la police en blanc et la couleur de fond rouge color = 'white' on_color = 'on_red' else: # Sinon, on définie la couleur de la police en noir (None car c'est la couleur par défaut) # et la couleur de fond blanc color = None on_color = 'on_white' if i % 3 == 1: # Si la ligne est la deuxième ligne de la case, on ajoute la case en affichant la valeur message += colored(str.center(str(val), 5), color, on_color, attrs=['bold']) else: # Sinon, on ajoute la case sans afficher la valeur message += colored(' ', None, on_color) message += colored(' ', None, 'on_grey') + '\n' # A chaque fin de ligne parcourue du plateau, on ajoute une case de séparation après message += colored( line_separator, None, 'on_grey' ) + '\n' # On ajoute une ligne de séparation pour finir l'affichage print(message) # On affiche le message (Le plateau mis en forme) return message # On retourne le message (Le plateau mis en forme) pour les tests unitaires
def test_line_move(): tiles = [1, 2, 1, 0, 0, 2, 3, 3, 0, 2, 2, 2, 6, 12, 0, 0] plateau = {'n': 4, 'nombre_cases_libres': 5, 'tiles': tiles} # Vérification avec une fusion (1, 2). line_move(plateau, 0, 1) # Mouvement de la ligne 0 vers la gauche. assert get_value(plateau, 0, 0) == 3 assert get_value(plateau, 0, 1) == 1 assert get_value(plateau, 0, 2) == 0 assert get_value(plateau, 0, 3) == 0 # Vérification avec une fusion de deux multiples de 3 identiques. line_move(plateau, 1, 0) # Mouvement de la ligne 1 vers la droite. assert get_value(plateau, 1, 0) == 0 assert get_value(plateau, 1, 1) == 0 assert get_value(plateau, 1, 2) == 2 assert get_value(plateau, 1, 3) == 6 # Vérification avec la non fusion de deux nombres différents multiples de 3. line_move(plateau, 3, 1) # Mouvement de la ligne 3 vers la gauche. assert get_value(plateau, 3, 0) == 6 assert get_value(plateau, 3, 1) == 12 assert get_value(plateau, 3, 2) == 0 assert get_value(plateau, 3, 3) == 0 # Vérification avec la non fusion de deux nombres identiques non multiples de 3. line_move(plateau, 2, 0) # Mouvement de la ligne 2 vers la droite. assert get_value(plateau, 2, 0) == 0 assert get_value(plateau, 2, 1) == 2 assert get_value(plateau, 2, 2) == 2 assert get_value(plateau, 2, 3) == 2 print("Test de la fonction line_move: Ok")
def test_column_pack(): tiles = [0, 1, 0, 0, 0, 2, 3, 3, 0, 4, 2, 0, 0, 3, 4, 0] plateau = {'n': 4, 'nombre_cases_libres': 2, 'tiles': tiles} # Vérification du tassement de la colonne 1 vers le haut. column_pack(plateau, 1, 0, 1) assert get_value(plateau, 0, 1) == 2 assert get_value(plateau, 1, 1) == 4 assert get_value(plateau, 2, 1) == 3 assert get_value(plateau, 3, 1) == 0 # Vérification du tassement de la colonne 2 vers le haut. column_pack(plateau, 2, 2, 1) assert get_value(plateau, 0, 2) == 0 assert get_value(plateau, 1, 2) == 3 assert get_value(plateau, 2, 2) == 4 assert get_value(plateau, 3, 2) == 0 # Vérification du tassement de la colonne 2 vers le bas. column_pack(plateau, 2, 2, 0) assert get_value(plateau, 0, 2) == 0 assert get_value(plateau, 1, 2) == 0 assert get_value(plateau, 2, 2) == 3 assert get_value(plateau, 3, 2) == 0 # Vérification du tassement de la colonne 3 vers le bas. column_pack(plateau, 3, 3, 0) assert get_value(plateau, 0, 2) == 0 assert get_value(plateau, 1, 2) == 0 assert get_value(plateau, 2, 2) == 3 assert get_value(plateau, 3, 2) == 0 print("Test de la fonction column_pack: Ok")
def test_line_pack(): tiles = [0, 2, 0, 0, 0, 2, 3, 3, 0, 2, 2, 0, 0, 0, 0, 0] plateau = {'n': 4, 'nombre_cases_libres': 10, 'tiles': tiles} # Vérification du tassement de la ligne 1 vers la gauche. line_pack(plateau, 1, 0, 1) assert get_value(plateau, 1, 0) == 2 assert get_value(plateau, 1, 1) == 3 assert get_value(plateau, 1, 2) == 3 assert get_value(plateau, 1, 3) == 0 # Vérification du tassement de la ligne 1 vers la gauche. line_pack(plateau, 1, 2, 1) assert get_value(plateau, 1, 0) == 2 assert get_value(plateau, 1, 1) == 3 assert get_value(plateau, 1, 2) == 0 assert get_value(plateau, 1, 3) == 0 # Vérification du tassement de la ligne 1 vers la gauche. line_pack(plateau, 1, 2, 1) assert get_value(plateau, 1, 0) == 2 assert get_value(plateau, 1, 1) == 3 assert get_value(plateau, 1, 2) == 0 assert get_value(plateau, 1, 3) == 0 # Vérification du tassement de la ligne 1 vers la droite. line_pack(plateau, 1, 3, 0) # Vers la droite assert get_value(plateau, 1, 0) == 0 assert get_value(plateau, 1, 1) == 2 assert get_value(plateau, 1, 2) == 3 assert get_value(plateau, 1, 3) == 0 # Vérification du tassement de la ligne 2 vers la droite. line_pack(plateau, 2, 2, 0) assert get_value(plateau, 2, 0) == 0 assert get_value(plateau, 2, 1) == 0 assert get_value(plateau, 2, 2) == 2 assert get_value(plateau, 2, 3) == 0 print("Test de la fonction line_pack: Ok")
def column_move(plateau, col, sens): """ Déplacement des tuiles d'une colonne donnée dans un sens donné en appliquant les règles du jeu Threes. plateau : dictionnaire contenant le plateau d'un jeu col : indice de la colonne pour laquelle il faut déplacer les tuiles sens : sens du déplacement des tuiles, 1 vers le haut, 0 vers le bas """ if sens == 0: continuer = True n = plateau['n'] - 1 while continuer and n > 0: if get_value(plateau, n, col) == 0: column_pack(plateau, col, n, sens) continuer = False elif (get_value(plateau, n, col) in [1, 2] and get_value(plateau, n - 1, col) + get_value(plateau, n, col) == 3) or (get_value(plateau, n, col) == get_value( plateau, n - 1, col) and get_value(plateau, n, col) % 3 == 0): set_value( plateau, n, col, get_value(plateau, n, col) + get_value(plateau, n - 1, col)) column_pack(plateau, col, n - 1, sens) continuer = False n -= 1 elif sens == 1: continuer = True n = 0 while continuer and n < plateau['n'] - 1: if get_value(plateau, n, col) == 0: column_pack(plateau, col, n, sens) continuer = False elif (get_value(plateau, n, col) in [1, 2] and get_value(plateau, n + 1, col) + get_value(plateau, n, col) == 3) or (get_value(plateau, n, col) == get_value( plateau, n + 1, col) and get_value(plateau, n, col) % 3 == 0): set_value( plateau, n, col, get_value(plateau, n, col) + get_value(plateau, n + 1, col)) column_pack(plateau, col, n + 1, sens) continuer = False n += 1
def line_move(plateau, lig, sens): """ Déplacement des tuiles d'une ligne donnée dans un sens donné en appliquant les règles du jeu Threes. plateau : dictionnaire contenant le plateau d'un jeu lig : indice de la ligne pour laquelle il faut déplacer les tuiles sens : sens du déplacement des tuiles, 1 vers la gauche, 0 vers la droite :Exemple: p = { 'n': 4, 'nb_cases_libres': 10, 'tiles': [0, 2, 0, 0, 0, 2, 3, 3, 0, 2, 2, 0, 0, 0, 0, 0] } line_move(p, 1, 1) print(p['tiles']) # affiche [0, 2, 0, 0, 2, 3, 3, 0, 0, 2, 2, 0, 0, 0, 0, 0] line_move(p, 1, 1) print(p['tiles']) # affiche [0, 2, 0, 0, 2, 6, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0] Les 3 se tassent pour donner un 6 dans le sens du tassement line_move(p, 2, 0) print(p['tiles']) # affiche [0, 2, 0, 0, 2, 6, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0] line_move(p, 2, 0) print(p['tiles']) # affiche [0, 2, 0, 0, 2, 6, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0] Aucun changement car les 2 ne peuvent se tasser qu'avec les 1 """ if sens == 0: continuer = True n = plateau['n'] - 1 while continuer and n > 0: if get_value(plateau, lig, n) == 0: line_pack(plateau, lig, n, sens) continuer = False elif (get_value(plateau, lig, n) in [1, 2] and get_value(plateau, lig, n - 1) + get_value(plateau, lig, n) == 3) or (get_value(plateau, lig, n) == get_value( plateau, lig, n - 1) and get_value(plateau, lig, n) % 3 == 0): set_value( plateau, lig, n, get_value(plateau, lig, n) + get_value(plateau, lig, n - 1)) line_pack(plateau, lig, n - 1, sens) continuer = False n -= 1 elif sens == 1: continuer = True n = 0 while continuer and n < plateau['n'] - 1: if get_value(plateau, lig, n) == 0: line_pack(plateau, lig, n, sens) continuer = False elif (get_value(plateau, lig, n) in [1, 2] and get_value(plateau, lig, n + 1) + get_value(plateau, lig, n) == 3) or (get_value(plateau, lig, n) == get_value( plateau, lig, n + 1) and get_value(plateau, lig, n) % 3 == 0): set_value( plateau, lig, n, get_value(plateau, lig, n) + get_value(plateau, lig, n + 1)) line_pack(plateau, lig, n + 1, sens) continuer = False n += 1