Example #1
0
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)
Example #2
0
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.
Example #3
0
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')
Example #4
0
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")
Example #5
0
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
Example #6
0
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")
Example #7
0
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")
Example #8
0
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")
Example #9
0
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
Example #10
0
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