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 for false and 1 for true),
  • <neigh> - neighborhood option (0 for FULL, 1 for ORTHO, 2 for FULL_EXCLUDE, and 3 for ORTHO_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 fichier game_tools.c avec des fonctions "vides".
  • Modifiez le fichier CMakeLists.txt de votre projet en intégrant dans la libgame.a les fonctions de game_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 fonctions fprintf(), fgetc() ou fscanf().
  • 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é, alors game_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 interactive s <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 avec exit(EXIT_FAILURE) ou assert() !
  • Afin de copier un fichier (ou un répertoire) dans votre build, vous pouvez ajouter les commandes ci-dessous dans le fichier CMakeLists.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/)