#include #include #include #include #include #define HAUTEUR 40 #define LARGEUR 60 #define TAILLE_CASE 20 #define NOMBRE_POMMES 5 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) { couleur couleurSerpent = CouleurParComposante(255, 255, 0); ChoisirCouleurDessin(couleurSerpent); for (int 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) { couleur c; couleur v; couleur s; c = CouleurParComposante(0, 0, 0); s = CouleurParComposante(255, 255, 0); v = CouleurParComposante(111, 255, 94); for (int i = 0; i < longueurSerpent; i++) { ChoisirCouleurDessin(v); RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } for (int 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 (int 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[]) { /* 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)++; 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 */ } int main() { int 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)); /* Position initiale du serpent au milieu du tableau */ serpent[0].x = LARGEUR / 2 * TAILLE_CASE; serpent[0].y = HAUTEUR / 2 * TAILLE_CASE; 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); if (perdu == -1) { printf("Vous avez perdu ! Collision avec la paroi ou le corps du serpent.\n"); FermerGraphique(); } } /* Attend que l'utilisateur appuie sur une touche avant de fermer la fenêtre graphique */ Touche(); FermerGraphique(); return EXIT_SUCCESS; }