Cours de programmation séquentielle

Le jeu du serpent

Buts

Énoncé

Le jeu du serpent, tribute to nokia 3210.
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) soit une structure de donnée du genre

struct coord {
    int x, y;
};

Le serpent est 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 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 (voir la fonction uspleep() par exemple).

Remarques

Implémentation d’une file d’attente

Votre file d’attente doit être implémentée à l’aide d’une liste chaînée comme vue en classe.

Affichage graphique

Vous trouverez la librairie GFX avec un main exemple sur ce lien. Attention: n’oubliez pas qu’il faut faire l’édition des liens avec le flag: -lSDL2 sinon vous aurez une erreur.

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.↩︎