Cours de programmation séquentielle

Le jeu du serpent

Buts

Énoncé

Figure 2.1: Le jeu du serpent, tribute to nokia 3210.

Implémenter un “jeu du serpent” (voir fig. 2.1) avec les règles suivantes:

L’interaction avec la joueuse (affichage graphique, touches du clavier) se fait avec la librairie SDL2. Pour l’affichage, il est recommandé d’avoir des épaisseurs de un pixel pour tout ces objets (cela simplifie grandement l’implémentation).

Bien entendu vous devez utiliser git et make pour la gestion et la compilation de votre projet.

Cahier des charges

Chaque segment du serpent est en fait un pixel: il est représenté par sa position (ses coordonnées x, y qui sont des entiers). Le serpent est en fait une file d’attente contenant la position des pixels qu’il occupe. Lorsque le serpent se déplace, il faut retirer l’élément du devant de la file, et insérer le nouvel élément à l’arrière de la file: la tête du serpent est l’arrière de la file, et la queue du serpent est l’avant de la file.

Sans intervention de la joueuse, le serpent ne changera pas de direction de déplacement. Il faut donc stocker cette information. La nourriture ne se déplace elle jamais, et est uniquement déterminée par sa position sur l’écran.

Afin de déterminer si le serpent meurt ou mange de la nourriture, il est recommandé d’utiliser le tableau de pixels utilisé pour l’affichage. Vous pouvez définir un type énuméré avec quatre variantes (empty, snake, food, et wall par exemple) correspondant à des couleurs COLOR_BLACK, COLOR_WHITE, … Ainsi en récupérant la valeur des pixels vous pouvez savoir quel type d’élément se trouve à une position donnée.

Attention

Pour que le jeu soit “jouable”, il faut éviter de mettre à jour son état trop souvent (le serpent bougerait trop vite). Il est judicieux de n’afficher qu’un certain nombre de frames par seconde (ou en d’autres terme fixer le temps qu’il faut entre l’affichage de chaque frame, tf). Pour ce faire, il faut mesurer le temps nécessaire à l’affichage d’une frame (voir plus bas), puis faire attendre votre programme le temps nécessaire pour qu’on attende tf avant l’affichage de la frame suivante.

Avant de commencer

Cette partie est particulièrement importante. Ce travail pratique est assez peu “guidé”, il faut donc bien réfléchir avant de commencer à implémenter quelque chose.

  1. Mettez-vous par groupes de 5.
  2. Faites un schéma, une liste, etc avec les différentes fonctions et structures de données que vous allez utiliser.
  3. Écrivez les headers contenant les structures de données et les signatures des fonctions.
  4. Écrivez un Makefile qui compile votre ébauche de projet (même s’il y a rien dans les fichier à part un main vide).
  5. Allez vous pouvez vous y mettre!

Remarques

Affichage graphique

Vous trouverez sur Cyberlearn des fichiers gfx.h et gfx.c qui ne sont pas exactement ceux des travaux pratiques précédents (il faut donc les re-télécharger).

Un certain nombre des fonctions suivantes pourraient vous être utiles (elles ne sont pas toutes dans gfx.h/c):

Mesure du temps d’affichage d’une frame

La mesure du temps d’exécution d’une partie de votre programme se fait grâce à la librairie <time.h>. Un exemple d’utilisation est donné par les lignes suivantes

struct timespec start, finish;
clock_gettime(CLOCK_MONOTONIC, &start);
// Algorithme de mise à jour d'une frame
clock_gettime(CLOCK_MONOTONIC, &finish);
float elapsed = (finish.tv_sec - start.tv_sec);
printf("elapsed seconds = %f\n", elapsed);

  1. Vous pouvez aussi utiliser les flèches.↩︎

  2. Un argument de votre programme.↩︎

  3. Autre argument de votre programme.↩︎

  4. Tous les codes clavier se trouvent à l’adresse https://wiki.libsdl.org/SDL_Keycode.↩︎