• Aucun résultat trouvé

Jeu de poker : Comment faire faire .1 Structures de données

? Quelle marche à suivre proposeriez vous ?

2. Simulation du jeu de poker

2.4 Jeu de poker : Comment faire faire .1 Structures de données

2.4.1.1 Constantes

?

Quelles sont, à votre avis, les constantes importantes intervenant dans la description de la tâche évoquée ?

- NL, le nombre de lancers demandés, égal à 1000. - ND, le nombre de dés lancés à chaque essai, égal à 5.

On pourrait être tenté d'y adjoindre une troisième constante représentant le nombre de faces d'un dé. Je ne le ferai pas ici. En effet, si l'on peut admettre que la description de la tâche abordée ici nécessite la précision du nombre total de lancers et du nombre de dés utilisés à chaque lancer, constantes descriptives dont les valeurs pourraient être différentes de ce qu'elles sont, en revanche le

nombre de faces d'un dé ne peut être que ce qu'il est, soit 6, et il est inutile dès lors d'insister sur une constante sur la valeur de laquelle tout le monde doit s'accorder.

Ce choix est bien entendu discutable et rien n'empêche d'adjoindre aux constantes inhérentes à la description du problème une troisième constante NF (pour nombre de faces du dé). Mais jamais NF ne pourra être différent de 6 !

L'important, on l'aura compris, c'est de ne pas omettre cette étape de réflexion à propos des constantes importantes intervenant dans la description de la tâche concernée.

On pourra cependant, puisque Pascal le permet, mettre clairement en évidence que les entiers de 1 à 6 sont particulièrement importants dans le problème traité en définissant un type Faces constitué des seuls entiers entre 1 et 6. (type Faces=1..6).

2.4.1.2 Tableaux

?

Comment représenteriez-vous les résultats du quintuple lancer d'un dé ?

La définition d'un premier tableau permettant de rendre compte de la liste et des traits représentant le résultat d'un quintuple lancer est immédiate : il nous faut un tableau à 6 composantes entières. Comme nous souhaitons que la composante d'indice N (= le tiroir n° N) contienne le nombre de dés (sur les cinq) qui montrent la face N, nous choisirons tout naturellement comme indices (= comme étiquettes des tiroirs) les entiers de 1 à 6 (ceux que nous avons baptisés comme étant du type Faces). Il ne reste plus qu'à nommer ce tableau : nous l'appellerons tout naturellement

Lancer et nous pouvons l'imaginer comme :

Lancer 2 1 0 1 0 1 1 2 3 4 5 6 nombre de dés montrant 1 nombre de dés montrant 2 nombre de dés montrant 3 nombre de dés montrant 4 nombre de dés montrant 5 nombre de dés montrant 6 à chaque quintuple lancer

Le problème est plus délicat en ce qui concerne le second tableau à définir. La solution retenue sera d'ailleurs tributaire d'un apport d'informations nouvelles à propos des possibilités du langage Pascal. L'idée dont il faut arriver à rendre compte est celle d'une configuration :

paire double-paire brelan full carré poker

II I II I

On devine que l'idéal serait un tableau d'entiers, la première composante (= le premier tiroir) contenant le nombre de paires, la seconde le nombre de doubles-paires, etc.

On sent fort bien également que si l'on souhaite rester proche des termes mêmes du problème, les étiquettes retenues devraient être : "paire", "double-paire", "brelan", "full", "carré" et "poker" et non 1, 2, 3, 4, 5, 6, qui seraient des notations qui n'ont rien à faire avec les informations telles que nous les nommons.

Il nous faudrait donc un tableau

ResultatsObtenus

paire double brelan full carre poker

Nous savons aussi que jusqu'ici les informations susceptibles de fournir les étiquettes d'un tableau doivent être de type scalaire : entier, caractère, booléen ou d'un type intervalle basé sur ces derniers. Il est en tout cas interdit que des chaînes de caractères, comme 'paire', 'double', 'brelan', ... puissent servir d'étiquettes.

Nous pourrions bien entendu coder les termes "paire", "double", "brelan", "full", "carré", "poker", par des caractères mnémoniques 'p', 'd', 'b', 'f', 'c', 'P'. Malheureusement, ces caractères dont la suite ne constitue pas un intervalle du type caractère ne peuvent pas non plus servir à l'étiquetage. C'est ici qu'une des possibilités offertes par Pascal va nous faciliter l'écriture

Il nous est en effet loisible de définir un type d'informations manipulables en énumérant les

constantes (qui doivent forcément - comme toujours en informatique - être en nombre fini)

constituant ce nouveau type.

Ici par exemple, nous définirons un type énuméré :

ResultatsPossibles = (rien, paire, double, brelan, full, carre, poker) en Pascal :

type ResultatsPossibles = (rien, paire, double, brelan, full, carre, poker)

Je donnerai, à la suite du programme Pascal, quelques contraintes auxquelles sera soumise cette possibilité de type énuméré. Dès à présent, il est bon de signaler que un type énuméré est un type scalaire :

- L'ordre d'énumération est important; c'est dans cet ordre que les éléments constituant, par exemple, les étiquettes d'un tableau seront retenus.

- On pourra également écrire des boucles Pour... dont le compteur associé sera d'un type énuméré; ici aussi, on se contentera de citer la première et la dernière des valeurs prises par le compteur : l'ordre d'énumération fournira la succession des valeurs prises par ce dernier lors de la boucle.

- En d'autres termes, deux fonctions centrales permettant à un type de données de fournir les étiquettes d'un tableau ou encore un compteur de boucle Pour... existent pour un type énuméré : ce sont pred( ) et succ( ) qui caractérisent les types scalaires. Ajoutons encore que la fonction ord( ) existe aussi, le premier élément de l'énumération ayant le rang 0, le second le rang 1,etc.. (Cf. [Armici 86 A]., page 112).

Sans en dire davantage, nous devinons que cette possibilité constitue une aubaine pour le problème actuellement traité : après avoir défini le type énuméré ResultatsPossibles (comme ci-dessus) il nous reste seulement à demander un tableau :

ResultatsObtenus

paire double brelan full carre poker

L'expression en Pascal sera simplement :

ResultatsObtenus : array[paire..poker] of integer

Avec ces deux tableaux, nous venons de déterminer la structure que prendront les données. Il nous est à présent possible de décrire l'algorithme qui les fera utiliser.

2.4.2 Jeu de Poker : marche à suivre de premier niveau

AVERTIR

INITIALISER_RESULTATS

Pour Compteur allant de 1 à NL Compteur entier entre 1 et NL

FAIRE_UN_LANCER AFFICHER_LANCER

EVALUER_RESULTAT Resultat de type ResultatsPossibles

Si Resultat <> rien alors

ResultatsObtenus[Resultat] succ(ResultatsObtenus[Resultat]) AFFICHER_RESULTATS

Bien entendu, chacune des actions complexes qui y apparaît doit être soigneusement décrite (mais cela, nous commençons à en prendre l'habitude).

INITIALISER_RESULTATS Placer 0 dans toutes les composantes du tableau

Resultats0btenus. ResultatsObtenus

(cf. ci-dessus) avec

Avant INITIALISER_RESULTATS Après INITIALISER_RESULTATS - ResultatsObtenus tableau d'entiers

d'indices paire à poker (intervalle du type énuméré ResultatsPossibles).

- Les composantes d'indices variant entre paire et poker de ResultatsObtenus sont toutes nulles.

FAIRE_UN_LANCER Effectuer un quintuple lancer d'un dé et placer dans

le tiroir n° i de Lancer le nombre de fois que la face i est apparue.

Lancer (cf. plus haut) avec

Avant FAIRE_UN_LANCER Après FAIRE_UN_LANCER

- Lancer, tableau d'entiers indexé par les

entiers entre 1 et 6 (donc étiquettes de type Faces)

- Le ième tiroir de Lancer contient le nombre de fois que la face i est apparue sur les ND dés lancés

AFFICHER_LANCER

Compteur

de type entier

Lancer

tableau d'entiers indexé par les entiers entre 1 et 6 (donc étiquettes de type Faces)

Afficher dans l'ordre croissant des faces obtenues le résultat du quintuple lancer tel qu'il est représenté dans Lancer. Chaque affichage (qui comportera donc une suite ordonnée de ND nombres entre 1 et 6) sera séparé du suivant par deux espaces. De plus, sur base de la valeur de Compteur (qui donne le nombre de lancers déjà effectués), passer à la ligne tous les 10 lancers affichés et interrompre (jusqu'à ce que l'utilisateur frappe Entrée) quand 20 lignes sont affichées (ou après le dernier lancer).

avec

Avant AFFICHER_LANCER Après AFFICHER_LANCER - Compteur est un entier compris entre 1 et

NL

- Le ième tiroir de Lancer (tableau d'entiers indexé par les entiers entre 1 et 6 (donc étiquettes de type Faces)) contient le nombre de fois que la face i est apparue sur les ND dés lancés au quintuple lancer précédent

- Compteur n'a pas changé - Lancer n'a pas changé.

EVALUER_RESULTAT

Lancer

tableau d'entiers indexé par les entiers entre 1 et 6

Sur base du résultat précédent du lancer des ND dés, contenu dans Lancer, évaluer s'il s'agit d'une paire, d'une double paire, d'un brelan, etc. et placer la valeur détectée dans Resultat.

Resultat de type Resultats Possibles

avec

Avant EVALUER_RESULTAT Après EVALUER_RESULTAT - Le ième tiroir de Lancer contient le nombre

de fois que la face i est apparue sur les ND dés lancés au quintuple lancer précédent

- Lancer n'a pas changé

- Resultat contient l'une des valeurs : rien, paire, double, brelan, full, carre ou poker

AFFICHER_RESULTATS

ResultatsObtenus

(cf. plus haut)

Sur base des composantes de ResultatsObtenus, elle fait afficher le nombre de paires, de double paires, ... selon les spécifications de la page 95

avec

Avant AFFICHER_RESULTATS Après AFFICHER_RESULTATS - Les composantes d'indice paire, double,

brelan,... de Resultats-Obtenus (tableau d'entiers d'indices paire à poker (intervalle du type énuméré ResultatsPossibles)) contiennent le nombre de paires, de doubles paires, de brelans, ...

Rien n'est modifié.

Cette première analyse nous permet dès à présent d'écrire la partie principale du programme Pascal :