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