Exercice sur la programmation en C

Résolu/Fermé
Anonyme7555 Messages postés 6 Date d'inscription mercredi 22 juin 2016 Statut Membre Dernière intervention 7 février 2019 - 22 juin 2016 à 22:47
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 24 juin 2016 à 11:23
Bonjour,


Bonjour,

Dice Poker Ce jeu est une variation du Poker qui utilise des d´es au lieu de cartes. Vous
allez maintenant impl´ementer un programme permettant de jouer `a ce jeu contre l’ordinateur.
Le jeu consiste en plusieurs manches. Dans chaque manche, l’ordinateur et l’humain lancent 5 d´es.
Certaines combinaisons de valeur de d´es permettent de l’emporter sur d’autres. La liste suivante ´enum`ere
les combinaisons de la plus “puissante” `a la moins “puissante” :
(7) Full : les cinq d´es ont la mˆeme valeur ;
(6) Quatre d’un coup : 4 des 5 d´es ont la mˆeme valeur, et le dernier est diff´erent ;
(5) House : 3 d´es ont la mˆeme valeur, tandis que les deux autre ont une autre valeur, identique ;
(4) Straight : Cinq valeurs cons´ecutives (mˆeme dans le d´esordre) ;
(3) Trois d’un coup : 3 d´es ont la mˆeme valeur, tandis que les deux autres sont diff´erents ;
(2) Deux paires : Deux paires de d´es ont la mˆeme valeur ;
(1) Paire : 2 d´es ont la mˆeme valeur, et les autres sont diff´erents ;
(0) Rien : tous les d´es sont diff´erents.
. Question 1. Observez le code du programme dice poker.c fourni. N’h´esitez pas `a consulter la page
man des fonctions utilis´ees que vous ne connaissez pas. Compilez le et ex´ecutez le plusieurs fois pour
v´erifier son bon fonctionnement.
. Question 2. Ajoutez une fonction int manche() `a ce programme, qui cr´ee
deux tableaux de 5 entiers tir´es al´eatoirement, et les affiche sous la forme suivante :
1 Moi : 3 5 4 4 5
2 Vous: 3 3 6 1 2
Vous utiliserez une fonction void affiche(char *nom, int main[5]) pour afficher chacune des lignes.
. Question 3. R´ealisez une fonction int identifie(int main[5]) permettant de reconnaˆıtre le type
de main obtenu. Par exemple, si toutes les valeurs sont diff´erentes, elle renvera la valeur 0, tandis qu’elle
renvera 7 si toutes les valeurs sont identiques (cf. le nombre entre parenth`eses au d´ebut de chaque item
de la liste des combinaisons).
Pour cela, il faudra calculer la fr´equence de chaque valeur de la main (dans un tableau temporaire).
Ainsi, pour la main {3,5,4,4,5} la table de fr´equence est {0,0,1,2,2,0} (il y a z´ero fois la valeur 1, z´ero fois
la valeur 2, une fois la valeur 3, et ainsi de suite). Le cas du “Straight” se traite `a part.
TP5 : Organisation de la m´emoire, Utilisation de tableaux
. Question 4. Modifiez la fonction affiche() pour qu’elle affiche le type de main obtenu par chacun.
. Question 5. Modifiez manche() pour qu’elle affiche le gagnant
de la manche et renvoi -1 si l’ordinateur gagne, 0 sur match nul
et 1 si l’humain gagne.
1 Moi : 3 5 4 4 5 (deux paires)
2 Vous: 3 3 6 1 2 (paire)
3 JE GAGNE !
. Question 6. Modifiez la fonction principale pour jouer 5 manches, compter les points acquis `a chaque
manche et afficher le r´esultat final.
. Question 7. Modifiez votre programme pour autoriser les jeux avec un nombre arbitraire de d´es,
sp´ecifi´e en ligne de commande. La fonction d’´evaluation doit naturellement ˆetre modifi´ee (on peut laisser
les Straight de cot´e dans un premier temps). Il faut pour cela consulter non seulement la table des
fr´equences de valeur, mais ´egalement la table des fr´equences de la table des fr´equences.
Par exemple, {4,6,2,4,3,6,6,6,3} a la table de fr´equence suivante : {0,1,2,2,0,5} et la table de fr´equence
des fr´equences suivante : {2,1,2,0,0,1,0,0,0,0}. Il y a deux valeurs qui ne sont pas repr´esent´ees (le 1 et le
5), une valeur unique (le 2), deux paires (3 et 4), et un groupe de cinq valeurs identiques (les 6).
Valeur 1 2 3 4 5 6
Fr´equence 0 1 2 2 0 5
(a) Table des fr´equences
Fr´equence 0 1 2 3 4 5 6 7 8 9
Nombre de valeurs 2 1 2 0 0 1 0 0 0 0
ayant cette fr´equence
(b) Table des fr´equences de fr´equence
Un full d’une main de 9 d´es a la table de fr´equence des fr´equences suivantes : {5,0,0,0,0,0,0,0,0,1} (5
valeurs ne sont pas repr´esent´ees du tout tandis qu’une valeur est repr´esent´ee neuf fois).
On peut consid´erer cette table comme les coefficients d’un polynˆome, dont il convient d’ignorer les
deux premiers termes. La main du premier exemple correspond ainsi `a 2 × X2 + X5
(on ne retient que
la pr´esence de deux paires et d’un groupe de cinq valeurs identiques) tandis que le full est X9
.
Nous voila prêts `a modifier la fonction affiche() pour donner une forme textuelle de la combinaison
obtenue. On utilisera les abr´eviations grecques ou latines pour les valeurs sup´erieures `a 4. La main
pr´ec´edente est “2 paires, 1 penta” tandis que X4 + X6
est “1 carr´e, 1 hexa” et le full “1 nona”.
Pour la valeur de la combinaison, on ´evaluera le polynˆome pour X = 2 (attention, 4 paires sont plus
fortes qu’un triple) ou X = 10 (attention aux d´ebordements de capacit´e, on peut obtenir des valeurs de
main n´egatives si on s’y prend mal).
. Question 8. Faites en sorte de permettre `a l’utilisateur d’indiquer les d´es qu’il souhaite relancer
(comme on redemande une carte au Poker) en indiquant 5 bool´eens apr`es chaque lanc´e. Dans l’exemple
suivant, les caract`eres soulign´es sont tap´es par l’utilisateur qui demande `a relancer les 3 derniers d´es.
1 Moi : 3 5 4 4 5 (deux paires)
2 Vous: 3 3 6 1 2 (paire)
3 Que voulez vous faire? 0 0 1 1 1
4 Vous: 3 3 3 4 4 (house)
5 VOUS GAGNEZ !
. Question 9. Limitez les cas d’´egalit´e en faisant en sorte qu’entre deux Fulls, le gagnant soit celui
dont les d´es marquent la plus grande valeur. Faites de mˆeme pour les combinaisons “N d’un coup”. Pour
d´epartager deux “House”, on regarde d’abord la valeur des triplettes avant de regarder la valeur des paires
si les triplettes sont ´equivalentes. On d´epartage les “Deux paires” de fa¸con similaire. Un “Six Straight”
(2-6) est plus fort qu’un “Five Straight” (1-5).
. Question 10. (mini projet) Dotez l’ordinateur d’une strat´egie pour lui aussi relancer certain de ses
d´es. Cette d´ecision sera prise par le biais d’une fonction int *rejoue(int *main, int taille main) .
. Question 11. Impl´ementez plusieurs fonctions de ce type (tout rejouer, rien rejouer, rejouer un d´e
une fois sur deux, ainsi que des “vraies” strat´egies), et faites jouer les AI les unes contre les autres sur
un grand nombre de parties pour d´eterminer la meilleure approche. Faites jouer votre AI contre celle de
votre voisin


Voilà mon exercice et je ne sais pas du tout comment faire étant donné que je suis très nulle en programmation, pouvez vous m'aider svp ? :)

A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
22 juin 2016 à 23:31
Bonjour,

Si vous êtes nulle, pourquoi ne pas commencer par un tuto pour vous perfectionner https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c ? Cela vous sera plus bénéfique.
À partir de là, vous aurez les bases pour commencer à faire l'exercice. Vous bloquerez certainement à un endroit ou à un autre, mais on sera là à ce moment pour vous aider.
1
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
24 juin 2016 à 11:23
Salut fiddy ;)
En plus des bases il faut également quelques notions d'algorithmes un des ingrédients essentiels
à bientôt
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
23 juin 2016 à 10:21
Bonjour,
Commence par la question 1, tu peux indiquer ce que tu comprends et ce que tu ne ne comprends dans l'exemple qui t'a été fourni.
Sert toi de ce que tu as paris en cours et n'hésite pas à aussi lire des tutos, pour le reste, demande.
0