TD n° 11 : Simulation du jeu de cartes de la bataille
Transcription
TD n° 11 : Simulation du jeu de cartes de la bataille
TD de programmation structurée : 1ère année 2016-2017 TD n° 11 : Simulation du jeu de cartes de la bataille Buts Durée : Types abstrait : 1 séance On distribue les 52 cartes une par une aux 2 joueurs qui les rassemblent en paquet, face cachée, devant eux. On appellera ces deux paquets les jeux des joueurs. Chacun tire la carte du dessus de son jeu et la pose sur la table, face découverte, à coté de son jeu. Celui qui a la carte la plus forte ramasse les autres cartes. Le roi est la plus forte carte, puis vient la dame, le valet, le 10, 9,...3,2,As (On peut aussi jouer avec l’ordre As, Roi, Dame,...3,2.) Lorsque deux joueurs posent deux cartes de même valeur, il y a "bataille". Lorsqu'il y a bataille, les joueurs tirent la carte suivante et la posent, face cachée, sur la carte précédente, à coté du jeu. Puis ils tirent une deuxième carte qu'ils posent cette fois-ci face découverte. C’est cette dernière carte découverte qui départagera les joueurs. Si ces cartes sont aussi identiques, il y a à nouveau bataille et on tire à nouveau une carte que l’on pose face cachée sur les précédentes, puis on tire une nouvelle carte que l’on pose face découverte sur les précédentes : la plus forte remporte toutes les cartes posées, et s’il y a à nouveau bataille, on recommence... Le gagnant est celui qui remporte toutes les cartes. Lorsqu’un des deux joueurs n’a pas assez de cartes pour continuer une bataille en cours (c’est la notion de famine), ce joueur a perdu. Pour simuler le jeu, les structures de données utilisées sont des files et des piles. Le jeu de chaque joueur peut être représenté par une file. Au début du tour, le joueur prend la carte du dessus et s’il gagne, il prend les cartes jouées et les ajouter par dessous (enfiler). Les paquets de bataille sont des piles, car on ajoute toujours sur le sommet du paquet et on regarde et compare la carte du sommet. Le jeu se termine quand les suites sont complètes (on a gagné ou lorsque le jeu est bloqué (on a perdu). Travail à réaliser : 1. Faire un programme qui simule le jeu de la bataille en utilisant les fonctions réalisées précédemment et la fonction de distribution donnée. Attention, cette dernière utilise une fonction File enfiler(CARTE, File) que vous devez avoir écrite. 2. Ajouter la gestion de la famine, lorqu’un joueur n’a plus aucune carte et perd la partie 3. Gérer un affichage graphique des différents éléments du jeu (talon, colonnes, suites) Version graphique Des fonctions permettant d’afficher des files et des piles de cartes sous forme graphique sont disponibles. Pour les files, ces fonctions utilisent une représentation des files par liste circulaire. La structure de données représentant une carte contient alors son rang, sa couleur, si elle est face cachée ou non et une nouvelle structure "im" de type ICONE qui contient une image 32 bits ainsi que la dimension de cette image. typedef struct { unsigned int** data; int lig, col; } ICONE; typedef struct { int rang; char visible; char couleur; ICONE im;} CARTE; Voici les fonctions utiles ; • Création des cartes, mélange de ces cartes avec leurs images et distribution des cartes dans les files *ajeu1 et *ajeu2, avec nbcarte pour chaque couleur (nbcarte<14) et en utilisant alea pour démarrer le tirage aléatoire. Pour debugger, utiliser une valeur non nulle pour alea. Pour obtenir des tirages différents, utiliser ensuite des valeurs différentes à chaque exécution. int distribution(File* ajeu1, File* ajeu2, int alea, int nbcarte) Attention : cette fonction utilise la fonction File enfiler(ELEMENT e, File f) que vous devez avoir écrite et tester lors du tp précédent. • affiche une carte à une position : void affichegr(CARTE* e, SDL_Surface* f1,int x, int y) • efface une carte à une position : void effacegr(CARTE* e, SDL_Surface* f1,int x, int y) • Affiche une pile de carte à une position donnée, en décalant les cartes de "decalage" pixels à chaque fois. decalage peut être positif ou négatif. On tient compte des faces cachées. void graphe_pile_d(Pile p, SDL_Surface* f1, int x, int y, int decalage) • Efface une pile de carte à une position donnée, en décalant les cartes de "decalage" pixels à chaque fois. void effacegr_pile_d(Pile p, SDL_Surface* f1, int x, int y, int decalage) • Affiche une file de carte à une position donnée, en décalant les cartes de "decalage" pixels à chaque fois. decalage peut être positif ou négatif. On tient compte des faces cachées. void graphe_file_d(File L, SDL_Surface* f1, int x, int y, int decalage) • Efface une file de carte à une position donnée, en décalant les cartes de "decalage" pixels à chaque fois. void effacegr_file_d(File L, SDL_Surface* f1, int x, int y, int decalage) Voici un exemple qui crée une file de cartes mélangées et faces cachées et une pile de cartes faces visibles (fichier exemple.c) #include <SDL/SDL.h> #include <SDL_phelma.h> #define DECALAGE (20) #include "file.h" #include "pile.h" #include "carte.h" #define DIMX 400 #define DIMY 550 int main(int argc, char** argv) { int i; 2/3 // le talon est une file de cartes File talon=creer_file(); // p est une pile de cartes Pile p=creer_pile(); // Une carte CARTE c; // La fenetre graphique SDL_Surface* f1=NULL; /* On crée et mélange toutes les cartes (ici 5*4), avec leur representation sous forme d'image dans la file jeu*/ i=melanger(&talon,1,5); if (i==0) { puts("Il manque les fichiers graphiques"); exit(1); } /* On cree une fenetre graphique */ f1=newfenetregraphique(DIMX,DIMY); /* On affiche le talon complet en x=50, y=10 : Les cartes sont affichees avec un decalage verticale de -20 pixels */ graphe_file_d(talon,f1,50,10,-20); /* On cree une pile avec les premieres cartes du talon */ for (i=0; i<10; i++) { c=defiler(&talon); c.visible=1 ; p=empiler(c,p); } /* On affiche la pile en x=200, y=100; Les cartes sont affichees avec un decalage vertical de -20 pixels */ graphe_pile_d(p,f1,200,100,-20); /* On affiche une carte isolee visible prise sur le talon en 50,300 */ c=defiler(&talon); c.visible=1 ; affichegr(&c,f1,50,300); } 3/3