#include #include #include #include #define HAUTEUR 40 #define LARGEUR 60 #define CYCLE 100000L #define SEGMENT 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; /* Structure pour stocker les coordonnées de la pomme */ typedef struct { int posx, posy; } PommePoint; /* Fonction pour concevoir le graphique */ void graphique() { InitialiserGraphique(); CreerFenetre(10, 10, 1700, 950); couleur c, b; b = CouleurParComposante(0, 0, 0); ChoisirCouleurDessin(b); RemplirRectangle(0, 0, 1750, 950); c = CouleurParComposante(111, 255, 94); ChoisirCouleurDessin(c); RemplirRectangle(100, 100, 1500, 750); } /* 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 * SEGMENT, snake[i].posy * SEGMENT, SEGMENT, SEGMENT); } } /* Fonction pour générer les pommes */ void genererPommes(PommePoint *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, pommes[i].posy,10,10); } } /* Fonction pour gérer le mouvement de la tête du serpent */ void mouvementTete(SnakePoint *snake, 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; } /*deplace la tete 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 */ for (int i = taille - 1; i > 0; i--) { snake[i] = snake[i - 1]; } } /* Fonction pour gérer les collisions */ int gererCollisions(SnakePoint *snake, int taille, PommePoint *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) { pommes[i].posx = (rand() % (LARGEUR - 2)) + 1; pommes[i].posy = (rand() % (HAUTEUR - 2)) + 1; /*Augmente la taille du serpent*/ return 1; /*Collision avec une pomme*/ } } /* 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]; PommePoint pommes[5]; unsigned long suivant; int perdu = 0; int taille = 10; int dir; srand(time(NULL)); /* Position initiale du serpent au milieu du tableau */ snake[0].posx = LARGEUR / 2; snake[0].posy = HAUTEUR / 2; graphique(); genererPommes(pommes); while (!perdu) { serpent(snake, taille); mouvementTete(snake, &dir); mouvementCorps(snake, taille); perdu = gererCollisions(snake, taille, pommes); usleep(CYCLE); } if (perdu == -1) { printf("Vous avez perdu ! Collision avec la paroi.\n"); } else { printf("Vous avez perdu ! Collision avec une pomme.\n"); } FermerGraphique(); return EXIT_SUCCESS; }