Reversi project for AI course of Bordeaux University
Find a file
2023-12-20 22:51:02 +01:00
src Adjust dome command line parameters 2023-12-20 22:51:02 +01:00
README.md First implementation of Iterative Deepening MinMax 2023-12-17 17:37:07 +01:00

IA: jeu de Reversi

Le but de ce projet est d'implémenter plusieurs mécanisme de jeu (humain et intelligence artificielle) pour le jeu de Reversi

Installation

Le programme utilise des outils standard de Python installé de base : random, math, argpase et logging. Le project est fourni avec un shell Nix dans le répertoire src

Utilisation

le programme propose un emsemble d'options en ligne de commande afin de définir les options du jeu comme le choix des implementations de jeu (aléatoine, MinMax etc.) ou encore les paramètres (profondeur de recherche). Une aide est intégrée au programme via la commande ./game.py -h. Voici quelques exemple de lancement:

# Lancement de base: les deux joueurs jouent avec le moteur aléatoire et les
options de base:
./game.py

# joueur noir humain et joueur blanc MinMax avec une profondeur de 5
./game.py -be human -we minmax --white-depth-exploration 5

Voici la liste des options :

  • -be | --black-player-engine: moteur utilisé par le joueur avec les pions noirs
  • -we | --white-player-engine: moteur utilisé par le joueur avec les pions blancs
  • -bd | --black-depth-exploration: niveau d'eploration de l'arbre de jeu pour le joueur au pions noirs, valable pour les moteurs minmax et alphabeta
  • -wd | --white-depth-exploration: niveau d'eploration de l'arbre de jeu pour le joueur au pions noirs, valable pour les moteurs minmax et alphabeta
  • -bh | --black-heuristic-engine: moteur heuristique utilisé pour l'exploration de l'arbre de jeu du joueur noir (valable pour les moteur de jeu minmax et alphabeta)
  • -wh | --black-heuristic-engine: moteur heuristique utilisé pour l'exploration de l'arbre de jeu du joueur blanc (valable pour les moteur de jeu minmax et alphabeta)
  • --weight: scores utilisés pour le calcul des heuristiques pour les moteurs weight et full.

L'affichage verbeux est activé avec -V et les informations de débogage sont affichée avec l'option -d.

Choix d'implémentation

J'ai avant tout privilégié la personnalisation des différentes paramètres des différents moteurs composant le jeu.

Classes PlayerEngine

Définies dans le fichier ./src/classes/Engines.py, les classes utilisées héritent de la classe de base PlayerEngines :

class PlayerEngine(Object):
    def __init__(self, logger, options):
    def get_move(self, board):

class MinmaxPlayerEngine(PlayerEngine):
    def get_move(board):

class RandomPlayerEngine(PlayerEngine):
    def get_move(board):

# [...]

Quatre moteur "joueurs" sont implémentés :

  • Human pour gérer des joueurs humain, une saisir utilisateur est demandée sous la forme <pos_x><pos_y>. Il est aussi possible d'afficher le plateau avec la commande print ou les coups possibles avec help;
  • Ramdom va choisir aléatoirement le coup à jouer en fonction des coups; possibles;
  • Minmax utilise MinMax pour déterminer le coup à jouer avec une profondeur maximale définie;
  • AphaBeta utilise AlphaBeta pour déterminer le coup à jouer avec une profondeur maximale définie;
  • IterativeDeepeningMinmax utilise Minmax avec un temps maximum autorisé

Le choix de ces moteur se fait en ligne de commande avec

Classes HeuristicsEngine

Plusieurs classes impémentent plusieurs méthodes pour le calcul de l'heuristique. Comme nous l'avons vu, les moteurs peuvent être choisis en ligne de commande et de façon indépendante pour les joueurs blanc et noir.

Trois implementation sond disponibles:

  1. ScoreHeuristicEngine: l'heuristique se sert du score (comptage des pièces sur le tableau) via la méthode Board.heuristique;
  2. WeightHeuristicEngine: ici on se sert de la place des pièces sur le tableau. Chaque emplacement vaut un nombre de points;
  3. FullHeuristicEngine: c'est la somme de Board.heuristique() et du calcul des poids.

Retour sur le calcul des poids.

Afin de définir le poids, je me suis servi de la page Stratégie et bases de Reversi sur le site Cool Math Games (lien). Voici les poids par ordre d'importance :

  1. Les coins représentent les parties les plus importantes;
  2. Ensuite vient les bords;
  3. Et enfin les coins.

Les poids affectés sont personnalisable via l'options --weight, par défaut nous avons 2, 10 et 25.