Пример #1
0
def line_pack(plateau, num_li, debut, sens):
    """
    Tasse les tuiles d'une ligne dans un sens donné.

    :param plateau: Un dictionnaire correspondant à un plateau de jeu.
    :param num_li: Un entier correspondant à l'indice de la ligne à tasser.
    :param debut: Un entier correspondant à l'indice à partir duquel se fait le tassement.
    :param sens: Un entier correspondant au sens du tassement: 1 vers la gauche, 0 vers la droite.
    """
    tiles = plateau['tiles']

    lig = num_li * plateau['n']  # Récupération de l'indice de la ligne dans la grille.
    i = debut  # Indice à partir duquel s'effectue le tassement dans la ligne.

    if sens == 1:
        # On part de 'debut' dans la ligne et on décale tous les autres éléments vers la gauche.
        while i < plateau['n'] - 1:
            tiles[lig + i] = tiles[lig + i + 1]  # L'élément courant prend la valeur de l'élément suivant (i + 1).
            i += 1

        set_value(plateau, num_li, 3, 0)  # Comme on décale vers la gauche, la dernière case de la ligne devient vide.

    elif sens == 0:
        # On part de 'debut' dans la ligne et on décale tous les autres éléments vers la droite.
        while i > 0:
            tiles[lig + i] = tiles[lig + i - 1]  # L'élément courant prend la valeur de l'élément précédent (i - 1).
            i -= 1

        set_value(plateau, num_li, 0, 0)  # Comment on décale vers la droite, la première case de la ligne devient vide.
Пример #2
0
def column_pack(plateau, num_col, debut, sens):
    """
    Tasse les tuiles d'une ligne dans un sens donné.

    :param plateau: Un dictionnaire correspondant à un plateau de jeu.
    :param num_col: Un entier correspondant à l'indice de la colonne à tasser.
    :param debut: Un entier correspondant à l'indice à partir duquel se fait le tassement.
    :param sens: Un entier correspondant au sens du tassement: 1 vers le haut, 0 vers le bas.
    """
    n = plateau['n']
    tiles = plateau['tiles']

    i = debut

    if sens == 1:
        # On part l'indice de la case de 'tassement' et on écrase la valeur courante par la suivante.
        # La valeur suivante correspond à la valeur de la colonne 'num_col' à la ligne suivante (i + n).
        # Le décalage se fait du bas vers le haut.
        while i < n - 1:
            tiles[i*n + num_col] = tiles[n*(i + 1) + num_col]
            i += 1  # Passage à la valeur de la colonne 'num_col' de la ligne suivante.

        set_value(plateau, 3, num_col, 0)  # Comme on décale vers le haut, la dernière case de la colonne devient vide.

    elif sens == 0:
        # On part de l'indice de la case de 'tassement' et on écrase la valeur courante par la précédente.
        # La valeur précédente correspond à la valeur de la colonne 'num_col' de la ligne précédente (i - n).
        # Le décalage se fait du haut vers le bas.
        while i > 0:
            tiles[i*n + num_col] = tiles[n*(i - 1) + num_col]
            i -= 1

        set_value(plateau, 0, num_col, 0)  # Comme on décale vers le bas, la première case de la colonne devient vide.
Пример #3
0
def put_next_tiles(plateau, tiles):
    """
    Permet de placer une ou deux tuiles dans un plateau de jeu.

    :param plateau: Un dictionnaire correspondant à un plateau de jeu.
    :param tiles: Un dictionnaire sous la forme de celui renvoyé par la fonction get_next_alea_tiles
    """
    # Quelque soit le mode spécifié, on a toujours au moins une tuile.
    # On peut donc l'ajouter dans tous les cas.
    set_value(plateau, tiles['0']['lig'], tiles['0']['col'], tiles['0']['val'])

    if tiles['mode'] == "init":  # Dans le cas du mode 'init', on doit ajouter une deuxième tuile.
        set_value(plateau, tiles['1']['lig'], tiles['1']['col'], tiles['1']['val'])
Пример #4
0
def put_next_tiles(plateau, tiles):
    """
    Permet de placer une ou deux tuiles dans le plateau
    :param plateau: Plateau de jeu
    :param tiles: dictionnaire sous la forme de celui renvoyé par la fonction get_next_alea_tiles
    :return: rien
    """
    # Place la première tuile
    set_value(plateau, tiles[0]['lig'], tiles[0]['col'], tiles[0]['val'])

    # Si il y a une deuxième tuile
    if 1 in tiles:
        # La place
        set_value(plateau, tiles[1]['lig'], tiles[1]['col'], tiles[1]['val'])
Пример #5
0
def put_next_tiles(plateau, tiles):
    """
    Permet de placer une ou deux tuiles dans le plateau.
    plateau : dictionnaire contenant le plateau d'un jeu
    tiles : dictionnaire sous la forme de celui renvoyé par la fonction get_next_alea_tiles().
    """
    while tiles['mode'] == 'encours' and not is_room_empty(
            plateau, tiles['0']['lig'], tiles['0']['col']):
        tile_0 = randint(0, plateau['n']**2 - 1)
        tiles['0']['lig'] = tile_0 // plateau['n']
        tiles['0']['col'] = tile_0 % plateau['n']
    set_value(plateau, tiles['0']['lig'], tiles['0']['col'], tiles['0']['val'])
    if tiles['mode'] == 'init':
        set_value(plateau, tiles['1']['lig'], tiles['1']['col'],
                  tiles['1']['val'])
    get_nb_empty_rooms(
        plateau)  # Ne pas oublier d'actualiser nb_cases_libres dans plateau.
Пример #6
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
Пример #7
0
def test_set_value():
    """
    Fonction de test de set_value().
    """
    p = init_play()
    set_value(p, 0, 0, 1)  # met la valeur 1 dans la case (0, 0)
    set_value(p, 1, 2, 0)  # met la valeur 0 dans la case (1, 2)
    set_value(p, 2, 3, 6)  # met la valeur 6 dans la case (2, 3)
    assert p == {'n' : 4, 'nb_cases_libres' : 14, 'tiles' : [1,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0]}, 'Erreur fonction set_value'
    try:
        set_value(p, 18, 3, 1) # génère une erreur
    except AssertionError:
        print('set_value(p, 18, 3, 1) a bien levé une erreur.')
    else:
        assert True == False, 'set_value(p, 18, 3, 1) aurait du lever une erreur.'
    print('Fonction set_value() : OK')
Пример #8
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