diff --git a/snake.c b/snake.c index 82a1daf..6211de9 100644 --- a/snake.c +++ b/snake.c @@ -2,17 +2,14 @@ #include #include #include -#include #define HAUTEUR 40 #define LARGEUR 60 - #define CYCLE 100000L - -#define SEGMENT 10 +#define TAILLE_CASE 20 /* Enumeration des différentes directions possibles */ -enum dir { UP = 2, DOWN = 3, LEFT = 0, RIGHT = 1 }; +enum Direction { UP = 2, DOWN = 3, LEFT = 0, RIGHT = 1 }; /* Structure pour stocker les coordonnées des segments du serpent */ typedef struct { @@ -22,14 +19,26 @@ typedef struct { /* 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); + 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 */ @@ -37,41 +46,79 @@ 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); + RemplirRectangle(snake[i].posx * TAILLE_CASE, snake[i].posy * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } -/* Fonction pour gérer le mouvement du serpent */ -void mouvement(SnakePoint *snake, int *taille, int *dir, SnakePoint *pomme, int *perdu) { - /* Déplace le serpent */ - for (int i = *taille - 1; i > 0; i--) { +/* 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]; } +} - /* Déplace la tête en fonction de la direction */ - if (*dir == LEFT) { - snake[0].posx = (snake[0].posx - 1 + LARGEUR) % LARGEUR; - } else if (*dir == RIGHT) { - snake[0].posx = (snake[0].posx + 1) % LARGEUR; - } else if (*dir == UP) { - snake[0].posy = (snake[0].posy - 1 + HAUTEUR) % HAUTEUR; - } else if (*dir == DOWN) { - snake[0].posy = (snake[0].posy + 1) % HAUTEUR; +/* 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 } - /* Vérifie la collision avec la paroi intérieure du rectangle */ - if (snake[0].posx < 0 || snake[0].posx >= LARGEUR || snake[0].posy < 0 || snake[0].posy >= HAUTEUR) { - *perdu = 1; - return; - } - - /* Vérifie si le serpent a mangé la pomme à partir des coordonnées et génère une nouvelle pomme */ - if (snake[0].posx == pomme->posx && snake[0].posy == pomme->posy) { - pomme->posx = rand() % LARGEUR; - pomme->posy = rand() % HAUTEUR; - - /* Augmente la taille du serpent */ - (*taille)++; + return 0; // Pas de collision } } @@ -79,9 +126,7 @@ int main() { /* Initialisation du jeu */ graphique(); SnakePoint snake[LARGEUR * HAUTEUR]; - SnakePoint pomme; - unsigned long suivant; - int perdu = 0; + SnakePoint pommes[5]; int taille = 1; int dir; @@ -91,22 +136,50 @@ int main() { snake[0].posx = LARGEUR / 2; snake[0].posy = HAUTEUR / 2; - /* Position initiale de la pomme à une position aléatoire à l'intérieur du rectangle */ - pomme.posx = (rand() % (LARGEUR - 2)) + 1; - pomme.posy = (rand() % (HAUTEUR - 2)) + 1; - graphique(); + AffichageBasique(); + genererPommes(pommes); - while (!perdu) { - serpent(snake, taille); - mouvement(snake, &taille, &dir, &pomme, &perdu); - usleep(CYCLE); + 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); + } + } + } } - if (perdu) { - printf("Vous avez perdu !\n"); - FermerGraphique(); - } + FermerGraphique(); return EXIT_SUCCESS; }