git
et de make
.Implémenter un “jeu du serpent” (voir fig. 2.1) avec les règles suivantes:
a
: déplacement vers la gauche.s
: déplacement vers le bas.d
: déplacement vers la droite.w
: déplacement vers le haut.N
2, de
nourriture qui apparaît à des endroits aléatoires de la carte toutes les
M
3 secondes.escape
arrête le jeu.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.
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.
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).
Votre file d’attente doit être implémentée à l’aide d’une liste chaînée comme vue en classe.
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
):
gfx_getpixel()
, retourne la “couleur” du pixel à une
position x
, y
donnée en argument.gfx_putpixel()
, donne une “couleur” donnée en argument
au pixel se trouvant à une position x
, y
donnée.gfx_keypressed()
retourne le code de la touche pressée
par la joueuse4.usleep()
(se trouvant dans unistd.h
) met
le programme en pause pendant un certain nombre de microsecondes passé
en argument.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_MONOTONIC, &start);
clock_gettime// Algorithme de mise à jour d'une frame
(CLOCK_MONOTONIC, &finish);
clock_gettimefloat elapsed = (finish.tv_sec - start.tv_sec);
("elapsed seconds = %f\n", elapsed); printf
Vous pouvez aussi utiliser les flèches.↩︎
Un argument de votre programme.↩︎
Autre argument de votre programme.↩︎
Tous les codes clavier se trouvent à l’adresse https://wiki.libsdl.org/SDL_Keycode.↩︎