Aller au contenu

Evaluation des positions

On va maintenant créer l'IA. Pour cela, la première étape est de rajouter une évaluation heuristique de chaque position. Càd d'évaluer en gros à quelle point une position est bonne ou non pour un des joueurs (par exemple si on a perdu c'est pas bien mais si on a gagné c'est bien).

Il y a plein de façons de définir une telle heuristique, mais je vous propose la suivante :

Pour chaque fenêtre de 4 cases continues (horizontale, verticale ou diagonale), on rajoute

  • +1000 points si on a 4 pions à nous (en gros on a win)
  • +10 points si on a 3 pions à nous et pas de pion de l'adversaire (possible puissance 4 où il manque une case non déjà bloquée)
  • +3 points si on a 2 pions à nous et pas de pion de l'adversaire (là c'est vraiment un on sait jamais)

On fait ensuite le même calcul en enlevant cette fois ci des points équivalents, avec les pièces de l'adversaire.


Cette heursitique est à la fois simple et fonctionnelle, mais vous pouvez bien évidemment la modifier un peu voire construire la votre de toute pièce. Faites juste bien en sorte qu'une position gagnante soit toujours strictement meilleure que n'importe quelle position non gagnante (et vice-versa pour les positions perdantes).

Exemple d'utilisation

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
  --------------
La position actuelle pour le joueur O a un score de 0.
Au tour du joueur X
Choisissez une colonne (0-6) : 3

  0 1 2 3 4 5 6
 | | | | | | | | 
 | | | | | | | | 
 | | | | | | | | 
 | | | | | | | | 
 | | | | | | | | 
 | | | |X| | | | 
  --------------
La position actuelle pour le joueur X a un score de 0.
Au tour du joueur O
Choisissez une colonne (0-6) : 3 

  0 1 2 3 4 5 6
 | | | | | | | | 
 | | | | | | | | 
 | | | | | | | | 
 | | | | | | | | 
 | | | |O| | | | 
 | | | |X| | | | 
  --------------
La position actuelle pour le joueur O a un score de 0.
Au tour du joueur X
Choisissez une colonne (0-6) : 3

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
 | | | |X| | | |
 | | | |O| | | |
 | | | |X| | | |
  --------------
La position actuelle pour le joueur X a un score de 0.
Au tour du joueur O
Choisissez une colonne (0-6) : 1

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | | | | | |
 | | | |X| | | |
 | | | |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur O a un score de 0.
Au tour du joueur X
Choisissez une colonne (0-6) : 3

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | |X| | | |
 | | | |X| | | |
 | | | |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur X a un score de 3.
Au tour du joueur O
Choisissez une colonne (0-6) : 1

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | |X| | | |
 | | | |X| | | |
 | |O| |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur O a un score de 6.
Au tour du joueur X
Choisissez une colonne (0-6) : 1

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | | | |X| | | |
 | |X| |X| | | |
 | |O| |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur X a un score de 6.
Au tour du joueur O
Choisissez une colonne (0-6) : 1

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | | | | | |
 | |O| |X| | | |
 | |X| |X| | | |
 | |O| |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur O a un score de 0.
Au tour du joueur X
Choisissez une colonne (0-6) : 3

  0 1 2 3 4 5 6
 | | | | | | | |
 | | | |X| | | |
 | |O| |X| | | |
 | |X| |X| | | |
 | |O| |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur X a un score de 13.
Au tour du joueur O
Choisissez une colonne (0-6) : 3

  0 1 2 3 4 5 6
 | | | |O| | | |
 | | | |X| | | |
 | |O| |X| | | |
 | |X| |X| | | |
 | |O| |O| | | |
 | |O| |X| | | |
  --------------
La position actuelle pour le joueur O a un score de 0.

Indice

Indice

Encore une fois, essayez de bien structurer votre code au maximum à l'aide de fonctions auxiliaires. Je recommande par exemple de définir une fonction score_position(board,piece) qui ne fait que compter les points positifs. La vraie fonction score_position_both(board,piece) pourra ainsi juste renvoyer la différence des 2.