#include #include #include #include #define HAUTEUR 40 #define LARGEUR 60 #define CYCLE 100000L #define TAILLE_CASE 20 /* Enumeration des différentes directions possibles */ enum Direction { UP = 2, DOWN = 3, LEFT = 0, RIGHT = 1 }; /* Structure pour stocker les coordonnées des segments du serpent */ typedef struct { int posx, posy; } SnakePoint; /* Fonction pour concevoir le graphique */ void graphique() { InitialiserGraphique(); CreerFenetre(10, 10, 1240, 940); EcrireTexte(500, 400, "Le jeu va commencer !", 2); sleep(1); EffacerEcran(CouleurParComposante(0, 0, 0)); } void AffichageBasique() { ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); RemplirRectangle(10, 10, 1200, 820); } void AfficheTemps(int minute, int seconde) { char temps[6]; snprintf(temps, 6, "%02d:%02d", minute, seconde); ChoisirCouleurDessin(CouleurParComposante(0, 0, 0)); RemplirRectangle(20, 870, 70, 40); ChoisirCouleurDessin(CouleurParComposante(255, 255, 255)); EcrireTexte(20, 900, temps, 2); } /* Fonction pour afficher le serpent */ void serpent(SnakePoint *snake, int taille) { for (int i = 0; i < taille; i++) { couleur s = CouleurParComposante(255, 255, 0); ChoisirCouleurDessin(s); RemplirRectangle(snake[i].posx * TAILLE_CASE, snake[i].posy * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } /* Fonction pour générer les pommes */ void genererPommes(SnakePoint *pommes) { for (int i = 0; i < 5; i++) { pommes[i].posx = rand() % LARGEUR; pommes[i].posy = rand() % HAUTEUR; couleur p = CouleurParComposante(255, 0, 0); ChoisirCouleurDessin(p); RemplirRectangle(pommes[i].posx * TAILLE_CASE, pommes[i].posy * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } /* Fonction pour gérer le mouvement de la tête du serpent */ void mouvementTete(SnakePoint *snake, int *taille, int *dir) { /* Déplace la tête en fonction de la direction */ if (ToucheEnAttente()) { int touche = Touche(); switch (touche) { case XK_Left: *dir = LEFT; break; case XK_Right: *dir = RIGHT; break; case XK_Up: *dir = UP; break; case XK_Down: *dir = DOWN; break; } /* Déplace la tête en fonction de la direction */ if (*dir == LEFT) { snake[0].posx -= 1; } else if (*dir == RIGHT) { snake[0].posx += 1; } else if (*dir == UP) { snake[0].posy -= 1; } else if (*dir == DOWN) { snake[0].posy += 1; } } } /* Fonction pour gérer le mouvement du corps du serpent */ void mouvementCorps(SnakePoint *snake, int taille) { /* Déplace le corps du serpent en suivant la tête */ for (int i = taille - 1; i > 0; i--) { snake[i] = snake[i - 1]; } } /* Fonction pour gérer les collisions */ void gererCollisions(SnakePoint *snake, int *taille, SnakePoint *pommes) { /* Vérifie la collision avec la pomme */ for (int i = 0; i < 5; i++) { if (snake[0].posx == pommes[i].posx && snake[0].posy == pommes[i].posy) { /* Augmente la taille du serpent */ *taille += 1; /* Déplace la pomme hors de l'écran (elle disparaît) */ pommes[i].posx = -1; pommes[i].posy = -1; } /* Vérifie la collision avec la paroi intérieure du rectangle */ if (snake[0].posx <= 0 || snake[0].posx >= LARGEUR - 1 || snake[0].posy <= 0 || snake[0].posy >= HAUTEUR - 1) { return -1; // Collision avec la paroi } return 0; // Pas de collision } } int main() { /* Initialisation du jeu */ graphique(); SnakePoint snake[LARGEUR * HAUTEUR]; SnakePoint pommes[5]; int taille = 1; int dir; srand(time(NULL)); /* Position initiale du serpent au milieu du tableau */ snake[0].posx = LARGEUR / 2; snake[0].posy = HAUTEUR / 2; graphique(); AffichageBasique(); genererPommes(pommes); unsigned long suivant = Microsecondes() + CYCLE; int temps[2] = {0, 0}, seconde_actuel, old_seconde; while (1) { /* Calcul du temps */ if (Microsecondes() > suivant) { suivant = Microsecondes() + CYCLE; seconde_actuel = (suivant / 1000000) % 10; if (seconde_actuel != old_seconde) { old_seconde = seconde_actuel; if ((temps[1] + 1) == 60) { temps[0]++; temps[1] = 0; } else { temps[1]++; } /* Affichage du temps */ AfficheTemps(temps[0], temps[1]); } /* Déplacement du serpent */ mouvementTete(snake, &taille, &dir); mouvementCorps(snake, taille); gererCollisions(snake, &taille, pommes); serpent(snake, taille); /* Génération de nouvelles pommes si le serpent en a mangé une */ for (int i = 0; i < 5; i++) { if (pommes[i].posx == -1 && pommes[i].posy == -1) { pommes[i].posx = rand() % LARGEUR; pommes[i].posy = rand() % HAUTEUR; couleur p = CouleurParComposante(255, 0, 0); ChoisirCouleurDessin(p); RemplirRectangle(pommes[i].posx * TAILLE_CASE, pommes[i].posy * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } } } FermerGraphique(); return EXIT_SUCCESS; }