From f44ade1fe1bf534fe628c2f9e3bea7c9efff8136 Mon Sep 17 00:00:00 2001 From: rognant Date: Fri, 15 Dec 2023 09:15:22 +0100 Subject: [PATCH] t --- #Makefile# | 14 -- Makefile | 28 ++-- graphique.c | 93 ++++++++++++ graphique.h | 23 +++ main.c | 86 +++++++++++ main.h | 29 ++++ obstacles.c | 31 ++++ obstacles.h | 19 +++ pommes.c | 72 ++++++++++ pommes.h | 29 ++++ serpent.c | 405 ++++++++-------------------------------------------- serpent.h | 35 +++++ snake | Bin 0 -> 21584 bytes 13 files changed, 489 insertions(+), 375 deletions(-) delete mode 100644 #Makefile# create mode 100644 graphique.c create mode 100644 graphique.h create mode 100644 main.c create mode 100644 main.h create mode 100644 obstacles.c create mode 100644 obstacles.h create mode 100644 pommes.c create mode 100644 pommes.h create mode 100644 serpent.h create mode 100755 snake diff --git a/#Makefile# b/#Makefile# deleted file mode 100644 index c032cdb..0000000 --- a/#Makefile# +++ /dev/null @@ -1,14 +0,0 @@ -CC = gcc -CFLAGS = -Wall -Wextra -I. -LIBS = -lgraph - -all: serpent - -serpent: main.o serpent.o - $() $() $^ -o $@ $() - -%.o: %.c - $() $() -c $< -o $@ - -clean: - rm -f *.o serpent diff --git a/Makefile b/Makefile index 52c764f..8d9f224 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,14 @@ -CC = gcc -CFLAGS = -Wall -Wextra -I. -LIBS = -lgraph - -all: serpent - -serpent: main.o serpent.o - $(CC) $(CFLAGS) $^ -o $@ $(LIBS) - -%.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ - -clean: - rm -f *.o serpent +snake : graphique.o pommes.o serpent.o obstacles.o main.o + gcc -o snake graphique.o serpent.o pommes.o obstacles.o main.o -lgraph +run : exec + ./exec +graphique.o : graphique.c + gcc -c graphique.c -lgraph +serpent.o : serpent.c + gcc -c serpent.c -lgraph +pommes.o : pommes.c + gcc -c pommes.c -lgraph +obstacles.o : obstacles.c + gcc -c obstacles.c -lgraph +main.o : main.c + gcc -c main.c -lgraph diff --git a/graphique.c b/graphique.c new file mode 100644 index 0000000..9780e87 --- /dev/null +++ b/graphique.c @@ -0,0 +1,93 @@ +#include "graphique.h" +#include "serpent.h" +#include "pommes.h" +#include "obstacles.h" +#include + +void Attendre(unsigned int millisecondes) { + usleep(millisecondes * 1000); +} + +void InitialiserJeu(Serpent* serpent, Pommes* pommes, Obstacles* obstacles) { + serpent->longueur = 10; + serpent->corps = malloc(sizeof(Position) * serpent->longueur); + pommes->nombre = NOMBRE_POMMES; + obstacles->nombre = NOMBRE_OBSTACLES; + + srand(time(NULL)); + + serpent->corps[0].x = LARGEUR / 2 * TAILLE_CASE; + serpent->corps[0].y = HAUTEUR / 2 * TAILLE_CASE; + + /* Initialisation des obstacles*/ + obstacles->positions = malloc(sizeof(Position) * obstacles->nombre); + for (int i = 0; i < obstacles->nombre; i++) { + obstacles->positions[i].x = rand() % LARGEUR; + obstacles->positions[i].y = rand() % HAUTEUR; + } +} + +void AfficherSerpent(Serpent* serpent) { + couleur couleurSerpent = CouleurParComposante(255, 255, 0); + ChoisirCouleurDessin(couleurSerpent); + for (int i = 0; i < serpent->longueur; i++) { + RemplirRectangle(serpent->corps[i].x, serpent->corps[i].y, TAILLE_CASE, TAILLE_CASE); + } +} + +void LibererMemoire(Serpent* serpent, Pommes* pommes, Obstacles* obstacles) { + free(serpent->corps); + LibererPommes(pommes); + free(obstacles->positions); +} + +void Graphique() { + InitialiserGraphique(); + CreerFenetre(0, 0, 1240, 940); + EcrireTexte(500, 400, "Le jeu va commencer !", 2); + Attendre(1000); + EffacerEcran(CouleurParComposante(0, 0, 0)); +} + +void AffichageBasique() { + ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); + RemplirRectangle(0, 0, 1140, 760); +} + +void AfficherScore(int score) { + char scoreText[20]; + snprintf(scoreText, 20, "Score: %d", score); + ChoisirCouleurDessin(CouleurParComposante(0, 0, 0)); + RemplirRectangle(20, 820, 150, 40); + ChoisirCouleurDessin(CouleurParComposante(255, 255, 255)); + EcrireTexte(20, 850, scoreText, 2); +} + +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); +} + +void AfficherEcranFin(int score) { + EffacerEcran(CouleurParComposante(0, 0, 0)); + EcrireTexte(500, 300, "Game Over!", 2); + char scoreText[20]; + snprintf(scoreText, 20, "Score: %d", score); + EcrireTexte(500, 400, scoreText, 2); +} + +int PauseJeu() { + while (1) { + if (ToucheEnAttente()) { + int touche = Touche(); + if (touche == XK_space) { + return 1; // La barre d'espace a été pressée, reprendre le jeu + } + } + Attendre(100); + } +} diff --git a/graphique.h b/graphique.h new file mode 100644 index 0000000..65d89a9 --- /dev/null +++ b/graphique.h @@ -0,0 +1,23 @@ +#ifndef GRAPHIQUE_H +#define GRAPHIQUE_H + +#include +#include "serpent.h" +#include +#include + +#define NOMBRE_POMMES 5 +#define NOMBRE_OBSTACLES 20 + +void Attendre(unsigned int millisecondes); +void Graphique(); +void AffichageBasique(); +void AfficherScore(int score); +void AfficheTemps(int minute, int seconde); +void AfficherEcranFin(int score); +int PauseJeu(); +void AfficherSerpent(Serpent* serpent); +void InitialiserJeu(Serpent* serpent, Pommes* pommes, Obstacles* obstacles); +void LibererMemoire(Serpent* serpent, Pommes* pommes, Obstacles* obstacles); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..e489e4b --- /dev/null +++ b/main.c @@ -0,0 +1,86 @@ + +#include "main.h" +#include "serpent.h" +#include "pommes.h" +#include "obstacles.h" +#include "graphique.h" +#include +#include + +int main() { + int direction = 1; + unsigned long suivant = Microsecondes() + CYCLE; + int temps[2] = {0, 0}, seconde_actuel, old_seconde; + int jeuEnPause = 0, perdu = 0, score = 0; + Serpent serpent; + Pommes pommes; + Obstacles obstacles; + + InitialiserJeu(&serpent, &pommes, &obstacles); + Graphique(); + EffacerEcran(CouleurParComposante(0, 0, 0)); + AffichageBasique(); + GenererPommes(&pommes); + GenererObstacles(&obstacles, &pommes, &serpent); + AfficherSerpent(&serpent); + AfficherScore(score); + + while (perdu != -1) { + if (!jeuEnPause) { + 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]++; + } + AfficheTemps(temps[0], temps[1]); + } + } + + if (ToucheEnAttente()) { + int touche = Touche(); + int nouvelleDirection; + // Déterminer la nouvelle direction en fonction de la touche pressée + if (touche == XK_Right) { + nouvelleDirection = 1; + } else if (touche == XK_Left) { + nouvelleDirection = 2; + } else if (touche == XK_Up) { + nouvelleDirection = 3; + } else if (touche == XK_Down) { + nouvelleDirection = 4; + } else if (touche == XK_space) { + jeuEnPause = 1; + } else if (touche == XK_Escape) { + return EXIT_FAILURE; + } + // Vérifier si la nouvelle direction n'est pas opposée à la direction actuelle + if (!EstDirectionOpposee(direction, nouvelleDirection)) { + // Mettre à jour la direction du serpent + direction = nouvelleDirection; + } + } + + DeplacerSerpent(&serpent, &direction); + perdu = GestionCollision(&serpent, &pommes, &obstacles, perdu, &score); + } else { + if (ToucheEnAttente()) { + int touche = Touche(); + if (touche == XK_space) { + if (touche == XK_Escape) { + return EXIT_FAILURE; + } + jeuEnPause = 0; + } + } + } + } + + LibererMemoire(&serpent, &pommes, &obstacles); + return EXIT_SUCCESS; +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..90a1afd --- /dev/null +++ b/main.h @@ -0,0 +1,29 @@ +#ifndef MAIN_H +#define MAIN_H + +#include "serpent.h" +#include "pommes.h" +#include "obstacles.h" +#include "graphique.h" + +#define HAUTEUR 40 +#define LARGEUR 60 +#define TAILLE_CASE 19 +#define NOMBRE_POMMES 5 +#define NOMBRE_OBSTACLES 20 +#define CYCLE 100000L + +void Attendre(unsigned int millisecondes); +void InitialiserJeu(Serpent* serpent, Pommes* pommes, Obstacles* obstacles); +void AffichageBasique(); +void AfficherScore(int score); +void LibererMemoire(Serpent* serpent, Pommes* pommes, Obstacles* obstacles); +void AfficheTemps(int minute, int seconde); +void AfficherEcranFin(int score); +int PauseJeu(); +void AfficherSerpent(Serpent* serpent); +void GenererObstacles(Obstacles* obstacles, Pommes* pommes, Serpent* serpent); +void DeplacerSerpent(Serpent* serpent, int* direction); +int GestionCollision(Serpent* serpent, Pommes* pommes, Obstacles* obstacles, int perdu, int* score); + +#endif diff --git a/obstacles.c b/obstacles.c new file mode 100644 index 0000000..259fde2 --- /dev/null +++ b/obstacles.c @@ -0,0 +1,31 @@ +#include "obstacles.h" + +void GenererObstacles(Obstacles* obstacles, Pommes* pommes, Serpent* serpent) { + couleur couleurObstacle = CouleurParComposante(128, 128, 128); + obstacles->positions = (Position*)malloc(obstacles->nombre * sizeof(Position)); + + if (obstacles->positions == NULL) { + perror("Allocation error"); + exit(EXIT_FAILURE); + } + + for (int i = 0; i < obstacles->nombre; i++) { + do { + obstacles->positions[i].x = rand() % LARGEUR; + obstacles->positions[i].y = rand() % HAUTEUR; + } while (CollisionAvecPommeSerpent(obstacles->positions[i], pommes->head) || CollisionAvecSerpent(serpent)); + + ChoisirCouleurDessin(couleurObstacle); + RemplirRectangle(obstacles->positions[i].x * TAILLE_CASE, obstacles->positions[i].y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); + } +} + +int CollisionAvecObstacle(Serpent* serpent, Obstacles* obstacles) { + for (int i = 0; i < obstacles->nombre; i++) { + if (serpent->corps[0].x == obstacles->positions[i].x * TAILLE_CASE && + serpent->corps[0].y == obstacles->positions[i].y * TAILLE_CASE) { + return 1; + } + } + return 0; +} diff --git a/obstacles.h b/obstacles.h new file mode 100644 index 0000000..0a58169 --- /dev/null +++ b/obstacles.h @@ -0,0 +1,19 @@ +#ifndef OBSTACLES_H +#define OBSTACLES_H + +#include "pommes.h" +#include "serpent.h" + +#define LARGEUR 60 +#define HAUTEUR 40 +#define TAILLE_CASE 19 + +typedef struct Obstacles { + Position* positions; + int nombre; +} Obstacles; + +void GenererObstacles(Obstacles* obstacles, Pommes* pommes, Serpent* serpent); +int CollisionAvecObstacle(Serpent* serpent, Obstacles* obstacles); + +#endif diff --git a/pommes.c b/pommes.c new file mode 100644 index 0000000..c1863a3 --- /dev/null +++ b/pommes.c @@ -0,0 +1,72 @@ +#include +#include +#include "pommes.h" + +void LibererPommes(Pommes* pommes) { + PommeNode* current = pommes->head; + while (current != NULL) { + PommeNode* next = current->next; + free(current); + current = next; + } + pommes->head = NULL; +} + +void GenererPommes(Pommes* pommes) { + couleur couleurPommes = CouleurParComposante(255, 0, 0); + pommes->head = NULL; + + for (int i = 0; i < pommes->nombre; i++) { + PommeNode* nouvellePomme = (PommeNode*)malloc(sizeof(PommeNode)); + if (nouvellePomme == NULL) { + perror("Allocation error"); + exit(EXIT_FAILURE); + } + + nouvellePomme->position.x = rand() % LARGEUR; + nouvellePomme->position.y = rand() % HAUTEUR; + nouvellePomme->next = pommes->head; + pommes->head = nouvellePomme; + + ChoisirCouleurDessin(couleurPommes); + RemplirArc(nouvellePomme->position.x * TAILLE_CASE, nouvellePomme->position.y * TAILLE_CASE, + TAILLE_CASE, TAILLE_CASE, 360, 360); + } +} + +void AjouterPomme(Pommes* pommes, int x, int y) { + PommeNode* nouvellePomme = (PommeNode*)malloc(sizeof(PommeNode)); + if (nouvellePomme == NULL) { + perror("Allocation error"); + exit(EXIT_FAILURE); + } + + nouvellePomme->position.x = x; + nouvellePomme->position.y = y; + nouvellePomme->next = pommes->head; + pommes->head = nouvellePomme; + pommes->nombre++; +} + +void GenererNouvellePomme(Pommes* pommes) { + couleur couleurPommes = CouleurParComposante(255, 0, 0); + int newX = rand() % LARGEUR; + int newY = rand() % HAUTEUR; + + // Assuming you have a function named AjouterPomme to add a new apple to the linked list. + AjouterPomme(pommes, newX, newY); + + ChoisirCouleurDessin(couleurPommes); + RemplirArc(newX * TAILLE_CASE, newY * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE, 360, 360); +} + +int CollisionAvecPommeSerpent(Position position, PommeNode* pommes) { + PommeNode* current = pommes; + while (current != NULL) { + if (position.x == current->position.x && position.y == current->position.y) { + return 1; + } + current = current->next; + } + return 0; +} diff --git a/pommes.h b/pommes.h new file mode 100644 index 0000000..214842f --- /dev/null +++ b/pommes.h @@ -0,0 +1,29 @@ +#ifndef POMMES_H +#define POMMES_H + +#include "serpent.h" +#include "graphique.h" +#include + +#define LARGEUR 60 +#define HAUTEUR 40 +#define TAILLE_CASE 19 + +typedef struct PommeNode { + Position position; + struct PommeNode* next; +} PommeNode; + +typedef struct Pommes { + PommeNode* head; + int nombre; +} Pommes; + +void LibererPommes(Pommes* pommes); +void GenererPommes(Pommes* pommes); +void AjouterPomme(Pommes* pommes, int x, int y); +void GenererNouvellePomme(Pommes* pommes); +int CollisionAvecPommeSerpent(Position position, PommeNode* pommes); +int CollisionAvecPomme(Serpent* serpent, Pommes* pommes, int* score); + +#endif diff --git a/serpent.c b/serpent.c index e290d4f..10a3c1c 100644 --- a/serpent.c +++ b/serpent.c @@ -1,276 +1,5 @@ -#include -#include -#include -#include -#include - -#define HAUTEUR 40 -#define LARGEUR 60 -#define TAILLE_CASE 19 -#define NOMBRE_POMMES 5 -#define NOMBRE_OBSTACLES 20 -#define CYCLE 100000L - -typedef struct { - int x; - int y; -} Position; - -typedef struct { - Position* corps; - int longueur; -} Serpent; - -typedef struct PommeNode { - Position position; - struct PommeNode* next; -} PommeNode; - -typedef struct { - PommeNode* head; - int nombre; -} Pommes; - -typedef struct { - Position* positions; - int nombre; -} Obstacles; - -void Attendre(unsigned int millisecondes) { - usleep(millisecondes * 1000); -} - -void LibererPommes(Pommes* pommes) { - PommeNode* current = pommes->head; - while (current != NULL) { - PommeNode* next = current->next; - free(current); - current = next; - } - pommes->head = NULL; -} - -void InitialiserJeu(Serpent* serpent, Pommes* pommes, Obstacles* obstacles) { - serpent->longueur = 10; - serpent->corps = malloc(sizeof(Position) * serpent->longueur); - pommes->nombre = NOMBRE_POMMES; - obstacles->nombre = NOMBRE_OBSTACLES; - - srand(time(NULL)); - - serpent->corps[0].x = LARGEUR / 2 * TAILLE_CASE; - serpent->corps[0].y = HAUTEUR / 2 * TAILLE_CASE; - - /* Initialisation des obstacles*/ - obstacles->positions = malloc(sizeof(Position) * obstacles->nombre); - for (int i = 0; i < obstacles->nombre; i++) { - obstacles->positions[i].x = rand() % LARGEUR; - obstacles->positions[i].y = rand() % HAUTEUR; - } -} -void Graphique() { - InitialiserGraphique(); - CreerFenetre(1, 1, 1240, 940); - EcrireTexte(500, 400, "Le jeu va commencer !", 2); - Attendre(1000); - EffacerEcran(CouleurParComposante(0, 0, 0)); -} - -void AffichageBasique() { - ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); - RemplirRectangle(0, 0, 1140, 760); -} - -void AfficherScore(int score) { - char scoreText[20]; - snprintf(scoreText, 20, "Score: %d", score); - ChoisirCouleurDessin(CouleurParComposante(0, 0, 0)); - RemplirRectangle(20, 820, 150, 40); - ChoisirCouleurDessin(CouleurParComposante(255, 255, 255)); - EcrireTexte(20, 850, scoreText, 2); -} - -void LibererMemoire(Serpent* serpent, Pommes* pommes, Obstacles* obstacles) { - free(serpent->corps); - LibererPommes(pommes); - free(obstacles->positions); -} - -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); -} -void AfficherEcranFin(int score) { - EffacerEcran(CouleurParComposante(0, 0, 0)); - EcrireTexte(500, 300, "Game Over!", 2); - char scoreText[20]; - snprintf(scoreText, 20, "Score: %d", score); - EcrireTexte(500, 400, scoreText, 2); -} -int PauseJeu() { - while (1) { - if (ToucheEnAttente()) { - int touche = Touche(); - if (touche == XK_space) { - return 1; // La barre d'espace a été pressée, reprendre le jeu - } - } - Attendre(100); - } -} -void AfficherSerpent(Serpent* serpent) { - couleur couleurSerpent = CouleurParComposante(255, 255, 0); - ChoisirCouleurDessin(couleurSerpent); - - for (int i = 0; i < serpent->longueur; i++) { - RemplirRectangle(serpent->corps[i].x, serpent->corps[i].y, TAILLE_CASE, TAILLE_CASE); - } -} - -void GenererPommes(Pommes* pommes) { - couleur couleurPommes = CouleurParComposante(255, 0, 0); - pommes->head = NULL; - - for (int i = 0; i < pommes->nombre; i++) { - PommeNode* nouvellePomme = (PommeNode*)malloc(sizeof(PommeNode)); - if (nouvellePomme == NULL) { - perror("Allocation error"); - exit(EXIT_FAILURE); - } - - nouvellePomme->position.x = rand() % LARGEUR; - nouvellePomme->position.y = rand() % HAUTEUR; - nouvellePomme->next = pommes->head; - pommes->head = nouvellePomme; - - ChoisirCouleurDessin(couleurPommes); - RemplirArc(nouvellePomme->position.x * TAILLE_CASE, nouvellePomme->position.y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE,360,360); - } -} -void AjouterPomme(Pommes* pommes, int x, int y) { - PommeNode* nouvellePomme = (PommeNode*)malloc(sizeof(PommeNode)); - if (nouvellePomme == NULL) { - perror("Allocation error"); - exit(EXIT_FAILURE); - } - nouvellePomme->position.x = x; - nouvellePomme->position.y = y; - nouvellePomme->next = pommes->head; - pommes->head = nouvellePomme; - pommes->nombre++; -} -void GenererNouvellePomme(Pommes* pommes) { - couleur couleurPommes = CouleurParComposante(255, 0, 0); - int newX = rand() % LARGEUR; - int newY = rand() % HAUTEUR; - - // Assuming you have a function named AjouterPomme to add a new apple to the linked list. - AjouterPomme(pommes, newX, newY); - - ChoisirCouleurDessin(couleurPommes); - RemplirArc(newX * TAILLE_CASE, newY * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE,360,360); -} -int CollisionAvecPommeSerpent(Position position, PommeNode* pommes) { - PommeNode* current = pommes; - - while (current != NULL) { - if (position.x == current->position.x && position.y == current->position.y) { - return 1; - } - - current = current->next; - } - - return 0; -} - -int CollisionAvecPomme(Serpent* serpent, Pommes* pommes, int* score) { - PommeNode* current = pommes->head; - PommeNode* prev = NULL; - - while (current != NULL) { - if (serpent->corps[0].x >= current->position.x * TAILLE_CASE && - serpent->corps[0].x < (current->position.x + 1) * TAILLE_CASE && - serpent->corps[0].y >= current->position.y * TAILLE_CASE && - serpent->corps[0].y < (current->position.y + 1) * TAILLE_CASE) { - // La pomme a été mangée, mettre à jour les liens - if (prev == NULL) { - // La pomme était en tête de liste - pommes->head = current->next; - } else { - prev->next = current->next; - } - - free(current); - *score = *score + 5; - AfficherScore(*score); - - // Générer une nouvelle pomme - GenererNouvellePomme(pommes); - - return 1; - } - - prev = current; - current = current->next; - } - - return 0; -} - -int CollisionAvecObstacle(Serpent* serpent, Obstacles* obstacles) { - for (int i = 0; i < obstacles->nombre; i++) { - if (serpent->corps[0].x == obstacles->positions[i].x * TAILLE_CASE && - serpent->corps[0].y == obstacles->positions[i].y * TAILLE_CASE) { - return 1; - } - } - return 0; -} - -int CollisionAvecSerpent(Serpent* serpent) { - for (int i = 1; i < serpent->longueur; i++) { - if (serpent->corps[0].x == serpent->corps[i].x && serpent->corps[0].y == serpent->corps[i].y) { - return 1; - } - } - return 0; -} - -int EstDirectionOpposee(int directionActuelle, int nouvelleDirection) { - if ((directionActuelle == 1 && nouvelleDirection == 2) || - (directionActuelle == 2 && nouvelleDirection == 1) || - (directionActuelle == 3 && nouvelleDirection == 4) || - (directionActuelle == 4 && nouvelleDirection == 3)) { - return 1; // Les directions sont opposées - } - return 0; // Les directions ne sont pas opposées -} - -int CollisionAvecBordures(Serpent* serpent) { - if (serpent->corps[0].x < 0 || serpent->corps[0].x >= LARGEUR * TAILLE_CASE || - serpent->corps[0].y < 0 || serpent->corps[0].y >= HAUTEUR * TAILLE_CASE) { - return 1; - } - return 0; -} -void GenererObstacles(Obstacles* obstacles, Pommes* pommes, Serpent* serpent) { - couleur couleurObstacle = CouleurParComposante(128, 128, 128); - - for (int i = 0; i < obstacles->nombre; i++) { - do { - obstacles->positions[i].x = rand() % LARGEUR; - obstacles->positions[i].y = rand() % HAUTEUR; - } while (CollisionAvecPommeSerpent(obstacles->positions[i], pommes->head) || CollisionAvecSerpent(serpent)); - - ChoisirCouleurDessin(couleurObstacle); - RemplirRectangle(obstacles->positions[i].x * TAILLE_CASE, obstacles->positions[i].y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); - } -} +#include "serpent.h" +#include "pommes.h" void DeplacerSerpent(Serpent* serpent, int* direction) { couleur couleurFond = CouleurParComposante(0, 0, 0); @@ -310,93 +39,75 @@ void DeplacerSerpent(Serpent* serpent, int* direction) { int GestionCollision(Serpent* serpent, Pommes* pommes, Obstacles* obstacles, int perdu, int* score) { int loose = perdu; + if (CollisionAvecPomme(serpent, pommes, score)) { serpent->longueur = serpent->longueur + 2; serpent->corps = realloc(serpent->corps, sizeof(Position) * serpent->longueur); loose = 1; } + if (CollisionAvecObstacle(serpent, obstacles) || CollisionAvecSerpent(serpent) || CollisionAvecBordures(serpent)) { - AfficherEcranFin(*score); - Attendre(1000); + AfficherEcranFin(*score); + Attendre(1000); loose = -1; } + return loose; } -int main() { - int direction = 1; - unsigned long suivant = Microsecondes() + CYCLE; - int temps[2] = {0, 0}, seconde_actuel, old_seconde; - int jeuEnPause = 0, perdu = 0, score = 0; - - Serpent serpent; - Pommes pommes; - Obstacles obstacles; - - InitialiserJeu(&serpent, &pommes, &obstacles); - Graphique(); - EffacerEcran(CouleurParComposante(0, 0, 0)); - AffichageBasique(); - GenererPommes(&pommes); - GenererObstacles(&obstacles, &pommes, &serpent); - AfficherSerpent(&serpent); - AfficherScore(score); - - while (perdu != -1) { - if (!jeuEnPause) { - 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]++; - } - AfficheTemps(temps[0], temps[1]); - } - } - if (ToucheEnAttente()) { - int touche = Touche(); - int nouvelleDirection; - - // Déterminer la nouvelle direction en fonction de la touche pressée - if (touche == XK_Right) { - nouvelleDirection = 1; - } else if (touche == XK_Left) { - nouvelleDirection = 2; - } else if (touche == XK_Up) { - nouvelleDirection = 3; - } else if (touche == XK_Down) { - nouvelleDirection = 4; - } else if (touche == XK_space) { - jeuEnPause = 1; - } else if (touche == XK_Escape) { - return EXIT_FAILURE; +int CollisionAvecSerpent(Serpent* serpent) { + for (int i = 1; i < serpent->longueur; i++) { + if (serpent->corps[0].x == serpent->corps[i].x && serpent->corps[0].y == serpent->corps[i].y) { + return 1; + } } - // Vérifier si la nouvelle direction n'est pas opposée à la direction actuelle - if (!EstDirectionOpposee(direction, nouvelleDirection)) { - // Mettre à jour la direction du serpent - direction = nouvelleDirection; - } + return 0; } - DeplacerSerpent(&serpent, &direction); - perdu = GestionCollision(&serpent, &pommes, &obstacles, perdu, &score); - } else { - if (ToucheEnAttente()) { - int touche = Touche(); - if (touche == XK_space) { - if (touche == XK_Escape) { - return EXIT_FAILURE; - } - jeuEnPause = 0; - } - } - } + +int EstDirectionOpposee(int directionActuelle, int nouvelleDirection) { + if ((directionActuelle == 1 && nouvelleDirection == 2) || + (directionActuelle == 2 && nouvelleDirection == 1) || + (directionActuelle == 3 && nouvelleDirection == 4) || + (directionActuelle == 4 && nouvelleDirection == 3)) { + return 1; // Les directions sont opposées } - LibererMemoire(&serpent, &pommes, &obstacles); - return EXIT_SUCCESS; + + return 0; // Les directions ne sont pas opposées +} + +int CollisionAvecBordures(Serpent* serpent) { + if (serpent->corps[0].x < 0 || serpent->corps[0].x >= LARGEUR * TAILLE_CASE || + serpent->corps[0].y < 0 || serpent->corps[0].y >= HAUTEUR * TAILLE_CASE) { + return 1; + } + + return 0; +} +int CollisionAvecPomme(Serpent* serpent, Pommes* pommes, int* score) { + PommeNode* current = pommes->head; + PommeNode* prev = NULL; + while (current != NULL) { + if (serpent->corps[0].x >= current->position.x * TAILLE_CASE && + serpent->corps[0].x < (current->position.x + 1) * TAILLE_CASE && + serpent->corps[0].y >= current->position.y * TAILLE_CASE && + serpent->corps[0].y < (current->position.y + 1) * TAILLE_CASE) { + // La pomme a été mangée, mettre à jour les liens + if (prev == NULL) { + // La pomme était en tête de liste + pommes->head = current->next; + } else { + prev->next = current->next; + } + free(current); + *score = *score + 5; + AfficherScore(*score); + // Générer une nouvelle pomme + GenererNouvellePomme(pommes); + return 1; + } + prev = current; + current = current->next; + } + return 0; } diff --git a/serpent.h b/serpent.h new file mode 100644 index 0000000..b21f131 --- /dev/null +++ b/serpent.h @@ -0,0 +1,35 @@ +#ifndef SERPENT_H +#define SERPENT_H + +#include +#include + +#define TAILLE_CASE 19 +#define LARGEUR 60 +#define HAUTEUR 40 + +typedef struct { + int x; + int y; +} Position; + +typedef struct { + Position* corps; + int longueur; +} Serpent; + +typedef struct Pommes Pommes; +typedef struct Obstacles Obstacles; + +extern void DeplacerSerpent(Serpent* serpent, int* direction); + +extern int GestionCollision(Serpent* serpent, Pommes* pommes, Obstacles* obstacles, int perdu, int* score); + +extern int CollisionAvecSerpent(Serpent* serpent); + +extern int EstDirectionOpposee(int directionActuelle, int nouvelleDirection); + +extern int CollisionAvecBordures(Serpent* serpent); +int CollisionAvecPomme(Serpent* serpent, Pommes* pommes, int* score); + +#endif // SERPENT_H diff --git a/snake b/snake new file mode 100755 index 0000000000000000000000000000000000000000..9574ee7505fd435ef5a6be0bfedf631a6bf3b981 GIT binary patch literal 21584 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 literal 0 HcmV?d00001