Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Simuler une partie complete
Pour finir, on va écrire une fonction qui simule une partie complete a partir d'une liste de coups. Ca ressemble a ce que ferait la classe Game du livre, mais en version simplifiee et testable.
Chaque coup est un tuple (symbole, ligne, colonne). Les joueurs alternent : X joue en premier, puis O, etc. La fonction doit jouer tous les coups dans l'ordre et renvoyer le résultat de la partie.
La fonction doit s'arreter des qu'un gagnant est detecte ou que la grille est pleine. Elle renvoie un dictionnaire avec : - 'gagnant' : 'X', 'O' ou None - 'coups_joues' : le nombre de coups effectivement joues - 'grille' : l'état final de la grille
Écris une fonction jouer_partie(coups) qui prend une liste de tuples et simule la partie.
Exemple : coups = [('X',0,0), ('O',1,1), ('X',0,1), ('O',1,0), ('X',0,2)] r = jouer_partie(coups) r['gagnant'] renvoie 'X' r['coups_joues'] renvoie 5
Tests (4/5)
X gagne en ligne
coups = [('X',0,0),('O',1,0),('X',0,1),('O',1,1),('X',0,2)]
r = jouer_partie(coups)
assert r['gagnant'] == 'X'
5 coups joues
coups = [('X',0,0),('O',1,0),('X',0,1),('O',1,1),('X',0,2)]
r = jouer_partie(coups)
assert r['coups_joues'] == 5
Match nul
coups = [('X',0,0),('O',0,1),('X',0,2),('O',1,0),('X',1,1),('O',2,0),('X',1,2),('O',2,2),('X',2,1)]
r = jouer_partie(coups)
assert r['gagnant'] is None
O gagne en diagonale
coups = [('X',0,0),('O',0,2),('X',1,0),('O',1,1),('X',2,1),('O',2,0)]
r = jouer_partie(coups)
assert r['gagnant'] == 'O'
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def jouer_partie(coups):
grille = [[' ', ' ', ' '] for _ in range(3)]
coups_joues = 0
def check_winner():
for ligne in grille:
if ligne[0] == ligne[1] == ligne[2] and ligne[0] != ' ':
return ligne[0]
for c in range(3):
if grille[0][c] == grille[1][c] == grille[2][c] and grille[0][c] != ' ':
return grille[0][c]
if grille[0][0] == grille[1][1] == grille[2][2] and grille[0][0] != ' ':
return grille[0][0]
if grille[0][2] == grille[1][1] == grille[2][0] and grille[0][2] != ' ':
return grille[0][2]
return None
def is_full():
return all(case != ' ' for ligne in grille for case in ligne)
for symbole, ligne, colonne in coups:
if grille[ligne][colonne] == ' ':
grille[ligne][colonne] = symbole
coups_joues += 1
gagnant = check_winner()
if gagnant is not None:
return {'gagnant': gagnant, 'coups_joues': coups_joues, 'grille': grille}
if is_full():
return {'gagnant': None, 'coups_joues': coups_joues, 'grille': grille}
return {'gagnant': None, 'coups_joues': coups_joues, 'grille': grille}