diff --git a/#jeu.c# b/#jeu.c# new file mode 100644 index 0000000..f96c3c4 --- /dev/null +++ b/#jeu.c# @@ -0,0 +1,191 @@ +#include +#include +#include +#include + +#define HAUTEUR 40 +#define LARGEUR 60 +#define CYCLE 100000L +#define TAILLE_CASE 20 +#define SCORE_TO_WIN 50 + +/* 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; + +/* 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)); +} + +void AffichageBasique() { + ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); + RemplirRectangle(10, 10, 1175, 775); +} + +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 - 2) + 1; + pommes[i].posy = rand() % (HAUTEUR - 2) + 1; + 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 *score, int *dir) { + 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]; + } +} + +/* Fonction pour gérer les collisions */ +int gererCollisions(SnakePoint *snake, int *taille, int *score, SnakePoint *pommes, int *aMangerPomme) { + int i; + /* Vérifie la collision avec la pomme */ + if (snake[0].posx == pommes[i].posx && snake[0].posy == pommes[i].posy) { + /* Augmente le score et génère une nouvelle pomme */ + *score += 5; + pommes[i].posx = rand() % (LARGEUR - 2) + 1; + pommes[i].posy = rand() % (HAUTEUR - 2) + 1; + *aMangerPomme = 1; + return 1; /* Le serpent a mangé 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]; + SnakePoint pommes[5]; + int taille = 1; + int score = 0; + int dir = RIGHT; // Ajout de la direction initiale + int aMangerPomme = 0; + srand(time(NULL)); + + /* Position initiale du serpent au milieu du tableau */ + snake[0].posx = LARGEUR / 2; + snake[0].posy = HAUTEUR / 2; + + graphique(); + AffichageBasique(); + genererPommes(pommes); + + unsigned long suivant = Microsecondes() + CYCLE; + int perdu = 0; + int temps[2] = {0, 0}, seconde_actuel, old_seconde; + + 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]); + } + + /* Déplacement du serpent */ + mouvementTete(snake, &taille, &score, &dir); + mouvementCorps(snake, taille); + perdu = gererCollisions(snake, &taille, &score, pommes, &aMangerPomme); + serpent(snake, taille); + + + } + } + /* Génération de nouvelles pommes si le serpent en a mangé une */ + if (aMangerPomme) { + aMangerPomme = 0; // Réinitialise la variable après avoir généré les pommes + genererPommes(pommes); + perdu = 0; /* enlever ça pour faire des obstacle*/ + } + + if (perdu == -1) { + printf("Vous avez perdu ! Collision avec la paroi.\n"); + FermerGraphique(); + *score =0; + } + + + + return EXIT_SUCCESS; +} diff --git a/.#jeu.c b/.#jeu.c new file mode 120000 index 0000000..4ef519d --- /dev/null +++ b/.#jeu.c @@ -0,0 +1 @@ +mommeja@salle229-09.1735:1701946472 \ No newline at end of file diff --git a/idée.c b/idée.c new file mode 100644 index 0000000..3307497 --- /dev/null +++ b/idée.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include + +#define LARGEUR_FENETRE 1080 +#define HAUTEUR_FENETRE 1080 +#define TAILLE_CASE 5 +#define NOMBRE_CASES_X (LARGEUR_FENETRE / TAILLE_CASE) +#define NOMBRE_CASES_Y (HAUTEUR_FENETRE / TAILLE_CASE) + +enum direction {UP, DOWN, RIGHT, LEFT}; + +typedef struct { + int x, y; +} Position; + +typedef struct { + Position position; + int taille; + Position queue[100]; // Augmentez la taille si nécessaire +} Snake; + +typedef struct { + Position position; +} Fruit; + +void initialiserGraphique() { + InitialiserGraphique(); + CreerFenetre(LARGEUR_FENETRE, HAUTEUR_FENETRE, LARGEUR_FENETRE, HAUTEUR_FENETRE); +} + +void dessinerCase(Position position, couleur c) { + ChoisirCouleurDessin(c); + RemplirRectangle(position.x * TAILLE_CASE, position.y * TAILLE_CASE, (position.x + 1) * TAILLE_CASE, (position.y + 1) * TAILLE_CASE); +} + +void afficherSnake(Snake *snake) { + couleur couleurSnake = CouleurParComposante(0, 255, 0); // Vert + for (int i = 0; i < snake->taille; i++) { + dessinerCase(snake->queue[i], couleurSnake); + } +} + +void afficherFruit(Fruit *fruit) { + couleur couleurFruit = CouleurParComposante(255, 0, 0); // Rouge + dessinerCase(fruit->position, couleurFruit); +} + +void deplacerSnake(Snake *snake, enum direction dir) { + // Déplacer la queue + for (int i = snake->taille - 1; i > 0; i--) { + snake->queue[i] = snake->queue[i - 1]; + } + + // Déplacer la tête + switch (dir) { + case UP: + snake->queue[0].y--; + break; + case DOWN: + snake->queue[0].y++; + break; + case LEFT: + snake->queue[0].x--; + break; + case RIGHT: + snake->queue[0].x++; + break; + } +} + +int collisionAvecFruit(Snake *snake, Fruit *fruit) { + return snake->queue[0].x == fruit->position.x && snake->queue[0].y == fruit->position.y; +} + +int collisionAvecMur(Snake *snake) { + return snake->queue[0].x < 0 || snake->queue[0].x >= NOMBRE_CASES_X || + snake->queue[0].y < 0 || snake->queue[0].y >= NOMBRE_CASES_Y; +} + +int collisionAvecQueue(Snake *snake) { + for (int i = 1; i < snake->taille; i++) { + if (snake->queue[0].x == snake->queue[i].x && snake->queue[0].y == snake->queue[i].y) { + return 1; + } + } + return 0; +} + +void jeuSnake() { + initialiserGraphique(); + + Snake snake; + snake.queue[0].x = NOMBRE_CASES_X / 2; + snake.queue[0].y = NOMBRE_CASES_Y / 2; + snake.taille = 1; + + Fruit fruit; + srand(time(NULL)); + fruit.position.x = rand() % NOMBRE_CASES_X; + fruit.position.y = rand() % NOMBRE_CASES_Y; + + enum direction direction = RIGHT; // Direction initiale + + while (1) { + EffacerEcran(0); + + deplacerSnake(&snake, direction); + afficherSnake(&snake); + afficherFruit(&fruit); + + if (collisionAvecFruit(&snake, &fruit)) { + // Manger le fruit + snake.taille++; + fruit.position.x = rand() % NOMBRE_CASES_X; + fruit.position.y = rand() % NOMBRE_CASES_Y; + } + + if (collisionAvecMur(&snake) || collisionAvecQueue(&snake)) { + FermerGraphique(); + printf("Game Over!\n"); + break; + } + + if (ToucheEnAttente()) { + int touche = Touche(); + if (touche == 65 && direction != DOWN) { // 65 correspond à la touche '↑' + direction = UP; + } else if (touche == 66 && direction != UP) { // 66 correspond à la touche '↓' + direction = DOWN; + } else if (touche == 68 && direction != RIGHT) { // 68 correspond à la touche '←' + direction = LEFT; + } else if (touche == 67 && direction != LEFT) { // 67 correspond à la touche '→' + direction = RIGHT; + } + } + } +} + +int main(void) { + Snake snake; + Fruit fruit; + enum direction{RIGHT,UP,LEFT,DOWN}; + Position positionCase; + positionCase.x = 5; + positionCase.y = 5; + couleur couleurCase = CouleurParComposante(255, 255, 255); + initialiserGraphique(); + dessinerCase(positionCase, couleurCase); + afficherSnake(&Snake); + afficherFruit(&Fruit); + deplacerSnake(&Snake, direction); + jeuSnake(); + + + return EXIT_SUCCESS; +} diff --git a/jeu.c b/jeu.c new file mode 100644 index 0000000..0c1db52 --- /dev/null +++ b/jeu.c @@ -0,0 +1,191 @@ +#include +#include +#include +#include + +#define HAUTEUR 40 +#define LARGEUR 60 +#define CYCLE 100000L +#define TAILLE_CASE 20 +#define SCORE_TO_WIN 50 + +/* 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; + +/* 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)); +} + +void AffichageBasique() { + ChoisirCouleurDessin(CouleurParComposante(111, 255, 94)); + RemplirRectangle(10, 10, 1175, 775); +} + +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 - 2) + 1; + pommes[i].posy = rand() % (HAUTEUR - 2) + 1; + 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 *score, int *dir) { + 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]; + } +} + +/* Fonction pour gérer les collisions */ +int gererCollisions(SnakePoint *snake, int *taille, int *score, SnakePoint *pommes, int *aMangerPomme) { + int i; + /* Vérifie la collision avec la pomme */ + if (snake[0].posx == pommes[i].posx && snake[0].posy == pommes[i].posy) { + /* Augmente le score et génère une nouvelle pomme */ + *score += 5; + pommes[i].posx = rand() % (LARGEUR - 2) + 1; + pommes[i].posy = rand() % (HAUTEUR - 2) + 1; + *aMangerPomme = 1; + return 1; /* Le serpent a mangé 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]; + SnakePoint pommes[5]; + int taille = 1; + int score = 0; + int dir = RIGHT; // Ajout de la direction initiale + int aMangerPomme = 0; + srand(time(NULL)); + + /* Position initiale du serpent au milieu du tableau */ + snake[0].posx = LARGEUR / 2; + snake[0].posy = HAUTEUR / 2; + + graphique(); + AffichageBasique(); + genererPommes(pommes); + + unsigned long suivant = Microsecondes() + CYCLE; + int perdu = 0; + int temps[2] = {0, 0}, seconde_actuel, old_seconde; + + 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]); + } + + /* Déplacement du serpent */ + mouvementTete(snake, &taille, &score, &dir); + mouvementCorps(snake, taille); + perdu = gererCollisions(snake, &taille, &score, pommes, &aMangerPomme); + serpent(snake, taille); + + + } + } + /* Génération de nouvelles pommes si le serpent en a mangé une */ + if (aMangerPomme) { + aMangerPomme = 0; // Réinitialise la variable après avoir généré les pommes + genererPommes(pommes); + perdu = 0; /* enlever ça pour faire des obstacle*/ + } + + if (perdu == -1) { + printf("Vous avez perdu ! Collision avec la paroi.\n"); + FermerGraphique(); + *score =0; + } + + + + return EXIT_SUCCESS; +}