Rapport projet programmation logique « Jeu Teeko » Réalisé par : Encadré par : LEROUX Joseph DKHISSI Salah JOUNDI Sahar Année Universitaire 2015-2016 1|Page Sommaire I. Présentation des règles du jeu ............................................................................................................................4 II. Algorithmes pour l’intelligence artificielle ....................................................................................................6 1. Choix de l’algorithme ....................................................................................................................................6 2. Algorithme minimax ......................................................................................................................................6 3. Elagage alpha-bêta .........................................................................................................................................7 III. Principaux prédicats ..........................................................................................................................................8 1. Mouvement d’une pièce ...............................................................................................................................8 2. Changer de joueur ..........................................................................................................................................8 3. Fonction d’évaluation ...................................................................................................................................8 4. Boundedbest/6 ................................................................................................................................................9 5. Alpha-bêta..........................................................................................................................................................9 6. Fin de jeu ............................................................................................................................................................9 IV. V. Interface Graphique ......................................................................................................................................... 10 1. Généralités ...................................................................................................................................................... 10 2. Choix de notre interface ............................................................................................................................ 10 3. Explication du code ..................................................................................................................................... 10 Difficultés rencontrées ........................................................................................................................................ 12 1. Interface graphique : .................................................................................................................................. 12 2. Débogage :....................................................................................................................................................... 12 VI. Amélioration possibles : ................................................................................................................................ 13 VII. Bibliographie ...................................................................................................................................................... 15 VIII. Table de figures ................................................................................................................................................. 15 2|Page Introduction Dans le cadre du module de Programmation logique nous sommes amenés à réaliser un jeu à deux joueurs où des notions vues en cours telles que les algorithmes Minimax et α β pourront être exploités et approfondis. Nous avons pour objectif de concevoir les deux partie du jeu « Teeko » : homme vs machine et homme vs homme avec une interface graphique qui facilite l’utilisation du jeu. 3|Page I. Présentation des règles du jeu TEEKO est un jeu de stratégie combinatoire qui se joue à deux jours sur un plateau de 5*5 cases tel que le plateau ci-dessous : Figure 1: Plateau de jeu "TEEKO" Chaque joueur dispose de 4 pions de couleur rouge ou noire. L’objectif de chaque joueur est de former l’une des configurations suivantes : - Une ligne verticale de 4 pions Figure 2:Position gagnante1 4|Page - Une ligne horizontale de 4 pions Figure 3: Position gagnante2 - Une diagonale de 4 pions Figure 4: Position gagnante3 - Un carré de 4 pions Figure 5: Position gagnante4 Le jeu se déroule en 2 phases : Phase 1 : Au départ le plateau est vide. Chaque joueur, à tour de rôle, va placer l’un de ses pions dans l’une des cases vides. La première phase dure donc au maximum 8 tours, chaque joueur plaçant successivement chacun de ses 4 pions. La phase 1 peut être plus courte si l’un des joueurs forme l’une des configurations gagnantes décrites précédemment. Une fois que les deux joueurs ont placés leurs pions et si aucun des deux n’a gagné, on passe à la phase 2. 5|Page Phase 2 : Une fois le placement de tous les pions est effectué, on passe à la deuxième phase. Les joueurs déplace un par un leurs pion sur les, c.à.d. verticalement, horizontalement ou en diagonale. Et ainsi de suite jusqu’à ce que l’un des 2 joueurs remporte la partie en formant l’une des figure gagnante ci-dessus. II. Algorithmes pour l’intelligence artificielle 1. Choix de l’algorithme Nous avons tout d’abord pensé à utiliser l’algorithme minimax pour implémenter le fonctionnement de notre intelligence artificielle. Cette IA aura ensuite pour rôle de permettre à l’ordinateur de jouer au jeu Teeko. L’ordinateur va essayer tous les coups possibles et juger celui qui sera meilleur. L’algorithme étant vu en cours pour le tictactoe, il nous semblait intéressant de l’utiliser. Néanmoins, l’utilisation de cet algorithme étant moins avantageuse que l’élagage alpha beta, nous avons opté pour ce dernier puisqu’il ne nécessite pas de parcourir entièrement l’arbre de recherche, ce qui présente un gain de temps. 2. Algorithme minimax L’utilisation de l’algorithme minimax nécessite certains prérequis : Un jeu alterné : chaque agent joue à tour de rôle. Dans notre cas 2 joueurs. Un environnement déterministe Exemple, si un joueur de Teekochoisit de jouer la première colonne, il est possible de déterminer la totalité du plateau de jeu après cette action. Un environnement à information parfaite : Le plateau du jeu du Teeko est visible par tous, alors que dans le poker, le jeu des adversaires ne l’est pas. Un jeu à somme nulle : la somme des gains de tous les joueurs s’annule. Exemple, si on définit le gain d’une partie de Teeko comme 1 si on gagne, 0 si ex æquo et -1 si on perd, alors dans tous les cas, à la fin de la partie, la somme des gains est nulle. Autrement dit, une situation favorable pour un joueur est obligatoirement défavorable pour ses adversaires L’algorithme minimax consiste à générer un arbre de jeu, qui à partir de l’état initial, va créer une branche pour chaque coup possible du joueur actuel, ce qui va changer l’état du jeu, puis pour chacun de ces nouveaux états, va créer une branche pour chaque coup possible de l’adversaire et ainsi de suite... Il consiste ainsi à passer en revue pour un nombre limité de coups et à donner une valeur à un état du jeu à la fin de n coups. Le meilleur choix est alors celui qui minimise les pertes du joueur tout en supposant que l’adversaire cherche au contraire à les maximiser (puisque le jeu est à somme nulle). 6|Page Un exemple d’arbre généré par l’algorithme minimax tiré de Wikipédia est présenté cidessous. Figure 6 : Arbre de recherche du minimax 3. Elagage alpha-bêta L’algorithme minimax est l’algorithme qui colle parfaitement à notre problème, mais il présente un inconvénient majeur : il produit trop de possibilités. Prenons par exemple le cas du troisième tour. Chacun des joueurs a posé un pion. Le joueur suivant aura donc 23 possibilités pour poser son pion suivant, et le joueur d’après 22 possibilités pour chacune des 23 possibilités, ce qui nous fait déjà 22*23 = 506 possibilités. Si l’on continue un tour de plus, on aura 506*21 = 10626 possibilités, ce qui devient rapidement énorme. C’est pourquoi nous avons décidé d’implémenter l´élagage alpha-bêta. Il permet en effet de réduire le nombre de possibilités, et donc le nombre d’appels à la fonction d’évaluation en supprimant les branches dont on est sûr qu’elles seront moins bonnes que les branches déjà évaluées. Voici un exemple d’élagage tiré sur Wikipédia Figure 7 : Elagage Alpha-Beta 7|Page III. Principaux prédicats 1. Mouvement d’une pièce Le mouvement d’une pièce est représenté par les prédicats suivants: move([ ?Player1 , ?State, ?Board] , [?Player2, ?State, ?NextBoard]) Le prédicat est utilisé en mode homme vs machinechange de joueur avec nextPlayer/2 et l’état change si le prochain coup permet d’atteindre une position finale. Le plateau de jeu change en circonstance grâce au prédicat à l’aide de move_aux/3. humanMove([?Player1, ?play, ?Board], [?Player2, ?State, ?NextBoard], ?Pos) Ce prédicat est similaire au précèdent avec ?Pos un itérateur, mais il est utilisé dans le mode homme vs homme. 2. Changer de joueur C’est le prédicat nextPlayer( ?Player1, ?Player2)qui permet à un état donné de changer de joueur. 3. Fonction d’évaluation Le prédicat utility/2 calcule le nombre de points correspondants au placement des pions en cours. Il peut être compris entre -200 et 200, la borne supérieure étant la victoire du joueur dont la couleur est passée en paramètre et la borne inférieure celle de l’adversaire. Lorsque ce nombre est positif, la position actuelle des pièces favorise le joueur concerné. Dans le cas contraire, elle favorise le joueur adverse. Ce nombre est calculé en fonction de plusieurs critères, le principal étant la victoire ou non de l’un des joueurs. Si ce cas n’est pas présent, le programme tente de détecter d’autres éléments, en fonction de la phase de jeu en cours. Le centre du plateau contient les emplacements avec le plus de valeurs puisqu’ils accordent plus de possibilités pour arriver à un état gagnant. 8|Page Figure 8 : Notre Plateau avec les cases centrales prises 4. Boundedbest/6 La détermination du meilleur choix local et l’évaluation est effectuée par le prédicat suivant boundedbest(PosList,Alpha,Beta,Suc,Val, Prof) Le paramètre Poslist est une liste de plateaux successeurs calculés à partir de la position actuelle par le prédicat moves/2. Le prédicat boundedbest/6 va déterminer le meilleur successeur à partir de cette liste en prenant en compte les paramètres : Val pour la valeur d’une configuration Alpha et Bêta pour l’élagage Prof pour la profondeur de l’arbre de recherche 5. Alpha-bêta L’élagage alpha-bêta est effectué par le prédicat suivant : alphabeta( ?Pos, ?Alpha, ?Beta, ?Suc, ?Val, ?Prof) Le paramètre Pos est la position du joueur (liste de 25 éléments) Les paramètres Alpha, Beta et Val sont des entiers compris entre -200 et 200 Le paramètre Suc est le meilleur plateau Successeur à partir de Pos déterminé par le prédicat boundedbest/6 Le paramètre Prof est la profondeur de recherche de l’arbre. A partir d’une profondeur 4, l’IA prend plus de temps pour déterminer un meilleur coup. 6. Fin de jeu Le jeu se termine soit par une victoire, soit par une défaite, soit encore par un nul. a) Victoire et défaite : winPos(?Player, ?Board) Le prédicat winPos( ?P, ?B) indique toutes les configurations gagnantes pour accéder à la victoire. Nous nous sommes inspirés du même prédicat que celui présent dans le jeu tictactoe avec plus de possibilités gagnantes (44 combinaisons). Le joueur 1 gagne si winPos( Player1, Board)renvoie true, et le joueur 2 perd dans ce cas. b) Egalité :drawPos(?Player, ?Board) Ce prédicat permet de déclarer le match nul lorsque le plateau est plein et qu’aucun des deux joueurs n’a gagné. 9|Page IV. Interface Graphique 1. Généralités Nous avons utilisé la bibliothèque XPCE qui fournit une interface graphique à SWI-PROLOG. Aucune installation spéciale n’est requise pour utiliser la dite bibliothèque, elle est automatiquement chargée dès qu’un de ses prédicats est appelé. Afin d’éviter toute erreurs nous l’avons appelé explicitement par l’instruction : - : use_module(library(pce)). 2. Choix de notre interface o Nous avons un menu qui propose à l’utilisateur de : - Jouer à deux - Jouer contre l’ordinateur - Quitter le jeu o Le plateau vide est un ensemble d’image de pions vide concaténés o Nous avons considéré chaque case dans le plateau de jeu comme un bouton sur lequel l’utilisateur doit cliquer pour que le pion apparaisse. o Le plateau se recharge à chaque tour pour remplacer les pions vide avec des pions rouge ou noir 3. Explication du code o Le prédicat debut/0avec lequel l’exécution de notre jeu commence. On crée notre menu dans ce prédicat debut :- new(D, dialog('teeko')), send(D, display, text('Bienvenue dans votre jeu teeko'), point(0, 0)), send(D,append,button(hommevsmachine, message(@prolog, hvsm))), send(D, append,button(hommevshomme, message(@prolog, hvsh))), send(D, append,button(quit, message(D, destroy))), … send(D, open). - New crée un objet de type dialogue Un bouton pour l’interface homme vs machine Un bouton pour l’interface homme vs homme Un bouton pour quitter le jeu ou on utilise le destroy pour détruire la partie 10 | P a g e Figure 9: Notre Accueil o Le prédicat récursif show. Le plus important prédicat de l’interface puisque c’est la ou se crée le plateau de jeu o show3([H|T],N) :- new(IV, image('vide.bmp')),new(BV,bitmap(IV)), new(IN, image('noir.bmp')),new(BN,bitmap(IN)), new(IR, image('rouge.bmp')),new(BR,bitmap(IR)), ( H=0 -> new(D, button(imagevide, message(@mw,return, N))), send(D, label(BV)); H=o -> new(D, button(imagerouge, message(@mw,return, N))), send(D, label(BR)); H=x -> new(D, button(imagenoir, message(@mw,return, N))), send(D, label(BN)) ), ( 0 is mod(N,5) ->send(@mw,append,D,below); send(@mw,append,D,right) ), N1 is N+1, show3(T,N1). Les 3 premier NEW servent à charger les images correspondantes aux jetons rouge, vide et noir. Le prédicat bitmap de la librairie XPCE sert à mettre une image dans un objet graphique qui peut être affichée sur un dispositif. Dans le “If then else” on attribue au jeton vide qui est associé au ‘0’ l’image du jeton vide Respectivement au jeton rouge (o) et au jeton noir (x) les images rouge et noir. 11 | P a g e Pour avoir un plateau de 5*5, on concatène les images jusqu’à ce que le nombre d’images sur une ligne soit divisible par 5 pour retourner à la ligne. V. Difficultés rencontrées 1. Interface graphique : Nous n’avons pas trouvé assez de documentation en ligne à fin de pouvoir faire une interface graphique assez belle et intuitive. 2. Débogage : Comme nous avons des prédicats qui appellent d’autres qui eux même appel le prédicat appelant comme dans le cas de alphabeta\6 qui appel boundbest\6 qui luimême appel alphabeta\6. Alors trouver les erreurs devient difficile. 3. Intelligence artificielle Nous avons implémenté l’algorithme alpha-bêta pour le fonctionnement de l’intelligence artificielle. Le problème fut que, malgré le fonctionnement de l’algorithme, ce dernier ne semble pas fonctionner comme il se doit : L’algorithme ne renvoie pas tout le temps le meilleur coup évalué par notre prédicat d’évaluation utility/2. Nous avons essayé de résoudre le problème de plusieurs manières en essayant de debugger, d’utiliser d’autres prédicats de tri de liste1 mais en vain. Nous avons même tenté de recourir à l’alternative minimax en profondeur mais celui-ci fonctionnait encore moins bien. Les coups de l’ordinateur sont linéaires et commencent vers le bas à cause, notamment, du prédicat move_aux/3. Nous avons remarqué que c’est généralement le dernier élément de la liste renvoyé par moves/2 qui est renvoyé par alpha-bêta 1 12 | P a g e Néanmoins, l’IA bloque toutes les combinaisons gagnantes sauf quand l’adversaire a au moins deux possibilités de gagner. Blocage L’IA tente également de maximiser le nombre de possibilités gagnantes au cas où l’adversaire en bloquerait une : VI. Améliorations possibles : - Mettre en place les niveaux de difficultés pour l’intelligence artificielle Gérer les scores des joueurs Améliorer l’interface Représenter le plateau par coordonnées (x,y) pour optimiser le temps de recherche du meilleur coup Mettre en place une heuristique plus intuitive qui sera défini dynamiquement 13 | P a g e Conclusion Durant la réalisation de ce projet, nous avons eu l'occasion d'appliquer les connaissances acquises en cour de prolog, mais également de découvrir le travail entourant la programmation logique lors de la création d'une intelligence artificielle. En plus de s'appliquer au jeu Teeko, les connaissances utilisées, ainsi que le programme créé, pourraient facilement s'adapter à d'autres jeux basés sur le même principe, qui est celui du tour à tour. L'intelligence artificielle du jeu puissance4, par exemple, ne serait pas très différente, puisqu'il ne s'agit que d'une adaptation de la phase de placement du Teeko. 14 | P a g e VII. Bibliographie Cours et Tps https://fr.wikipedia.org/wiki/ minimax et alpha-bêta http://jeuxsoc.fr/jeu/teeko.0.0 règles du jeu et modèle http://jfoutelet.developpez.com/articles/xpce/ interface graphique forum http://www.swi-prolog.org/packages/xpce/ interface graphique notice d’utilisation http://www.montefiore.ulg.ac.be/~lens/prolog/tutorials/tictactoe.pl exemple du tictactoe VIII. Table de figures Figure 1 : Plateau de jeu "TEEKO"............................................................................................................. 4 Figure 2 : Position gagnante1 ..................................................................................................................... 4 Figure 3 : Position gagnante2 ..................................................................................................................... 5 Figure 4 : Position gagnante3 ..................................................................................................................... 5 Figure 5 : Position gagnate4 ........................................................................................................................ 5 Figure 6 : Arbre de recherche MinMax.................................................................................................... 7 Figure 7 : Arbre de recherche AlphaBeta ............................................................................................... 7 Figure 8 : Notre Plateau ................................................................................................................................ 8 Figure 9 : Notre Accueil .............................................................................................................................. 11 15 | P a g e