TD 3 - Le type file std::queue 1 Jeu de cartes

Transcription

TD 3 - Le type file std::queue 1 Jeu de cartes
TD 3 - Le type file std::queue<T>
P12#, Algorithmes et utilisation de structures de données
25 mai 2007
Pour l’ensemble de cet énoncé, rédigez d’abord une version algorithmique des procédures ou fonctions
demandées à l’aide du pseudo-langage adopté en cours. Une fois l’algorithme correctement défini, programmez le en langage C++.
1
Jeu de cartes - la bataille
Le jeu de la bataille est certes très simpliste, mais il illustre parfaitement l’utilisation de files pour sa
résolution. Un jeu de cartes est distribué en deux paquets égaux en donnant alternativement une carte à
chacun des deux joueurs jusqu’à épuisement du tas. Chaque joueur pose alors devant lui la carte située sur
le dessus de son paquet. Le joueur dont la carte est la plus forte empoche les deux cartes en les replaçant
au dessous de son paquet. Si les deux cartes ont une valeur identique, il y a bataille. Dans ce cas, elles
restent sur la table et les deux joueurs continuent de poser des cartes tant qu’il y a bataille. Lorsque l’un
d’eux pose enfin une carte de valeur supérieure à celle de son adversaire, il empoche la totalité des cartes
qui ont été posées. Le joueur n’ayant plus de carte perd la partie.
1.1
Coupe et distribution
On choisit de représenter chaque carte par un entier dont la valeur en déterminera la force. Ainsi, les cartes
2 à 10 seront directement représentées par leur valeur numérique et les cartes V, D, R et As prendront
respectivement les valeurs 11, 12, 13 et 14. Un tas de cartes peut donc être représenté par une file d’entiers
dont la tête correspond toujours au haut du paquet.
Questions :
1. Dans la plupart des jeux de cartes, le jeu est coupé avant d’être distribué, c’est à dire qu’une partie
des cartes est prise au dessus du tas pour être replacée en dessous. Cette manipulation a pour
objectif d’éviter des triches éventuelles en modifiant la carte de dessous qui aurait pu être apperçue
par l’un des joueurs.
i. Proposez une fonction booléenne couper( jeu :file, t :entier ) : booléen qui va couper le tas jeu en retirant du dessus un paquet de t cartes. La coupe n’est considérée comme
valide que si les deux parties du tas contienne au moins trois cartes. La fonction doit renvoyer
vrai si la coupe est valide, et faux dans le cas contraire.
ii. Quelle remarque peut-on faire sur l’argument jeu de cette fonction ?
2. Proposez une procédure distribuer( j1 :file, j2 :file, jeu :file ) qui distribue le paquet
de cartes représenté par la file jeu en deux paquets j1 et j2 en respectant les règles de donne énoncées
précédemment.
1.2
Déroulement du jeu
On souhaite modéliser par une fonction le déroulement d’un tour de jeu. L’algorithme doit respecter les
règles de jeux énoncées précédemment. Il est important de remarquer que le nombre de cartes présentes
en même temps sur la table ne peut pas être déterminé à l’avance : il dépend du nombre de fois successives
où il y aura bataille durant ce tour. On représentera donc l’ensemble des cartes posées à l’aide d’une file
qui grandira à mesure que les joueurs poseront leurs cartes. Lorsqu’un joueur empoche le tas, cette file
est vidée pour être replacée sous son propre paquet.
Question :
1. Proposez une procédure empocher( j :file, p :file ) qui permet au joueur j d’empocher le
contenu de la file p des cartes posées.
1
2. Proposez une fonction booléenne tourDeJeu( j1 :file, j2 :file ) :booléen qui déroule un
tour de jeu à partir des paquets de cartes j1 et j2 de deux joueurs. Cette fonction renvoie vrai si
l’un des joueurs peut être déclaré vainqueur à l’issue de ce tour (c’est à dire que son adversaire n’a
plus de carte), et faux dans le cas contraire.
2

Documents pareils