Jeu de Dames - Maxence MOHR
Transcription
Jeu de Dames - Maxence MOHR
Polytech'Marseille Case 925 –163, avenue de Luminy 13288 Marseille cedex 9 Informatique 3ème année Promo 2016 Projet Algorithmique Jeu de Dames Rapport de projet Etudiants : Charton Trystan Mohr Maxence Ollagnon Julien Tuteur : Alexandra Bac Rapport d’analyse -- Jeu de Dames Introduction Les dames ou jeu de dames est un jeu de société combinatoire abstrait pour deux joueurs dont le but et de capturer ou d’immobiliser les pièces de son adversaire. Le terme désigne en fait plusieurs jeux comme le jeu de dames internationales ou bien le jeu de checkers. Le but de ce projet est d’appliquer nos connaissances dans le langage C et en algorithmique afin de réaliser non seulement un jeu de Dames à deux joueurs humains, mais aussi avec un joueur ordinateur ayant plusieurs niveaux de difficultés. Ce document contient l’analyse préliminaire du projet et permet de montrer un aperçu de la compréhension global du sujet, ainsi qu'une description des futurs algorithmes et structures de données. ~1~ Rapport d’analyse -- Jeu de Dames Sommaire 1) Règles du jeu de Dames Le matériel La marche des pièces La prise Les irrégularités La fin de partie égale Le résultat 2) Analyse des boucles nécessaires 3) Algorithmes des boucles 4) Réflexion sur le joueur ordinateur 5) Planning prévisionnel 6) Tests 7) Bilan 8) Conclusion 9) Références ~2~ Rapport d’analyse -- Jeu de Dames Regles Les règles ci-dessous sont des règles simplifiées. Les règles détaillées se trouvent à cette adresse : http://www.ffjd.fr/Web/index.php?page=reglements Vocabulaire : si vous avez le trait, cela signifie que c'est à vous de jouer. LE MATERIEL 1. Le jeu de dames international se joue sur un damier carré divisé en 100 cases égales, alternativement claires et foncées. 2. Le jeu se joue sur les cases foncées du damier. Il y a donc 50 cases actives. La plus longue diagonale, joignant deux coins du damier et comprenant 10 cases foncées, se dénomme la grande diagonale. 3. Le damier doit être placé de sorte que la première case de gauche, pour chaque joueur, soit une case foncée. 4. Le jeu de dames international se joue avec 20 pions blancs (clairs) et 20 pions noirs (foncés). Avant de débuter une partie, les 20 pions noirs et les 20 pions blancs sont disposés sur les 4 premières rangées de chaque joueur. Position initiale LA MARCHE DES PIECES 1. Il existe deux types de pièces : les pions et les dames. 2. Le premier coup est toujours joué par les blancs. Les adversaires jouent un coup chacun à tour de rôle avec leurs pièces. ~3~ Rapport d’analyse -- Jeu de Dames 3. Un pion se déplace obligatoirement vers l’avant, en diagonale, d’une case sur une case libre de la rangée suivante. Un pion se déplace vers l’avant, en diagonale, sur une case libre de la rangée suivante. 4. Lorsqu'il atteint la dernière rangée, le pion devient dame. Pour cela, on couronne le pion en plaçant dessus un deuxième pion de la même couleur. Lorsqu'il atteint la dernière rangée, le pion devient dame. 5. Une dame doit attendre que l’adversaire ait joué au moins une fois avant d’entrer en action. ~4~ Rapport d’analyse -- Jeu de Dames 6. Une dame se déplace en arrière ou en avant sur les cases libres successives de la diagonale qu’elle occupe. Elle peut donc se poser, au-delà de cases libres, sur une case libre éloignée. Une dame se déplace en arrière ou en avant sur les cases libres de la diagonale qu’elle occupe 7. Pour un joueur à qui c'est le tour de jouer, le fait de toucher une de ses pièces jouables implique l’obligation de jouer cette pièce, pour autant que cela soit possible. 8. Tant qu’une pièce touchée ou en cours de déplacement n’a pas été lâchée, il est permis de la poser sur une autre case, pour autant que cela soit possible. 9. Le joueur qui a le trait et qui désire replacer correctement une ou plusieurs pièces doit le notifier d’avance et distinctement à l’adversaire par la formule "j’adoube". LA PRISE 1. La prise des pièces adverse est obligatoire et s’effectue aussi bien en avant qu’en arrière. 2. Lorsqu’un pion se trouve en présence, diagonalement, d’une pièce adverse derrière laquelle se trouve une case libre, il doit obligatoirement sauter par-dessus cette pièce et occuper la case libre. Cette pièce adverse est alors enlevée du damier. Cette opération complète est la prise par un pion. ~5~ Rapport d’analyse -- Jeu de Dames Un pion effectue une prise en passant au-dessus d'un pion adverse. Il se rend alors sur la case suivante et enlève le pion adverse. 3. Lorsqu’une dame se trouve en présence sur la même diagonale, directement ou à distance, d’une pièce adverse derrière laquelle se trouvent une ou plusieurs cases libres, elle doit obligatoirement passer par-dessus cette pièce et occuper, au choix, une des cases libres. Cette pièce est alors enlevée du damier. Cette opération complète est la prise par une dame. La dame peut effectuer une prise à distance. La pièce à prendre doit se situer sur la même diagonale que la dame et il faut également une case vide derrière. La dame s'arrête sur la case libre de son choix située après la pièce prise. 4. Lorsqu’au cours d’une prise par un pion, celui-ci se trouve à nouveau en présence, diagonalement, d’une pièce adverse derrière laquelle se trouve une case libre, il doit obligatoirement sauter par-dessus cette seconde pièce, voire d’une troisième et ainsi de suite, et occuper la case libre se trouvant derrière la dernière pièce capturée. Les pièces adverses ainsi capturées sont ensuite enlevées du damier dans l’ordre de la prise. Cette opération complète est une rafle par un pion. ~6~ Rapport d’analyse -- Jeu de Dames Le pion prend également vers l'arrière 5. Lorsqu’au cours d’une prise par une dame, celle-ci se trouve à nouveau en présence, sur une même diagonale, d’une pièce adverse derrière laquelle se trouve une ou plusieurs cases libres, elle doit obligatoirement sauter par-dessus cette seconde pièce, voire d’une troisième et ainsi de suite, et occuper au choix une case libre se trouvant derrière et sur la même diagonale que la dernière pièce capturée. Les pièces adverses ainsi capturées sont ensuite enlevées du damier dans l’ordre de la prise. Cette opération complète est une rafle par une dame. Au cours d'une prise, la dame change de direction pour prendre d'autres pièces. 6. Au cours d’une rafle, il est interdit de passer au-dessus de ses propres pièces. 7. Au cours d’une rafle, il est permis de passer plusieurs fois sur une même case libre mais il est interdit de passer plus d’une fois au-dessus d’une même pièce adverse. Il est permis de passer plusieurs fois sur une même case libre. Mais il est interdit de passer plus d’une fois au-dessus d’une même pièce adverse. ~7~ Rapport d’analyse -- Jeu de Dames 8. Une rafle doit être clairement indiquée, pièce par pièce, en posant la pièce preneuse sur la case de saut, le temps d’y passer, et en déposant cette pièce sur la case terminale. 9. Les pièces prises ne peuvent être enlevées du damier qu’à l’issue de l’exécution complète de la rafle. 10. La prise du plus grand nombre de pièces est prioritaire, donc obligatoire. Dans ce cas, une dame compte pour une pièce, tout comme un pion. Elle ne confère nulle priorité et n’impose aucune obligation. Ici, les blancs doivent prendre trois pions noirs. Ils ne peuvent pas prendre les deux dames noires ! 11. Si les pièces à prendre sont en nombre égal dans deux ou plusieurs possibilités de prise ou de rafle, le joueur est libre de choisir une de ces possibilités, soit avec un pion, soit avec une dame. 12. Un pion qui au cours d’une rafle, ne fait que passer sur une des 5 cases de la rangée de base adverse reste un pion lorsque la rafle est terminée. LES IRREGULARITES 1. Si un des joueurs a commis une irrégularité, son adversaire a seul le droit de décider si l’irrégularité doit être rectifiée ou si, au contraire, elle doit être maintenue. Quelques exemples d'irrégularité : o Jouer deux fois de suite o Jouer une pièce de l’adversaire o Jouer une pièce alors qu’une prise ou une rafle est possible o Enlever sans raison des pièces de l’adversaire ou ses propres pièces o Prendre un nombre inférieur ou supérieur de pièces possibles à prendre o S'arrêter dans l’exécution d’une rafle o Enlever irrégulièrement une pièce, au cours d’une rafle non terminée 2. Si un joueur refuse de se soumettre au règlement officiel du jeu, son adversaire est en droit de l’y obliger. ~8~ Rapport d’analyse -- Jeu de Dames LA FIN DE PARTIE EGALE 1. La fin de partie est considérée comme égale lorsque la même position se représente pour la troisième fois, le même joueur ayant le trait. 2. Si, durant 25 coups, il n'y a ni déplacement de pion ni prise, la fin de partie est considérée comme égale. 3. S’il n'y a plus que trois dames, deux dames et un pion, ou une dame et deux pions contre une dame, la fin de partie sera considérée comme égale lorsque les deux joueurs auront encore joué chacun 16 coups au maximum. 4. Pour autant qu’il n’y ait pas de phase de jeu en cours, la fin de partie de deux dames contre une dame, et a fortiori, de une dame contre une dame, sera considérée égale. LE RESULTAT 1. Le gain est obtenu par un joueur lorsque son adversaire : o Abandonne la partie o Se trouve dans l’impossibilité de jouer alors qu’il a le trait o N’a plus de pièces 2. L’égalité, dénommée aussi remise ou nulle, est obtenue pour chacun des adversaires : o Qui la déclare, de commun accord o Lorsqu’aucun des deux ne parvient au gain ~9~ Rapport d’analyse -- Jeu de Dames Analyse des boucles necessaires Le jeu de dames se jouant au tour à tour et à deux joueurs uniquement, nous sommes parvenus à une modélisation par tâches. Une tâche principale, qui gérera le fonctionnement global : Affichage de l’écran titre, sélection du mode de jeu, et appel des autres boucles du jeu. Les cas d’égalité ne seront traités qu’en tant que tâches facultatives, car non essentielles au projet. Une autre tâche s’occupera de l’affichage du damier et comptera le nombre de pions restant pour chaque joueur, ainsi que le nombre de tours de jeu. Cela permettra qu’en plus d’afficher ces statistiques pendant la partie de gérer certaines règles. Une troisième tâche cherchera tous les coups possibles pour le joueur ayant le trait, et vérifiera si son coup est valide ou non. Une quatrième tâche gérera les règles de prise en s’assurant que toutes les règles aient été appliquées, mettra à jour le damier en retirant les pions capturés et en plaçant le pion déplacé à sa destination finale. De plus nous avons décidé de modéliser le damier à l’aide d’un tableau de dimension 10x10 (comme le damier original) avec par exemple : La valeur 0 pour une case vide ; 1 pour un pion noir ; 2 pour une dame noire ; -1 pour un pion blanc ; -2 pour une dame blanche Dans la prochaine partie nous allons détailler et décrire en pseudo-code les différents algorithmes énumérés ici. ~ 10 ~ Rapport d’analyse -- Jeu de Dames Algorithmes des boucles Fonction principale C’est elle qui gèrera le fonctionnement du jeu en général : l’initialisation du jeu, Afficher le titre du jeu Demande utilisateur 1 ou 2 joueurs => type Initialisation (tableau affichage, bloqué, etc...) bloqué=0 ; init(tableau) Affichage tableau tant que (bloqué=0) Si joueur bloqué += coup (tableau, joueur, type) Affichage tableau joueur = -1 Si !joueur bloqué += coup (tableau, joueur, type) Affichage Joueur = 1 fin_tq gagnant = fini(tableau) si gagnant = -1 afficher les blancs ont gangné si gagnant = 1 afficher les noirs ont gagnés sinon afficher match nul fin Fonction affichage Affiche le plateau de jeu void affichage(tableau) i, j, bl, no Afficher cadre pour i de 0 à 10 pour j de 0 à 10 Afficher tableau[i][j] Si case_noire noirs++ Si case_blanche blancs++ f_pour f_pour Afficher cadre Afficher info du jeu Fonction coup possible Cherche les coups possibles pour un joueur, le jouer er appeler la fonction. Vous trouverez dans la page suivante un schéma explicatif de la boucle de recherche de coups. ~ 11 ~ Rapport d’analyse -- Jeu de Dames ~ 12 ~ Rapport d’analyse -- Jeu de Dames Fonction joue Cette boucle a pour but de jouer une rafle tout e vérifiant que la rafle est autorisée. La boucle de recherche de coups renvoie un tableau rafles (tableau de liste) et cette boucle se sert de ce tableau pour vérifier le coup saisi par le joueur… ~ 13 ~ Rapport d’analyse -- Jeu de Dames Reflexion sur le joueur ordinateur Comme indiqué par l’énoncé, le joueur IA sera basé sur l’algorithme MiniMax, avec différents niveaux de profondeurs en fonction du niveau de difficulté choisi. De plus, la fonction d’évaluation sera scindée en deux (une pour les pions, une pour les dames, puis combinaison des deux pour avoir une seule évaluation globale) un système de valeur de cases sera instauré afin d’établir des priorités de captures/déplacements (les dames étant les pions les plus puissants, sacrifier un ou deux pions si l’échange est plus intéressant…) La fonction récursive Minimax Void appel_minimax (damier, joueur, prof, coord) Minimax(damier, joueur, prof) int minimax (damier, joueur, profondeur, Nœud N, coordonnées coord_sauvées) Val1=INT_MIN Si profondeur > 0 { Si(nœud = MAX) Cherche des coups possibles de l’IA Pour chaque coup possible Copie du tableau de jeu (copie_damier) L’IA joue dans la case possible (rafle entière) val = minimax(copie_damier, joueur, profondeur -1, MIN) Si val > val1 Val1=val Coor_sauvées = Coord_actuelles Si(nœud = MIN) Cherche des coups possibles de l’humain Pour chaque coup possible Copie du tableau de jeu (copie_damier) L’humain joue dans la case possible (rafle entière)) val = minimax(copie_damier, joueur, profondeur -1, MAX) Si val < val1 Val1=val Coor_sauvées = Coord_actuelles } Else Return eval(damier) ~ 14 ~ Rapport d’analyse -- Jeu de Dames Fonction d’évaluation des pions eval_pions (damier) Cette fonction cherchera les pions sur le damier, et pour chaque pion (de l’IA ou de l’humain) donnera un score en fonction de leurs positions sur le plateau, avec le tableau de scores cidessous. Un pion IA sera compté en positif, et un pion humain en négatif. La somme de ces scores donnera l’évaluation pour les pions eval_pions. eval_pions = ∑𝑖=𝑝𝑖𝑜𝑛𝑠 𝐼𝐴 𝑠𝑐𝑜𝑟𝑒(𝑖) − ∑𝑗=𝑝𝑖𝑜𝑛𝑠 𝐻𝑢𝑚𝑎𝑖𝑛𝑠 𝑠𝑐𝑜𝑟𝑒(𝑗) Une fonction d’évaluation plus efficace aurait été de prendre en compte le positionnement relatif de chaque pion IA par rapport à celui de l’humain. Cette implémentation ne sera pas en place, en raison d’un manque de temps. En revanche, l’évaluation statique, dépendant de la position, est actuellement implantée. Fonction d’évaluation des dames eval_dame (damier) Cette fonction a pour but d’évaluer un plateau par rapport à la position des dames. Le principe étant qu’une dame ne doit pas être en danger, et si une dame est en position pour capturer un pion, l’option est favorisée. Cette fonction d’évaluation ne fonctionne que pour les profondeurs impaires. ~ 15 ~ Rapport d’analyse -- Jeu de Dames Pour mieux comprendre, voici un schéma explicatif. Fonction d’évaluation du nombre de dames (damier) Pour tout le damier Si l’IA a une dame score += 250 Si l’humain a une dame score -=300 Ceci permet d’éviter d’offrir la possibilité à l’humain d’avoir des dames, tout en valorisant un plateau si l’IA a des dames Fonction d’évaluation globale eval (damier) La fonction d’évaluation globale regroupe l’évaluation des dames et des pions en un seul score, qui est : 𝑒𝑣𝑎𝑙 = 𝑒𝑣𝑎𝑙𝑑𝑎𝑚𝑒𝑠 + 𝑒𝑣𝑎𝑙𝑝𝑖𝑜𝑛𝑠 + 𝑒𝑣𝑎𝑙𝑛𝑜𝑚𝑏𝑟𝑒𝑑𝑎𝑚𝑒𝑠 ~ 16 ~ Rapport d’analyse -- Jeu de Dames Planning previsionnel ~ 17 ~ Rapport d’analyse -- Jeu de Dames Tests Vu l’ensemble des fonctions du projet, il nous a été nécessaire de tester les fonctions à part, afin de déceler les erreurs dans ces diverses fonctions. Les tests effectués sont les suivants : Fonction affichage : un damier initialisé et aléatoire Fonction coup : sur un damier initialisé, sur un damier préparé à cet effet. Fonction joue_rafle : en cours de partie (à deux joueurs) et sur un damier préparé à cet effet. Fonction minimax : en cours de tests (en cours de partie) Fonction d’évaluation : damier de départ et damiers préparés à cet effet. ~ 18 ~ Rapport d’analyse -- Jeu de Dames Difficultes rencontrees Au cours de ce projet, nous avons rencontré différents points qui ont considérablement ralenti notre projet : Listes (structure de données pour enregistrer les coups) Au début, nous avions envisagé un tableau pour sauver les coups possibles, mais du fait de certaines rafles complexes (2 pions mangés ou plus), cela ne fonctionnait pas. Ensuite nous avons développé une structure de données basée à la fois sur les listes et les tableaux. La structure de donnée employée ne fonctionnait pas (problèmes de création de maillons, de copies, etc …). Nous avons dû alors repenser notre structure de donnée de sauvegarde de coups possibles et de coups obligatoires. Il s’agit maintenant d’un tableau de listes, où à chaque élément du tableau correspond une liste qui elle-même correspond à une rafle. Débogage Cette étape a été longue, car d’une part le code de notre jeu est plutôt long et d’autre part à cause de limitations du langage C (on est souvent tenté de faire de l’orienté objet). Malgré cette difficulté, cela a été un défi pour nous à relever… Activités extérieures (Vacances, partiels) Il nous a été difficile de concilier les révisions pour les partiels du premier semestre et l’avancement du projet. De plus, en raison des vacances de Noël, il a été difficile de travailler (fêtes, repos, famille, etc…) Minimax Le Minimax est assez complexe à comprendre, de par sa nature récursive et de la fonction d’évaluation. Ces notions, difficilement acquises en cours, nous ont été réexpliquées par des camarades et enfin comprises. Cas d’égalité Le cas d’égalité, tel qu’indiqué dans les règles, n’a pas pu être implémenté dans les temps. Néanmoins, cette partie du jeu de dames n’est pas essentielle. Dames : Il nous a fallu créer une nouvelle fonction de détection de coups basée sur les dames et non sur les pions. ~ 19 ~ Rapport d’analyse -- Jeu de Dames Bilan Le projet a bien avancé, mais certaines parties nécessitent encore des approfondissements ou des tests. Voici un récapitulatif des différentes boucles et de leurs états d’avancement. Affichage : Terminée, testée et fonctionnelle Recherche de coup : Terminée, testée et fonctionnelle. De plus, elle respecte les règles de la FFJD. Joue rafle : Terminée, testée et fonctionnelle. De plus, elle respecte les règles de la FFJD. Minimax : Terminée, en cours de tests Dames : Terminée, en cours de tests ~ 20 ~ Rapport d’analyse -- Jeu de Dames Conclusion Ce projet, basé sur le jeu de dames, est très intéressant car il permet d’appliquer à la fois nos connaissances en C et en algorithmique. De plus, le jeu de dames étant un jeu assez populaire, ce qui nous a facilité l’analyse du sujet. Malgré tout, nous avons eu des difficultés dues aux règles du jeu et des structures de données. Enfin, le joueur ordinateur et sa fonction d’évaluation ont été assez difficiles à concevoir. Ce projet a été énormément instructif sur le langage C, la recherche de structures de données compatibles et efficaces et enfin sur le MiniMax, fonction que nous avons mal comprise en cours et dont l’implémentation n’a pas été aisée, mais très intéressante. ~ 21 ~ Rapport d’analyse -- Jeu de Dames References Règles du jeu de dames : - Fédération Française de Jeu de Dames http://www.ffjd.fr/Web/index.php - Wikipédia http://fr.wikipedia.org/wiki/Dames ~ 22 ~