Black Jack - Julien VILLEMEJANE
Transcription
Black Jack - Julien VILLEMEJANE
Black Jack Dept GEII II1 Année universitaire 2012-2013 J. VILLEMEJANE - [email protected] Principe D’une manière simplifiée, on peut considérer une partie de black-jack de la manière suivante : – La banque (ordinateur) et le joueur reçoivent chacun deux cartes, face visible. – Le principe est d’obtenir, avec ses cartes, le score de 21 points, sans les dépasser. La valeur des cartes est la suivante : – cartes de 2 à 10 : valeur nominale de la carte ; – cartes figure (valet, dame, roi) : 10 points ; – cartes as : 1 ou 11 points au choix. – Un «Black-Jack» est obtenu en faisant 21 points avec deux cartes. – Le joueur peut décider de demander autant de cartes supplémentaires qu’il le souhaite. S’il dépasse 21 points, il perd ! ! – Quand le joueur ne veut plus de cartes supplémentaires, l’ordinateur peut en demander. – Celui qui a le plus de points, sans dépasser 21 points, remporte la partie. Le but de ce TP est de simuler le déroulement d’une partie. On commencera par décrire une carte, un jeu de cartes et enfin la partie de cartes. Cartes Les cartes possèdent une couleur (coeur, pique, carreau, trèfle) et une valeur (2 à 10, valet, dame, roi, as). Q.1 Déclarer un nouveau type de donnée t_carte qui est une structure composée : – d’un entier indiquant la valeur de la carte (1 pour as, 2 pour 2, ... 11 pour valet, 12 pour dame et 13 pour roi) ; – d’un entier indiquant la couleur (1 pour coeur, 2 pour pique, 3 pour carreau et 4 pour trèfle). Q.2 Ecrire une fonction acceptant une carte en paramètre d’entrée et qui affiche la carte de la façon suivante : – un espace ; – la valeur de la carte sur 2 caractères ("_A" pour l’as, "_R" pour le roi, ...) ; – la couleur de la carte. Pour cela on utilisera des caractères spécifiques : – coeur : ’\3’ (♥) ; – pique : ’\6’ (♠) ; – carreau : ’\4’ (♦) ; – trèfle : ’\5’ (♣) ; – un espace. La fonction affichera par exemple : "__2♠_", "__R♥_", "_10♣_". Q.3 Tester cette fonction dans un programme principal en créant 4 cartes différentes : 2♠, R♥, 10♣ et A♦. Jeu de cartes On va créer un jeu de cartes basé sur la structure précédente. Q.4 Déclarer un nouveau type de données t_jeu qui est un tableau de 52 cartes (typedef t_carte t_jeu[52];). Q.5 Ecrire une fonction qui accepte un jeu de cartes en paramètre et qui le remplit (avec les 52 cartes possibles). L’ordre de remplissage importe peu. Q.6 Ecrire une fonction qui accepte un jeu de cartes en paramètre et l’affiche (affichage à la suite des 52 cartes). Pour mélanger les cartes, on se propose de permuter un grand nombre de fois les cartes 2 à 2 de manière aléatoire. Pour obtenir un numéro de carte aléatoire, on pourra utiliser la fonction rand() définie dans stdlib.h. Cette fonction renvoie un entier long aléatoire compris entre 0 et RAND_MAX (231 − 1). Cette fonction doit etre initialisée auparavant (dans la première partie du programme principal) par la commande : srand(time(NULL));. La fonction time() est définie dans time.h. IUT Créteil - GEII - II1 Black Jack Q.7 Ecrire une fonction qui accepte un jeu de cartes et un entier (nombre de permutations) en paramètre, et qui permute autant de fois que demandé deux cartes tirées au hasard dans le jeu. Q.8 Tester vos différentes fonctions (dans le programme principal) en : – créant un jeu de cartes ; – le remplissant ; – l’affichant ; – le mélangeant ; – l’affichant à nouveau pour vérifier que le jeu est bien mélangé. Début de partie Une partie de Black-Jack peut être modélisée par une pioche, la main de l’ordinateur et la main du joueur. La pioche (qu’on appellera pioche) est représentée par un jeu de cartes et la position de la prochaine carte à distribuer (qu’on appellera pos_pioche - de type entier). Les mains de l’ordinateur et du joueur sont aussi représentées par un jeu de cartes mais vide au départ (qu’on appellera ordi et joueur) et le nombre de cartes qu’elles contiennent (nbc_ordi et nbc_joueur). Distribuer une carte de la pioche vers la main du joueur (ou de l’ordinateur) revient donc à copier la carte d’indice pos_pioche du tableau pioche dans la carte d’indice nbc_joueur du tableau joueur et à incrémenter les deux indices de position. Q.9 Ecrire une fonction qui accepte 4 arguments : – un jeu de cartes pour la pioche ; – un entier pour la position de la pioche ; – un jeu de cartes pour une des mains ; – un entier pour le nombre de carte de cette main ; et qui distribue une carte de la pioche dans la main. Q.10 Ecrire une fonction qui affiche les cartes contenues dans une main. Cette fonction prendra comme paramètres un jeu de cartes et un entier. Q.11 Tester ces deux fonctions (dans un programme principal) en : – créant une pioche, en la remplissant et en la mélangeant (voir partie jeu de cartes) ; – affichant la pioche ; – distribuant successivement une carte au joueur, une carte à l’ordinateur, puis de nouveau une carte au joueur et une à l’ordinateur (début d’une partie) ; – affichant la main des deux joueurs (précédés de leur nom). Calcul des scores Q.12 Ecrire une fonction qui calcule la meilleure valeur d’une main donnée. Il s’agit donc d’additionner les valeurs de toutes les cartes d’une main. (Attention à la valeur des as qui peuvent valoir 1 ou 11 points). Q.13 Tester cette fonction sur les mains des deux joueurs. –2– IUT Créteil - GEII - II1 Black Jack Partie complète (Bonus) Il faut maintenant distribuer au joueur autant de cartes qu’il le désire. Pour cela, on propose l’algorithme suivant : Distribution d’une carte pour l’ordinateur Distribution d’une carte pour le joueur Distribution d’une carte pour l’ordinateur Distribution d’une carte pour le joueur Affichage des deux mains Demander si le joueur veut une nouvelle carte TANT QUE reponse = oui (ou O) ET valeur du jeu < 21 FAIRE distribution d’une carte pour le joueur SI valeur du jeu < 21 ALORS demander si le joueur veut une nouvelle carte FIN SI FIN FAIRE Q.B1 Ecrire le programme correspondant. Stratégie de l’ordinateur (Bonus) Pour l’instant, seul le joueur peut piocher de nouvelles cartes. Il reste donc à présent à écrire la «stratégie» de l’ordinateur. En réalité, dans les casino, le croupier (la banque) joue avec une règle simple résumée par «La banque tire à 16 et reste à 17». Ainsi tant que le jeu de l’ordinateur est inférieur à 16, il reprend une carte. Dès qu’il dépasse 17 (inclus), il s’arrête. Q.B2 Ecrire la stratégie de jeu de l’ordinateur à la suite du programme précédent. Indiquer le vainqueur. Tout ajout de fonctions supplémentaires ou améliorations à l’application finale est le bienvenu... –3–