TD10 : Game IO
L'objectif de ce TD est de réaliser le chargement et la sauvegarde du jeu à
partir d'un fichier. Pour ce faire, nous vous demandons d'étendre votre
bibliothèque game avec les fonctionnalités décrites dans
game_tools.h : game_load()
et game_save()
. Attention,
vous devez utiliser le fichier game_tools.h
fourni et vous ne devez en aucun
cas le modifier.
Format de Ficher
Voici le format de fichier texte (ASCII), que nous allons utiliser pour sauvegarder une instance du jeu :
<nb_rows> <nb_cols> <wrapping> <neigh>\n
<squares[0][0]><squares[0][1]>...<squares[0][nb_cols-1]>\n
<squares[1][0]><squares[1][1]>...<squares[1][nb_cols-1]>\n
...
<squares[nb_rows-1][0]><squares[nb_rows-1][1]>...<squares[nb_rows-1][nb_cols-1]>\n
Le caractère \n
est indiqué afin de clarifier les sauts de ligne dans le
format de fichier.
La première ligne décrit les paramètres du jeu, séparés par un espace :
<nb_rows>
- number of grid rows,<nb_cols>
- number of grid columns,<wrapping>
- wrapping option (0 forfalse
and 1 fortrue
),<neigh>
- neighborhood option (0 forFULL
, 1 forORTHO
, 2 forFULL_EXCLUDE
, and 3 forORTHO_EXCLUDE
).
Les lignes suivantes décrivent la grille des cases (ou square), stockées ligne
par ligne, sans espaces. En particulier, <squares[i][j]>
désigne la case
située à la ligne i & colonne j, stockée dans le fichier comme 2 caractères
ASCII, le premier pour la contrainte et le second pour la couleur :
- contrainte
UNCONSTRAINED
('-'
), - contrainte numérique (
'0'...'9'
), - couleur
EMPTY
('e'
), - couleur
WHITE
('w'
), - couleur
BLACK
('b'
),
Voici à titre d'exemple les fichiers du jeu par défaut avec sa solution :
Exercice
Le travail de ce rendu peut être découpé en plusieurs tâches de la manière suivante :
- Ajoutez à votre projet le fichier
game_tools.h
et créez un fichiergame_tools.c
avec des fonctions "vides". - Modifiez le fichier
CMakeLists.txt
de votre projet en intégrant dans lalibgame.a
les fonctions degame_tools.c
.
Une fois cette tâche réalisée, vous pouvez vous répartir les tâches suivantes qui sont assez indépendantes :
- Implémentez les deux fonctions dans
game_tools.c
en utilisant les fonctionsfprintf()
,fgetc()
oufscanf()
. - Implémentez des tests pour ces nouvelles fonctions.
- Modifiez votre exécutable
game_text
pour qu'il puisse prendre comme paramètre optionnel le nom d'un fichier contenant un jeu et qu'il charge ce jeu à la place du jeu par défaut. Si aucun argument n'est passé, alorsgame_text
doit se comporter comme avant en proposant le jeu par défaut. Par exemple :$ ./game_text default.txt
. - Ajoutez ensuite au programme
game_text
la saisie interactives <filename>
pour sauvegarder l'état courant du jeu dans un fichier<filename>
du répertoire courant.
Pour terminer, veuillez rendre votre travail sur Moodle.
Nota Bene :
- Pour le programme
game_text
, on se limitera à l'affichage correct pour des dimensions < 10. - Concernant la gestion des erreurs, nous n'imposons pas de politique
particulière. Votre code doit fonctionner pour des fichiers bien formaté. On
ne garantit rien dans le cas contraire. Si vous détectez une erreur, les
fonctions
game_load()
&game_save()
sont autorisés à terminer l'exécution du programme avecexit(EXIT_FAILURE)
ouassert()
! - Afin de copier un fichier (ou un répertoire) dans votre
build
, vous pouvez ajouter les commandes ci-dessous dans le fichierCMakeLists.txt
. Cela permettra à vos programmes de tests d'y accéder plus simplement.
# file copy
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/yourFile DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
# folder copy
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/yourFolder/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/yourFolder/)