:: Enseignements :: ESIPE :: E3INFO :: 2007-2008 :: Algorithmique - Slot 1 ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | PokIR |
But du projet
Vous devrez implémenter en C au moyen de listes chaînées diverses opérations
destinées à jouer au poker.
Représentation du jeu
On considère un jeu de 52 cartes, c'est-à-dire sans joker. Les valeurs des cartes sont, par ordre croissant:
2 3 4 5 6 7 8 9 10 valet dame roi as
Les couleurs (pique, coeur, carreau et trèfle) ont toutes la même valeur.
Votre première tâche sera de définir un type permettant de représenter une carte. Un jeu complet sera alors représenté
par une liste chaînée contenant les 52 cartes différentes.
Pour les entrées/sorties, le format d'une carte sera le suivant:
- valeur: 2 3 4 5 6 7 8 9 10 V D R A
- couleur: Piq Coe Car Tre
Par exemple, le roi de carreau sera noté
RCar.
Question 1
Écrire une fonction permettant de générer un jeu complet trié.
Mélange de Diaconis
On veut mélanger le jeu en appliquant la méthode casino. Pour cela, on coupe le jeu en deux et, tant qu'il reste des cartes
dans les 2 paquets, on tire au sort un paquet et on prend la carte supérieure de celui-ci. Dès qu'un paquet est vide, on prend
la totalité du paquet restant. En effectuant cette manoeuvre 7 fois, on obtient un excellent mélange, ce qui a été démontré
par M. Diaconis.
Question 2
Écrire une fonction
cut prenant un jeu
J (i.e. une liste de cartes), un jeu
J2
et un entier
n. La fonction doit ôter les
n premières cartes de
J et les placer
dans
J2.
J doit être modifié au retour de la fonction. La fonction renverra un code indiquant si
l'opération a pu être effectuée correctement ou non.
Question 3
Écrire une fonction
shuffle qui prend un jeu et qui le mélange suivant la méthode indiquée.
Valeur d'une main
On appelle
main une séquence de 5 cartes. On appelle
rang d'une main
la valeur de celle-ci. Pour 2 mains de même nature, par exemple 2 carrés, le rang sera celui de la valeur de
la carte qui apparaît 4 fois. Le rang d'un carré de 10 sera donc supérieur au rang d'un carré de 7. Il se peut
que dans certains cas, il y ait égalité, par exemple si l'on a 2 quinte flush dont les rangs sont identiques. Dans ce
cas, il n'y a pas de gagnant.
Les valeurs possibles pour une main sont les suivantes, par ordre décroissant de valeur:
-
quinte flush: 5 cartes qui se suivent de la même couleur. Le rang est celui de la plus haute carte.
-
carré: 4 cartes de même valeur et 1 carte quelconque. Le rang est celui du carré.
-
full: 1 brelan et 1 paire. Le rang étant celui du brelan, il ne peut pas y avoir plusieurs full de même rang.
-
couleur: 5 cartes non consécutives de la même couleur. Le rang est celui de la carte la plus forte,
ou de la seconde si les premières sont égales, etc.
-
suite: 5 cartes consécutives de couleurs différentes. Le rang est celui de la carte la plus forte.
-
brelan: 3 cartes de même valeur et 2 cartes quelconques. Le rang est celui du brelan.
-
double paire: 2 paires et 1 cartes quelconques. Le rang est celui de la paire la plus forte, ou de la seconde
en cas d'égalité. S'il y a toujours égalité, on regarde la 5ème carte.
-
paire: 2 cartes de même valeur et 3 cartes quelconques. Le rang est celui de la paire, ou de la carte isolée
la plus élevée.
-
rien
Question 4
On veut pouvoir associer à chaque main un entier représentant son score, de telle sorte qu'on puisse comparer deux mains
en comparant les entiers qui leur seront associés. Proposer un système
personnel de calcul du score qui prenne en compte les différents cas, en particulier
en cas d'égalité. Par exemple, si la main A contient deux 10, un roi, un 7 et un 3 et la main B un 4, deux 10, un valet et un 8, le score de A
doit être supérieur à celui de B, car la plus forte carte de A est un roi alors que celle de B est un valet.
Question 5
Écrire une fonction
score qui prend une main et qui retourne son plus fort score. Pourquoi le plus fort? Parce qu'une main forte
peut inclure une main plus faible (exemple: un brelan inclut des paires). Vous veillerez à tester
intelligemment les différentes
valeurs de main possibles (pensez aux tris possibles).
Conditions de rendu
Vous travaillerez en binômes. Vous n'oublierez pas de relire la
charte des projets.
Vous rendrez ensuite une archive nommée
login1-login2.zip
contenant les choses suivantes:
- un répertoire src contenant les sources du projet ainsi qu'un Makefile. Lorsqu'on
lance make, on doit obtenir un exécutable nommé pokIR. La cible clean
doit fonctionner correctement. Les sources doivent être propres, en anglais et commentées.
- un fichier doc.pdf contenant votre rapport qui devra décrire votre travail. En particulier,
vous décrirez avec soin et en la justifiant votre solution au problème du calcul du score.
Si votre projet ne fonctionne pas complètement, vous devrez en décrire les bugs.
L'exécutable
pokIR devra créer un nouveau jeu, le mélanger, en extraire 2 mains, les comparer
et indiquer celle qui gagne. Voici un exemple de ce qui pourrait se passer:
$>./pokIR
Main 1: 10Tre 5Coe DCoe 5Piq 5Car score=234
Main 2: RPiq RCoe 2Piq RTre RCar score=9045
La main 2 gagne.
Si l'on passe 5 cartes en paramètres à
pokIR, le programme doit afficher la valeur de la main:
$>./pokIR 10Tre 5Coe DCoe 5Piq 5Car
score=234
$>./pokIR 10Tri 5Coe DCoe 5Piq 5Car
Erreur: 10Tri n'est pas une carte valide
- Il est interdit d'utiliser du code externe: vous devrez tout coder vous-mêmes.
- Tout code commun à plusieurs projets vaudra ZERO pour tous les projets concernés.
Le projet est à rendre par mail à tous les enseignants de TD (i.e. Guillaume Blin, Sébastien Paumier et Philippe Finkel),
au plus tard le vendredi 21 décembre 2007 à 23h.
© Université de Marne-la-Vallée