:: Enseignements :: ESIPE :: E3INFO :: 2007-2008 :: Algorithmique - Slot 1 ::
[LOGO]

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:

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:


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
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.