IUT Littoral 2019 - 2020
Info 2A C++
Projet – T´etris
Ce projet est `a faire en binˆome et `a remettre le lundi 6 janvier 2010 durant le cours.
1. Pr´esentation
T´etris est un jeu de type puzzle o`u les pi`eces sont dest´etraminos(un assemblage de 4 carr´es
´
el´ementaires). Les t´etraminos, tir´es al´eatoirement, tombent 1 `a 1 dans le puits.
Le joueur peut d´eplacer le t´etramino tombant vers la gauche ou vers la droite avec les fl`eches correspondantes du clavier ou lui faire faire une rotation avec la fl`eche du haut. S’il le souhaite, il peut accel´erer la chute du t´etramino avec la fl`eche du bas. Une fois que le t´etramino ne peut plus tomber, le joueur peut le d´eplacer lat´eralement ou lui faire faire des rotations avant que celui-ci ne soit d´efinitivement verrouill´e. Si une ligne compl`ete du puits est recouverte par des morceaux de t´etraminos, elle est retir´ee, le joueur marque des points et tout ce qui est au-dessus de cette ligne dans le puits tombe.
La partie est perdue lorsque un t´etramino est verrouill´e compl`etement au-dessus de la ligne de vie. Plus le joueur compl`ete de lignes, plus son score, son niveau et la vitesse de chute augmentent.
Le but de ce TP est de coder un jeu t´etris fonctionnel. Un squelette de code contenant la gestion de l’interface graphique, la gestion des ´ev`enements, les diff´erentes structures et la trame du code que vous aurez `a ´ecrire vous est fourni sur mon site au LMPA.
T´el´echarger et d´ecompresser le squelette du projet correspondant `a votre OS.
2. Structures
Notre version du t´etris sera bas´ee sur 3 structures : Puits,TetraminoetTetris. Celles-ci sont d´efinies et partiellement initialis´ees dans le fichiertetris.h.
Il y a 7 formes diff´erentes de t´etramino, num´erot´ees de 1 `a 7. Chaque t´etramino est compos´e d’un carr´e central (dessiner en noir sur le tableau suivant) et de 3 carr´es p´eriph´eriques. Le tableau suivant illustre les 7 formes de t´etramino ainsi que leurs rotations possibles. Le nom des t´etraminos n’est pas utilis´e dans le programme. La structureTetramino est alors compos´ee de
— forme : la forme du t´etramino (de 1 `a 7) ;
— rotation : pour l’angle de rotation, multiple de 90◦ (initialis´e `a 0) ;
— x,y : les coordonn´ees du centre du t´etramino (initialis´e `a (0,0)) ;
— x1,y1,x2,y2,x3,y3 : les coordonn´ees relatives (au centre) des 3 autres carr´es.
2
forme nom rotation=0 rotation=1 rotation=2 rotation=3
1 I
2 J
3 L
4 O
5 S
6 T
7 Z
La structurePuitsrepr´esente un ensemble de carr´ees et est compos´ee de
— hauteur : hauteur totale du puits, en nombre de carr´es (initialis´e `a 28) ;
— largeur : largeur totale du puits, en nombre de carr´es (initialis´e `a10) ;
— grille: les valeurs des carr´es du puits.
Le carr´e `a la position (x, y) de la grille vaut 0 s’il est vide ou vaut le num´ero de la forme du t´etramino ayant d´epos´e le carr´e. Pour acc´eder aux valeurs de la grille on a les fonctions :
— lire position(Puits p,int x,int y)retourne la valeur `a la position(x,y)du puitsp.
— ecrire position(Puits p,int x,int y,int v) assigne la valeurv`a la position(x,y) du puits p.
La structureTetrisest compos´ee de
— couleursun tableau de 8 couleurs. Celle d’indice 0 est noire, celles d’indicei >0 corres- pond au t´etramino de forme i;
— puits : le puits du t´etris ;
— tetramino courant: le t´etramino en train de tomber ;
— prochain tetramino : le prochain t´etramino `a tomber ;
— dx,dy: la position du point en bas `a gauche pour le dessin du puits (initialis´es `a(10,10)) ;
— taille carre : la taille des carr´es `a dessiner (initialis´e `a 20) ;
— ligne vie : position de la ligne de vie dans le puits (initialis´e `a 22) ;
— lignes terminees : nombre de lignes termin´ees (initialis´e `a0) ;
— niveau: niveau du joueur, de 1 `a 20 ;
— score : score du joueur (initialis´e `a 0) ;
— game over : vaut truesi le jeu est perdu (initialis´e `a false).
3. Ce qu’il faut faire
Exercice 1. Modifier la fonction affichage tetris(Tetris& tetris) pour que celle-ci af- fiche le contour du puitstetris.puits en blanc et la ligne de vie en gris `a l’aide des fonctions dessine ligne(int x1,int y1,int x2,int y2)etdefini couleur dessin(Couleur c). Les variables blancetgris de type Couleursont d´ej`a d´efinies.
Exercice 2. Modifier la fonction initialisation tetramino(Tetramino& t,int f)qui ini- tialise le t´etraminot`a la forme d’indice fpour une rotation de0.
3
Exercice 3. Terminer la fonction affichage tetramino(Tetris& tetris, Tetramino& t) permettant d’afficher un t´etramino dans le puits. Vous pourrez tester vos fonctions de cr´eation et d’affichage de t´etramino en d´e-commentant la partie correspondante dansaffichage tetris.
N’oubliez pas de re-commenter le code-test avant de poursuivre.
Exercice 4. La structureTetriscomporte 2 ´el´ements de typeTetramino:tetramino courant etprochain tetramino. Le premier est le t´etramino tombant dans le puits et le deuxi`eme est le prochain `a tomber. Lors de la cr´eation d’un nouveau t´etramino on assigneprochain tetramino
`
a tetramino courant. On modifie ensuite la position(x,y) de tetramino courantpour qu’il soit affich´e au milieu en haut du puits. On cr´ee alors un nouveau t´etramino de forme al´eatoire dansprochain tetramino et on modifie sa position(x,y)pour qu’il soit affich´e en-dessous du mot Suivant. C’est le but de la fonctionnouveau tetramino(Tetris& tetris).
Exercice 5. Modifier la fonction deplace tetramino(Tetramino& t,int mx,int my) pour qu’elle retourne une copie du t´etraminottranslat´e de (mx,my).
Exercice 6. Modifier la fonctionteste position(Tetris& tetris,int x,int y)pour qu’elle retourne true si la case `a la position (x,y) est une case vide du puits tetris.puits, et non une case occup´ee ou `a l’ext´erieur du puits.
Exercice 7. Modifier la fonction teste tetramino(Tetris& tetris,Tetramino& t) qui re- tourne truesi le t´etraminotest enti`erement `a l’int´erieur du puits tetris.puitset si sa place est libre.
Exercice 8. Modifier la fonction evenement deplacement(Tetris& tetris,int direction) qui d´eplace le t´etraminotetris.tetramino courantd’une case vers la gauche (direction=-1) ou vers la droite (direction=1) si possible. On utilisera les fonctions deplace tetramino et teste tetramino.
Exercice 9. Modifier la fonctionevenement chute(Tetris& tetris)qui fait tomber le t´etramino tetris.tetramino courantd’une case si possible. La fonction retourneratrue si la chute a pu ˆ
etre r´ealis´ee etfalse sinon.
Exercice 10. Modifier la fonction tourne tetramino(Tetramino& t) pour qu’elle retourne une copie du t´etraminotapr`es rotation de 90◦ dans le sens trigonom´etrique (voir tableau). Les t´etraminosIetOseront trait´es s´epar´ement. Pour les autres on pourra utiliser la forme matricielle d’une rotation d’angle α dans le rep`ere standard :
cos(α) −sin(α) sin(α) cos(α)
Exercice 11. Modifier la fonction evenement rotation(Tetris& tetris) qui fait tourner le t´etraminotetris.tetramino courant si possible.
Exercice 12. Modifier la fonctionverouillage tetramino(Tetris& tetris) qui verouille le t´etramino tetris.tetramino courant dans la grille : les carr´es de la grille recouverts par le t´etramino prennent la valeur de la forme de celui-ci.
4
Exercice 13. Modifier la fonction verouillage tetramino(Tetris& tetris) qui teste si le t´etraminotetris.tetramino courantest enti`erement au-dessus de la ligne de vie. On commen- cera par d´eterminer la plus petite ordonn´ee des carr´es du t´etramino, qu’on stockera dansymin.
Siymin est plus grand que tetris.ligne vie on arme tetris.game over`a true et on quitte la fonction. Sinon on cr´ee un nouveau t´etramino `a l’aide de la fonction nouveau tetramino.
Exercice 14. Modifier la fonction verouillage tetramino(Tetris& tetris) pour qu’elle supprime et d´etermine le nombre de lignes finies, qu’on stockera dansnombre lignes finies.
Exercice 15. Modifier la fonction verouillage tetramino(Tetris& tetris) pour qu’elle mette `a jourtetris.lignes termineescomptant le nombre de lignes termin´ees depuis le d´ebut de la partie,tetris.niveaupour le niveau du joueur ettetris.scorepour le score du joueur.
Le niveau du joueur augmente de 1si le joueur a termin´e plus de 10×niveaulignes, le niveau maximal ´etant de 20. L’augmentation du score d´epend du nombre nombre lignes finies de lignes finies en verouillant le dernier t´etramino (entre 0 et 4), de la hauteur du t´etraminoymin et du niveaudu joueur suivant par la formule suivante :
ajout score= (tetris.niveau+ymin)×multiple o`u multipled´epend de nombre lignes finies:
nombre lignes finies 0 1 2 3 4 multiple 0 100 300 500 800