TP : Jouons au Poker 1 Le matériel fourni 2 Le programme de jeu

Transcription

TP : Jouons au Poker 1 Le matériel fourni 2 Le programme de jeu
Univ. Lille1 - Licence Informatique 2ème année
2014-15
Algorithmes et Programmation Impérative 2
TP : Jouons au Poker
Objectifs :
Programmation modulaire
Manipulation de types somme
Filtrage de motifs
Production de documentation de module
Compilation séparée
Dans ce TP, vous allez simuler une version simpliée du jeu de poker.
Pour ce faire, vous allez réaliser trois modules
1. un module Carte, dont vous pourrez lire la documentation de l'interface ici ;
2. un module Main, dont vous pourrez lire la documentation de l'interface ici ;
3. et un module Combinaison, dont vous pourrez lire la documentation de l'interface ici.
1
Le matériel fourni
Question 1 Récupérez le chier poker.zip et décompressez-le dans votre répertoire de travail.
1.
2.
3.
4.
5.
6.
2
Vous devez obtenir les chiers et dossiers
jeu.ml : chier source du programme de jeu à réaliser.
Modules_compiles : dossier contenant les versions compilées des trois modules à réaliser.
Doc : dossier vide destiné à contenir la documentation des modules que vous produirez.
Carte : dossier contenant le chier d'interface du module Carte (carte.mli).
Main : dossier contenant les chiers d'interface et d'implémentation du module Main (main.mli et
main.ml).
Combinaison : dossier contenant le chier d'interface du module Combinaison (combinaison.mli).
Le programme de jeu
Dans cette partie, vous allez utiliser le programme de jeu à réaliser après l'avoir compilé.
2.1
Description sommaire du poker
Le jeu du poker est un jeu de cartes dans lequel à chaque tour chaque joueur reçoit cinq cartes
(une main ). Puis après une phase d'enchères et éventuellement d'abandons et de remplacement de
certaines cartes, le vainqueur est déterminé comme étant celui dont la main présente la combinaison
la plus forte. (Pour une description des combinaisons voir la section 5.)
Le jeu à programmer est une version très simpliée du poker dans laquelle il n'y a ni enchère
ni remplacement éventuel de cartes. Un tour de jeu consiste simplement à distribuer cinq cartes à
chaque joueur et à déterminer le vainqueur.
1
2.2
Organisation du programme
jeu
Outre les modules de la bibliothèque standard (Array, Sys, Printf, . . . ), le programme jeu
utilise deux modules supplémentaires
1. le module Main ;
2. et le module Combinaison.
Comme vous le découvrirez par la suite, le module Combinaison utilise aussi le module Main,
ainsi que le module Carte.
Enn, le module Main utilise le module Carte.
Toutes ces dépendances sont illustrées sur la gure 1 qui montre un graphe dont les sommets
sont les modules, et les èches les reliant indiquant un lien de dépendance entre module. Une èche
partant d'un module A pour arriver sur un module B signiant que le premier module utilise le
second.
Figure 1 Graphe de dépendances des modules du programme jeu
Connaître les dépendances entre modules est important pour la compilation d'un programme
qui les utilise.
2.3
Compilation du programme
jeu
Pour compiler le programme jeu, vous allez devoir indiquer au compilateur où il peut trouver les
modules compilés. Pour l'instant ces modules compilés se trouvent dans le dossier Modules_compiles,
2
mais ultérieurement, lorque vous aurez réalisé les implémentations de ces modules, ils seront situés
dans d'autres dossiers 1 .
Question 2 Lancez la compilation du programme avec la commande
> ocamlc -I Modules_compiles -o jeu carte.cmo main.cmo combinaison.cmo jeu.ml
L'option -I Modules_compiles indique au compilateur dans quel dossier chercher les modules autres
que ceux de la bibliothèques standard.
Comme vous le savez déjà, l'option -o jeu indique au compilateur le nom du chier exécutable à
produire.
Viennent ensuite les noms des modules compilés utilisés par le programme. L'ordre dans lequel ils
sont mis est important puisqu'ils doivent respecter les dépendances. Si un module A utilise un module B,
le nom du chier b.cmo doit être mentionné avant celui du chier a.cmo. Compte-tenu des dépendances
entre modules pour le programme jeu (cf gure 1), l'ordre utilisé dans la commande de compilation
ci-dessus est le seul possible.
2.4
Et maintenant jouons !
Question 3 Exécutez le programme jeu en lui donnant le paramètre 4.
> ./jeu 4
Vous devez obtenir un achage semblable à ce qui suit
Joueur 1 : [ 4C, 5C, 8P,
Joueur 2 : [ 2C, 6T, 7T,
Joueur 3 : [ 3K, 4P, 10P,
Joueur 4 : [ 5P, 6P, 7P,
Vainqueur : joueur 1
8K,
8T,
VT,
9T,
RP]
VK]
RK]
DK]
:
:
:
:
Paire de 8
Main vide
Main vide
Main vide
L'interprétation de la commande ./jeu 4 et de l'achage qu'elle produit est un tour d'une partie
de poker entre quatre joueurs. Le nombre de joueurs qu'il est possible de choisir doit être compris entre
2 et 5.
L'achage donne pour chacun des quatre joueurs
la main de cinq cartes qui lui ont été données lors de la distribution des cartes ;
et la combinaison que sa main contient.
La dernière ligne de l'achage donne le vainqueur de la donne.
Il est possible que lors d'un tour les joueurs soient ex-æquo, comme par exemple ci-dessous.
Joueur 1
Joueur 2
Joueur 3
Joueur 4
Ex aequo
:
:
:
:
:
[ 2T, 5C,
[ 2K, 3P,
[ 3C, 4K,
[ 4T, 5K,
joueurs 1 2
8T,
7C,
5P,
6K,
4 3
DP, RT] :
VT, DC] :
8C, 10T] :
8P, AC] :
Main
Main
Main
Main
vide
vide
vide
vide
1. Ces modules compilés l'ont été avec la version 3.11.2 d'Objective Caml, qui est celle installée dans les salles
de TP. Aucune garantie de bon fonctionnement n'est donnée pour d'autres versions.
3
3
Le module
Carte
Dans cette partie, vous allez
1. produire une version HTML de la documentation du module Cartes ;
2. réaliser une implémentation de ce module ;
3. et la valider par des tests.
3.1
L'utilitaire
ocamldoc
Comme vous pouvez le remarquer en consultant le contenu du chier carte.mli, les commentaires qu'il contient utilisent certaines structures particulières. Elles sont destinées à l'utilitaire
ocamldoc, qui fait partie intégrante de toute distribution d'Objective Caml, et qui, à partir de
ces commentaires, permet de produire de la documentation dans diérents formats, en particulier
HTML 2 .
Question 4 Placez-vous dans votre répertoire de travail (celui qui contient les diérents dossiers décrits
dans la section 1).
Puis tapez la commande
> ocamldoc -html -d Doc Carte/carte.mli
L'option -html précise que la documentation est à produire au format HTML. L'option -d Doc précise
que les chiers produits doivent l'être dans le dossier Doc. Enn, il s'agit ici de produire la documentation
décrite dans le chier Carte/carte.mli.
Cette commande exécutée, le dossier Doc contient plusieurs chiers d'extension .html et un chier
d'extension .css.
Firefox par exemple, pour consulter la documentation
que vous venez de produire. Pour cela, allez dans le menu Fichier > Ouvrir un fichier et choisissez
le chier Carte.html du dossier Doc.
Question 5 Utilisez un navigateur internet,
Comparez cette documentation avec celle que vous pouvez trouver ici.
3.2
Implémentation du module
L'implémentation du module doit se faire dans un chier nommé carte.ml situé dans le dossier
Carte. Durant le travail de réalisation, vous pouvez à tout moment valider les éléments réalisés en
utilisant l'interpréteur ocaml et la directive #use pour évaluer les déclarations contenues dans le
chier carte.mli.
3.3
Validation de l'implémentation
L'implémentation du module terminée, il est temps d'en vérier le bon fonctionnement en l'intégrant au programme jeu.
Question 6 Compilez les deux chiers d'interface et d'implémentation.
2. C'est aussi l'utilitaire
ocamldoc
qui a produit la gure 1.
4
> ocamlc -c Carte/carte.mli
> ocamlc -c -I Carte Carte/carte.ml
Si aucune erreur ne s'est produite lors de ces deux compilations, le dossier Carte doit contenir deux
chiers carte.cmi et carte.cmo.
Question 7 Compilez maintenant le chier jeu.ml an de produire un exécutable, en utilisant la version
du module Carte que vous avez réalisée. Pour cela ajoutez deux dossiers de recherche de modules dans
la ligne de commande en mettant le dossier Carte avant l'autre.
> ocamlc -I Carte -I Modules_compiles -o jeu carte.cmo main.cmo combinaison.cmo jeu.ml
Question 8 Vériez le bon fonctionnement du programme jeu.
4
Le module
Main
Dans cette partie, vous allez
1. rédiger une documentation de l'interface du module Main et en produire une version HTML ;
2. compiler le module ;
3. et valider par des tests.
Le module Main est chargé de dénir
un type main pour représenter les mains de cinq cartes que reçoivent les joueurs de poker,
ainsi qu'un constructeur cree qui construit une main à partir de cinq cartes et un sélecteur
carte qui extrait d'une main la carte d'un rang donné dans l'ordre croissant.
Il déclare en plus
une procédure d'impression : imprimer ;
une fonction qui génère des mains aléatoires : main_alea ;
et une fonction qui génère une distribution de mains pour n joueurs : distribue.
4.1
Rédiger la documentation du module
L'utilitaire ocamldoc extrait la documentation dans les commentaires situés dans les chiers
d'interface et/ou d'implémentation, commentaires qui doivent commencer par (**. Les commentaires débutant par (* sont ignorés.
Question 9 En vous inspirant de la documentation du module
Main que vous pouvez lire ici, ainsi que
des commentaires placés dans le chier Carte/carte.mli, complétez le chier Main/main.mli avec des
commentaires destinés à la documentation de ce module.
Question 10 Puis utilisez ocamldoc pour produire cette documentation. Il est nécessaire que le module
Carte ait été préalablement compilé (au moins l'interface), ce qui doit être le cas, et il faut préciser le
chemin d'accès à ce module compilé.
> ocamldoc -I Carte -d Doc -html Main/main.mli
5
Question 11 La commande précédente a bien produit la documentation du module Main mais les liens
ne sont pas établis avec celle du module Carte. On peut remédier à cela en produisant simultanément
la documentation des deux modules.
> ocamldoc -I Carte -d Doc -html Carte/carte.mli Main/main.mli
4.2
Compilation du module
Question 12 Compilez le module
Main an de produire les deux chiers main.cmi et main.cmo dans le
répertoire Main. Il vous faudra utiliser l'option -I <chemin d’acces au module Carte> puisque le module
Main utilise le module Carte.
4.3
Validation de l'implémentation
Question 13 Vous allez maintenant recompiler le programme
Main.
jeu avec le module Main du répertoire
> ocamlc -I Carte -I Modules_compiles -o jeu carte.cmo main.cmo combinaison.cmo jeu.ml
Question 14 Vériez le bon fonctionnement du programme.
5
Le module
Combinaison
Voici par ordre décroissant de valeurs les diverses combinaisons que peut posséder une main de
cinq cartes au poker.
1.
Quinte ush
Une quinte ush ou plus simplement quinte est une main constituée de cinq
cartes de la même couleur et de hauteurs consécutives. Elle est caractérisée par la couleur et
la hauteur de la plus carte de rang le plus élevé. La quinte montrée à la gure 2 est une quinte
au 10 en trèe 3 .
Figure 2 Une quinte au 10 en trèe
2.
Carré
Un carré est une main contenant quatre cartes de même hauteur. Un carré est caractérisé par la hauteur de ces quatre cartes. Le carré montré à la gure 3 est un carré de
9.
3. Toutes les gures illustrant les combinaisons du poker proviennent du site Wikipedia.
6
Figure 3 Un carré de 9
3.
Full Un full
est une main contenant trois cartes de même hauteur et deux autres cartes de
même hauteur. Un full est caractérisé par la hauteur des trois cartes de même hauteur, et la
hauteur des deux autres. Le full montré à la gure 4 est un full de dames par les 10.
Figure 4 Un full de dames par les 10
4.
Couleur Une couleur est une main contenant cinq cartes de même couleur. Une couleur est
caractérisée par la commune des cinq cartes. La couleur montrée à la gure 5 est une couleur
en carreau.
Figure 5 Une couleur en carreau
Suite Une suite est une main contenant cinq cartes de hauteur consécutives. Une suite est
caractérisée par la hauteur de la carte de rang le plus élevé. La suite montrée à la gure 6 est
une suite au 6.
6. Brelan Un brelan est une main contenant trois cartes de même hauteur, les deux autres étant
de hauteurs diérentes. Un brelan est caractérisé par la hauteur de ces trois cartes. Le brelan
montré à la gure 7 est un brelan de 9.
7. Double paire Une double paire est une main contenant deux cartes même hauteur, et deux
autres cartes de même hauteur, la dernière carte étant d'une troisième hauteur. Une double
5.
7
Figure 6 Une suite au 6
Figure 7 Un brelan de 9
paire est caractérisée par la hauteur de chacune des paires. La double paire montrée à la gure
8 est une double paire de rois et de 2.
Figure 8 Une double paire de rois et de 2
8.
Paire
Une paire est une main contenant deux cartes même hauteur, les trois autres cartes
étant toutes de hauteurs diérentes. Une paire est caractérisée par la hauteur de ces deux
cartes de même hauteur. La paire montrée à la gure 9 est une paire de 5.
Question 15 Réalisez l'implémentation du module Combinaison.
8
Figure 9 Une paire de 5
9