2
ENSIN2U1 Programmation - TP3 Université d’Aix-Marseille - Site de St Charles A. Abramé, V. Emiya, B. Favre, H. Kadri Version du 2 février 2015 Ce sujet est assez long, les questions avec une étoile (*) correspondent à celle à traiter pendant la séance 3. Les autres sont facultatives pour la séance 3 et seront à traiter par la suite pour faire le jeu 2048. Vous travaillerez dans le fichier tp3_2048.c à télécharger sur Ametice. La grille du jeu 2048 est modélisée par un tableau d’entiers à deux dimensions, dont les cases contiennent la valeur présente ou 0 pour une case vide. La taille de la grille sera fixée une fois pour toutes à l’aide des constantes NB_ROWS et NB_COLS. Le code doit pouvoir fonctionner avec des grilles rectangulaires de n’importe quelles dimensions. On prendra une grille rectangulaire, par exemple 5 × 4, pour tester le code. Exercice 1 (Fonctions d’affichage*). Adaptez les fonctions vue dans le TP1 pour définir la fonction void print_line(int line_length) qui affiche une ligne avec line_length caractères ’-’ et un retour à la ligne puis la fonction void print_grid(int grid[NB_ROWS][NB_COLS]) qui affiche une grille de jeu grid. En utilisant "%4d" comme format dans printf, vous pouvez afficher un entier complété automa- tiquement avec des espaces pour obtenir un affichage avec toujours 4 caractères (comparez cette option avec "%d"). Chaque case sera de taille 6 caractères : 4 caractères pour le nombre entourés de deux espaces. Voilà un exemple de résultat : ----------------------------- | | 2| | 2| ----------------------------- | 16 | | | 4| ----------------------------- | 2| | 256 | | ----------------------------- | | 2| | 1024 | ----------------------------- | | 4| | | ----------------------------- Exercice 2 (Initialisation*). Écrivez une fonction void init_grid(int grid[NB_ROWS][NB_COLS]) qui initialise à 0 tous les éléments de la grille passée en argument. Exercice 3 (Test d’une grille pleine). Écrivez une fonction int is_full_grid(int grid[NB_ROWS][NB_COLS]) qui renvoie 1 si la grille grid est pleine et 0 sinon. 1

TP3

Embed Size (px)

DESCRIPTION

Informatique TP

Citation preview

Page 1: TP3

ENSIN2U1 Programmation - TP3

Université d’Aix-Marseille - Site de St CharlesA. Abramé, V. Emiya, B. Favre, H. Kadri

Version du 2 février 2015

Ce sujet est assez long, les questions avec une étoile (*) correspondent à celle à traiterpendant la séance 3. Les autres sont facultatives pour la séance 3 et seront à traiter par la suitepour faire le jeu 2048.

Vous travaillerez dans le fichier tp3_2048.c à télécharger sur Ametice. La grille du jeu 2048est modélisée par un tableau d’entiers à deux dimensions, dont les cases contiennent la valeurprésente ou 0 pour une case vide. La taille de la grille sera fixée une fois pour toutes à l’aide desconstantes NB_ROWS et NB_COLS. Le code doit pouvoir fonctionner avec des grilles rectangulairesde n’importe quelles dimensions. On prendra une grille rectangulaire, par exemple 5 × 4, pourtester le code.

Exercice 1 (Fonctions d’affichage*). Adaptez les fonctions vue dans le TP1pour définir la fonction void print_line(int line_length) – qui affiche uneligne avec line_length caractères ’-’ et un retour à la ligne – puis la fonctionvoid print_grid(int grid[NB_ROWS][NB_COLS]) qui affiche une grille de jeu grid. Enutilisant "%4d" comme format dans printf, vous pouvez afficher un entier complété automa-tiquement avec des espaces pour obtenir un affichage avec toujours 4 caractères (comparezcette option avec "%d"). Chaque case sera de taille 6 caractères : 4 caractères pour le nombreentourés de deux espaces. Voilà un exemple de résultat :

-----------------------------| | 2 | | 2 |-----------------------------| 16 | | | 4 |-----------------------------| 2 | | 256 | |-----------------------------| | 2 | | 1024 |-----------------------------| | 4 | | |-----------------------------

Exercice 2 (Initialisation*). Écrivez une fonction

void init_grid(int grid[NB_ROWS][NB_COLS])

qui initialise à 0 tous les éléments de la grille passée en argument.

Exercice 3 (Test d’une grille pleine). Écrivez une fonction

int is_full_grid(int grid[NB_ROWS][NB_COLS])

qui renvoie 1 si la grille grid est pleine et 0 sinon.

1

Page 2: TP3

Exercice 4 (Tirage d’une case vide aléatoire dans la grille*). On souhaite maintenant créer unefonction qui choisit aléatoirement une case vide dans la grille. Les coordonnées (ligne,colonne)de cette case seront stockés dans un tableau de deux entier int pos[2]/ La fonction renvoie 0si l’opération a réussi et -1 si elle a échoué (grille pleine). Cela nécessite une fonction auxiliaire.

1. Reprenez la fonction count_empty_positions du TD.2. En vous inspirant de la fonction find_zero vue en TD, écrivez la fonction

int find_rand_empty_position(int grid[NB_ROWS][NB_COLS], int pos[2])

qui choisit aléatoirement une position vide dans la grille grid de la façon suivante :— elle compte tout d’abord le nombre nb0 de cases vides ;— elle tire ensuite un entier aléatoire k entre 0 et nb0-1 ;— elle cherche ensuite la k-ième case vide de la grille, et stocke ses coordonnées dans

pos[0] (indice de la ligne) et [1] (indice de la colonne) ;— elle renvoie 0 ou -1 comme spécifié plus haut.

Exercice 5 (Génération d’un nouveau nombre dans la grille*). Après avoir repris la fonctiongenerate_2_4_with_proba vue à la séance 1, écrivez une fonctionint generate_new_item(int grid[NB_ROWS][NB_COLS], double p)

qui insère un 2 avec une probabilité p ou un 4 avec une probabilité 1-p dans une case vide degrid choisie aléatoirement ; elle renvoie 0 en cas de succès ou -1 en cas d’échec (grille pleine).Exercice 6 (Tassage dans une direction). On souhaite écrire les fonctions de tassage pour lejeu 2048 (cf. TD1). On remarque que pour tasser dans un tableau à deux dimensions, il suffitde tasser chaque ligne ou chaque colonne comme s’il s’agissait d’un tableau à une dimension.On commencera donc par écrire des fonctions de tassage pour un tableau à une dimension.

1. En reprenant le TP1, écrivez dans un premier temps la fonction qui tasse à gauche untableau à une dimension void tasse_a_gauche(int t[], int n).

2. Écrivez la fonction qui tasse à gauche chaque ligne dans un tableau à deux dimensions :void pack_left(int grid[NB_ROWS][NB_COLS])

3. Écrivez la fonction void tasse_a_droite(int t[], int n) qui tasse à droite un tableauà une dimension.

4. Écrivez les fonctions pour tasser à droite, en haut et en bas un tableau 2D :void pack_right(int grid[NB_ROWS][NB_COLS])void pack_up(int grid[NB_ROWS][NB_COLS])void pack_down(int grid[NB_ROWS][NB_COLS])

Exercice 7 (Fusion dans une direction). On souhaite écrire les fonctions de fusion des casespour le jeu 2048 (cf. TD1). On remarque que comme pour le tassage, l’opération de fusion dansun tableau à deux dimensions repose sur la fusion de chaque ligne ou chaque colonne commes’il s’agissait d’un tableau à une dimension. On commencera donc par écrire des fonctions defusion sur des tableaux à une dimension.

1. En reprenant le TD1, écrivez dans un premier temps la fonction de fusion à gauche dansun tableau à une dimension : void fusionne_a_gauche(int t[], int n).

2. Écrivez la fonction de fusion à gauche de chaque ligne dans un tableau à deux dimensions :void fusion_left(int grid[NB_ROWS][NB_COLS])

3. Écrivez la fonction void fusionne_a_droite(int t[], int n) de fusion à droite dansun tableau à une dimension de taille n.

4. Écrivez les fonctions pour la fusion à droite (fusion_right), en haut (fusion_up) et enbas (fusion_down) dans un tableau 2D.

2