#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; /* 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, 1240, 940); EcrireTexte(500,400,"Le jeu va commercer !",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, pommes[i].posy, TAILLE_CASE, TAILLE_CASE); } } /* 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,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) { 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() { /*timer*/ unsigned long suivant; int perdu = 0; int temps[2]= {0,0}, seconde_actuel, old_seconde; suivant = Microsecondes()+CYCLE; old_seconde = (suivant/100000)%10; /* Initialisation du jeu */ graphique(); SnakePoint snake[LARGEUR * HAUTEUR]; /*PommePoint pommes[5];*/ SnakePoint pommes; 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(); AffichageBasique(); while (!perdu) { /*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]); } } serpent(snake, taille); mouvementTete(snake, &dir); mouvementCorps(snake, taille); perdu = gererCollisions(snake, taille, pommes); } 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; }