#include #include #include #include // Ajout de l'en-tête pour usleep #include #define HAUTEUR 40 #define LARGEUR 60 #define TAILLE_CASE 20 #define ESPACE_HAUT 35 #define ESPACE_BAS 85 #define NOMBRE_POMMES 5 #define CYCLE 100000L typedef struct { int x; int y; } Segment; /* Fonction pour attendre un certain nombre de millisecondes */ void Attendre(unsigned int millisecondes) { usleep(millisecondes * 1000); } /* 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)); } /* Fonction pour afficher le serpent */ void afficherSerpent(Segment serpent[], int taille) { int i; couleur couleurSerpent = CouleurParNom("yellow"); ChoisirCouleurDessin(couleurSerpent); for (i = 0; i < taille; i++) { RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } } /* Fonction pour générer les pommes */ void genererPommes(Segment pommes[]) { for (int i = 0; i < NOMBRE_POMMES; i++) { pommes[i].x = rand() % LARGEUR * TAILLE_CASE; pommes[i].y = rand() % HAUTEUR * TAILLE_CASE; ChoisirCouleurDessin(CouleurParComposante(255, 0, 0)); RemplirRectangle(pommes[i].x, pommes[i].y, TAILLE_CASE, TAILLE_CASE); } } /* Fonction pour déplacer le serpent */ void deplacerSerpent(int longueurSerpent, Segment serpent[], int *direction) { int i; couleur c; couleur v; couleur s; c = CouleurParComposante(0, 0, 0); s = CouleurParComposante(255, 255, 0); v = CouleurParComposante(111, 255, 94); for (i = 0; i < longueurSerpent; i++) { ChoisirCouleurDessin(v); RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } for (i = longueurSerpent - 1; i > 0; i--) { serpent[i] = serpent[i - 1]; } if (ToucheEnAttente()) { int touche = Touche(); switch (touche) { case XK_Right: *direction = 1; break; case XK_Left: *direction = 2; break; case XK_Up: *direction = 3; break; case XK_Down: *direction = 4; break; } } /* Déplace la tête en fonction de la direction */ if (*direction == 1) { serpent[0].x += TAILLE_CASE; } else if (*direction == 2) { serpent[0].x -= TAILLE_CASE; } else if (*direction == 3) { serpent[0].y -= TAILLE_CASE; } else if (*direction == 4) { serpent[0].y += TAILLE_CASE; } for (i = 0; i < longueurSerpent; i++) { ChoisirCouleurDessin(s); RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } Attendre(100); } /* Fonction pour gérer les collisions */ int gererCollisions(Segment snake[], int *taille, Segment pommes[], int *aMangerPomme) { /* Vérifie la collision avec la pomme */ for (int i = 0; i < NOMBRE_POMMES; i++) { if (snake[0].x == pommes[i].x && snake[0].y == pommes[i].y) { /* Augmente la taille du serpent et génère une nouvelle pomme */ (*taille)++; *aMangerPomme = 1; genererPommes(pommes); return 1; /* Le serpent a mangé une pomme */ } } /* Vérifie la collision avec les parois */ if (snake[0].x <= 0 || snake[0].x >= LARGEUR * TAILLE_CASE || snake[0].y <= 0 || snake[0].y >= HAUTEUR * TAILLE_CASE) { return -1; /* Collision avec la paroi */ } /* Vérifie la collision avec le corps du serpent */ for (int i = 1; i < *taille; i++) { if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) { return -1; /* Collision avec le corps du serpent */ } } return 0; /* Pas de collision */ } /* Fonction pour afficher un fond basique */ void AffichageBasique() { ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); RemplirRectangle(10, 10, TAILLE_CASE * LARGEUR, TAILLE_CASE * LARGEUR); } int main() { int touche, perdu = 0, direction = 1, longueurSerpent = 10; Segment serpent[LARGEUR * HAUTEUR]; Segment pommes[NOMBRE_POMMES]; couleur c = CouleurParComposante(0, 0, 0); couleur v = CouleurParComposante(111, 255, 94); couleur s = CouleurParComposante(255, 255, 0); srand(time(NULL)); Graphique(); InitialiserGraphique(); CreerFenetre(10, 10, 1200, 820); EffacerEcran(c); AffichageBasique(); genererPommes(pommes); afficherSerpent(serpent, longueurSerpent); while (perdu != -1) { deplacerSerpent(longueurSerpent, serpent, &direction); perdu = gererCollisions(serpent, &longueurSerpent, pommes, &direction); if (perdu == -1) { printf("Vous avez perdu ! Collision avec la paroi ou le corps du serpent.\n"); FermerGraphique(); } } Touche(); FermerGraphique(); return EXIT_SUCCESS; }