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.
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.
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'])
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'])
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.
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 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')
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