Académique Documents
Professionnel Documents
Culture Documents
TP : Domineering
1 TP : Jeu du domineering
Le domineering est un jeu de plateau où le joueur 0 place un domino vertical et le joueur 1 un domino
horizontal. Un joueur qui ne peut plus jouer perd.
Voici un exemple de partie (de gauche à droite) où le joueur 1 gagne :
Une conguration est représentée par une matrice (-1 = vide, 0 = joueur 0, 1 = joueur 1)
Question 1 Écrire une fonction grille_vide(n, p) qui renvoie une grille de taille n × p vide (remplie de
−1).
[2]: grille_vide(3, 4)
[2]: [[-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1]]
Question 2 Écrire une fonction coups_possibles(v, joueur) qui prend en entrée une conguration v et
qui renvoie la liste des positions (i, j) où le joueur joueur peut placer son domino.
[19]: print(coups_possibles(grille_vide(3, 4), 0))
print(coups_possibles(grille_vide(3, 4), 1))
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Question 3 Écrire une fonction strategie_aleatoire(v, joueur) qui prend en entrée une conguration
v et qui renvoie un coup choisi au hasard parmi les coups possibles.
On pourra utiliser la fonction random.choice(L) qui renvoie un élément au hasard dans L (en n'oubliant
pas import random).
[6]: strategie_aleatoire(grille_vide(3, 4), 0) # coup aléatoire
[6]: (0, 3)
Question 4 Écrire une fonction placer(v, i, j, joueur) qui prend en entrée une conguration v, une
position (i, j) et un joueur joueur et qui modie v en plaçant le domino du joueur joueur à la position
(i, j).
Question 5 Écrire une fonction retirer(v, i, j, joueur) qui prend en entrée une conguration v, une
position (i, j) et un joueur joueur et qui modie v en retirant le domino du joueur joueur à la position
(i, j).
Question 6 Écrire une fonction jeu(strategie1, strategie2, n, p) qui prend en entrée deux stratégies
et qui renvoie le joueur qui gagne.
[10]: 0
Question 8 Écrire une fonction h1(v) renvoyant la diérence entre le nombre de cases libres pour le joueur
0 et le nombre de cases libres pour le joueur 1. On renverra ∞ (float('inf')) si le joueur 0 a gagné et
−∞ (float('-inf')) si le joueur 1 a gagné.
[14]: 1
L'algorithme min-max considère, depuis la position en cours, toutes les positions atteignables après p
coups et conserver celle ayant la meilleure heuristique.
Puis on donne récursivement une valeur à chaque sommet v de l'arbre :
- si v est à profondeur 0, on renvoie l'heuristique de v - sinon, si le joueur 0 doit jouer, on renvoie la valeur
maximum des successeurs de v (le joueur 0 veut maximiser sa valeur) - sinon, si le joueur 1 doit jouer, on
renvoie la valeur minimum des successeurs de v (le joueur 1 veut minimiser la valeur de son adversaire)
On choisit le coup qui donne la meilleure valeur parmi les coups possibles.
Question 9 Écrire une fonction minmax(v, joueur, profondeur, h) qui prend en entrée une congura-
tion v, un joueur joueur, une profondeur profondeur et une fonction heuristique h et qui renvoie un couple
(valeur, coup) où coup est le meilleur coup à jouer et valeur est sa valeur.
Question 10 En déduire une fonction strategie_minmax(v, joueur) qui prend en entrée une cong-
uration v et un joueur joueur et qui renvoie le meilleur coup à jouer selon l'algorithme min-max avec
l'heuristique h1 et, par exemple, une profondeur de 2.
Tester avec la fonction ci-dessous pour vérier que la stratégie min-max est meilleure que la stratégie
aléatoire.
[18]: statistiques(strategie_minmax, strategie_aleatoire, 5, 5, 10)
[18]: [10, 0]