Retour aux défis
Moyen 0 résolus 0 % de réussite

Morpion avec minimax

Choisissez le coup parfait au morpion en explorant tout l'arbre de jeu avec minimax.

Ce que vous allez apprendre

  • Explorer tous les coups futurs possibles
  • Évaluer les positions du point de vue du joueur au trait
  • Choisir le coup optimal par récursion

Problème

Minimax est la façon dont les programmes de jeu choisissent leurs coups : supposez que les deux joueurs jouent parfaitement, notez chaque partie terminée et remontez les scores dans l'arbre de jeu. Le joueur au trait choisit l'enfant au meilleur score pour lui.

Le plateau est une chaîne de 9 caractères lue ligne par ligne (indices 0-8), avec "X", "O" ou "." pour une case vide. X joue toujours en premier : c'est donc à X de jouer quand les deux ont le même nombre de marques, et à O sinon.

Notez une partie terminée du point de vue du joueur au trait : +1 pour une victoire, 0 pour un match nul, -1 pour une défaite. Renvoyez la case vide dont le coup a le meilleur score minimax ; si plusieurs sont aussi bonnes, renvoyez le plus petit indice.

Implémentez best_move(board).

Entrée

board : Une position valide où personne n'a encore gagné et où au moins une case est vide.

Sortie

Renvoyez l'indice (0-8) du meilleur coup.

Contraintes

board contient exactement 9 caractères, chacun X, O ou .

La position peut apparaître dans une vraie partie, personne n'a gagné et au moins une case est vide

Exemples

Exemple 1
Entrée :
board = "XX.OO...."

Sortie attendue :
expected = 2
Entrée :
std::string board = "XX.OO....";

Sortie attendue :
long long expected = 2;
Entrée :
string board = "XX.OO....";

Sortie attendue :
long expected = 2;

Explication

X et O ont deux marques chacun, donc X joue. Jouer en 2 complète la ligne du haut et gagne immédiatement (+1).

Exemple 2
Entrée :
board = "X..OO...X"

Sortie attendue :
expected = 5
Entrée :
std::string board = "X..OO...X";

Sortie attendue :
long long expected = 5;
Entrée :
string board = "X..OO...X";

Sortie attendue :
long expected = 5;

Explication

X joue. O menace de compléter la ligne du milieu en 5. Tout autre coup laisse O gagner (-1), alors que bloquer en 5 mène à un match nul (0) : la réponse est donc 5.

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Détermine à qui c’est le tour à partir des nombres de X et O, puis évalue récursivement chaque coup légal.

Indice 2

Attribue un score aux plateaux terminaux du point de vue du joueur courant, et choisis le coup qui maximise cette valeur.

Indice 3

Si plusieurs coups sont ex æquo, garde l’indice de la première case vide, et vérifie les victoires avant d’envisager d’autres coups.

Complexité attendue

temps O(9!), espace supplémentaire O(9)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.