TD02 : Jouer en Mode Texte

Objectifs : Dans le contexte du projet, nous vous proposons de programmer une version du jeu en mode texte, c'est-à-dire jouable dans un terminal Linux.

Voici une petite démonstration animée du jeu Mosaic en mode texte :

demo

Dans ce TD, nous vous fournissons l'archive src.zip, qui contient les fichiers suivants :

  • game.h : l'interface des fonctions principales du jeu ;
  • game_aux.h : l'interface des fonctions auxiliaires ;
  • libgame.a : la bibliothèque game (au format binaire, compilé sous Linux x86_64) qui fournit une implémentation des fonctions de game.h et game_aux.h.

Et vous devez produire les fichiers suivants :

  • game_text.c : un programme exécutable (disposant de la fonction main) qui permet à un utilisateur de jouer interactivement en mode texte ;
  • Makefile : un fichier qui permet de compiler l'ensemble du projet.

Pour vous aider à effectuer cet exercice, vous disposez de la documentation en ligne du projet, générée avec l'outil Doxygen à partir des fichiers précédents.

Exercice 1 : prise en main de l'API

Pour commencer, nous vous proposons d'implémenter une version simplifiée du programme game_text, avec un fichier Makefile qui compile le tout.

Consignes :

Du respect de ces consignes dépend le bon fonctionnement des scripts d'évaluation dans VPL !

  • Avec VS Code, créez les nouveaux fichiers demandés (Ctrl+N) et sauvegardez-les (Ctrl+S). Attention, tous les fichiers doivent se trouver à plat dans le même répertoire.
  • Dans game_text.c, ajoutez la fonction int main(void) { /* ...*/ } minimale, qui renvoie EXIT_SUCCESS (défini dans <stdlib.h>).
  • Puis, ajoutez le fichier Makefile qui va compiler tout ça, et plus précisément va générer l'exécutable game_text à partir du fichier game_text.o (compilé à partir de game_text.c) et de la bibliothèque game (fichier libgame.a). Ne pas sauter l'étape qui consiste à générer le fichier intermédiaire game_text.o.
  • Votre programme game_text doit être compilé avec la variable CFLAGS=-std=c99 -Wall sans générer d'erreurs ou de warnings.
  • Votre fichier Makefile doit également disposer d'une cible clean (qui ne devra pas supprimer la bibliothèque).
  • En vous aidant de la documentation, complétez votre programme pour qu'il instancie le jeu par défaut (game_default()) dans une variable game g, et joue la couleur WHITE dans la case (0,0), puis affiche le jeu dans le terminal, avant de terminer en supprimant le jeu instancié.
  • Déposez les 2 fichiers produits dans l'activité Rendu Initial de Moodle. Attention, il s'agit d'un rendu individuel et tout plagiat sera sanctionné !

Exercice 2 : implémentation de game_text

En repartant du code précédent, il s'agit maintenant d'implémenter le fichier game_text.c, en vous basant sur les fonctions de game.h et game_aux.h (fournies dans la bibliothèque). Consultez la documentation en ligne pour bien comprendre le fonctionnement des fonctions de la bibliothèque game. Votre programme game_text devra permettre à un utilisateur de jouer au jeu par défaut conformément à l'algorithme suivant :

Tant que la partie n'est pas gagnée :
  Afficher la grille
  Afficher la liste des erreurs
  Lire un caractère <c> sur l'entrée standard (au format " %c")
  Si <c> == 'h' alors
    Afficher l'aide
  Sinon Si <c> == 'r' alors
    Reinitialiser la grille (restart)
  Sinon Si <c> =='q' alors
    Quitter
  Sinon Si <c> == 'w' ou 'b' ou 'e' alors :
    Lire deux entiers <i> <j> sur l'entrée standard (au format "%d %d")
    Si le coup est légal alors :
      Si <c> == 'w', jouer la case (<i>,<j>) en blanc ()
      Sinon Si <c> == 'b', jouer la case (<i>,<j>) en noir
      Sinon Si <c> == 'e', vider la case (<i>,<j>) (empty)
      Fin Si
    Fin Si
  Fin si
Fin tant que
Afficher la grille

Consignes :

Du respect de ces consignes dépend le bon fonctionnement des scripts d'évaluation dans VPL !

  • Il faut respecter strictement le nom des fichiers que votre Makefile doit produire, et en particulier game_text.
  • Il ne faut en aucun cas modifier les fichiers fournis comme game.h ou game_aux.h.
  • Le programme devra obligatoirement afficher le mot congratulation ou shame à la fin de son exécution, selon que le jeu est gagné ou perdu (le joueur abandonne en tapant 'q'). Notez que dans ces deux cas, le programme game_text doit se terminer en renvoyant EXIT_SUCCESS. (Faire echo $? pour afficher le code de retour d'un programme que l'on vient d'exécuter dans un terminal bash.)
  • Pour réaliser un tel programme, il vous faut lire des caractères saisis au clavier sur l'entrée standard du terminal. Dans ce cas précis, il est demandé d'utiliser la fonction scanf(), afin de ne pas être sensible aux multiples espaces ou au retour à la ligne (cf. Annexes).
  • Par ailleurs, votre programme doit fonctionner avec la commande en ligne suivante : echo "w 0 0 q" | ./game_text. Cette commande permet de rediriger la saisie w 0 0 q sur l'entrée standard du programme game_text, ce qui simule un utilisateur qui taperait au clavier ces caractères.
  • Dans le même esprit, vous pouvez jouer tous les coups gagnants du jeu par défaut avec la commande en ligne suivante : cat moves.txt | ./game_text.
  • Déposez les 2 fichiers produits dans l'activité Rendu Final sur Moodle. Attention, il s'agit d'un rendu individuel et tout plagiat sera sanctionné !