diff --git a/include/jeu.h b/include/jeu.h index f05d073..72a9f88 100644 --- a/include/jeu.h +++ b/include/jeu.h @@ -2,10 +2,12 @@ #define JEU_H +void afficherScore(int score); void lancer_jeu1(void); void lancer_jeu2(void); void lancer_jeu3(void); void lancer_jeu4(void); +void lancer_jeu5(void); #endif /*JEU_H*/ \ No newline at end of file diff --git a/include/obstacle.h b/include/obstacle.h new file mode 100644 index 0000000..ea75509 --- /dev/null +++ b/include/obstacle.h @@ -0,0 +1,17 @@ +#ifndef OBSTACLE_H +#define OBSTACLE_H + +#include "../include/grille.h" +#include "../include/serpent.h" + +typedef struct { + int x; + int y; +} Obstacle; + +void dessinerObstacle(Obstacle obstacle); +int estCollisionObstacle(Obstacle obstacle, Segment serpent[], int longueur); +Obstacle creerObstacle(int largeurGrille, int hauteurGrille); +void placerObstacle(Obstacle obstacles[], int nombreObstacles, int largeurGrille, int hauteurGrille); + +#endif /*OBSTACLE_H*/ diff --git a/include/serpent.h b/include/serpent.h index d9153f9..74e5ff3 100644 --- a/include/serpent.h +++ b/include/serpent.h @@ -11,5 +11,6 @@ int tuerSerpent(Segment serpent[], int longueur); void mettreAJourSerpent(Segment serpent[], int *longueur, int *direction_x, int *direction_y); void dessinerSerpent(Segment serpent[], int *longueur); int seMangerQueue(Segment serpent[], int longueur); +void attendreSerpent(unsigned long int microseconds); #endif /*SERPENT_H*/ diff --git a/include/timer.h b/include/timer.h new file mode 100644 index 0000000..31a5a0c --- /dev/null +++ b/include/timer.h @@ -0,0 +1,12 @@ +#ifndef TIMER_H +#define TIMER_H + + +unsigned long int attendre(void); +unsigned long int creer_timer(void); +int afficher_minute(int min); +int afficher_seconde(int sec); + + + +#endif /*TIMER_H*/ \ No newline at end of file diff --git a/src/.vscode/c_cpp_properties.json b/src/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..c2098a2 --- /dev/null +++ b/src/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "linux-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "linux-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/src/.vscode/launch.json b/src/.vscode/launch.json new file mode 100644 index 0000000..4b3737f --- /dev/null +++ b/src/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": false, + "cwd": "/export/home/an23/stiti/PROJET DEV/SAE11_2023/src", + "program": "/export/home/an23/stiti/PROJET DEV/SAE11_2023/src/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 0000000..450db55 --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,37 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wconversion", + "-Wnull-dereference", + "-Wsign-conversion" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false +} \ No newline at end of file diff --git a/src/jeu.c b/src/jeu.c index fd04703..d5c3346 100644 --- a/src/jeu.c +++ b/src/jeu.c @@ -1,29 +1,29 @@ #include #include #include -#include /* à supprimer prochainement */ #include "../include/grille.h" #include "../include/serpent.h" #include "../include/pomme.h" #include "../include/jeu.h" #include "../include/menu.h" +#include "../include/timer.h" +#include "../include/obstacle.h" void afficherScore(int score) { char scoreStr[20]; /* Efface l'ancien score */ ChoisirCouleurDessin(CouleurParComposante(0, 0, 0)); - RemplirRectangle(178, 946, 200, 40); + RemplirRectangle(178, 946, 130, 40); /* Convertit le score en chaîne de caractères */ snprintf(scoreStr, sizeof(scoreStr), "%d", score); /* Affiche le nouveau score */ ChoisirCouleurDessin(CouleurParComposante(255, 255, 255)); - EcrireTexte(178, 976, scoreStr, 2); + EcrireTexte(179, 976, scoreStr, 2); } void lancer_jeu1(void) { - struct timespec delai = {0, 55000000}; /* A SUPPRIMER QUAND ON AURA LA FONCTION ATTENDRE*/ Segment serpent[100]; int longueur = 10; int direction_x = 1; @@ -35,12 +35,14 @@ void lancer_jeu1(void) { FermerGraphique(); InitialiserGraphique(); CreerFenetre(0, 0, 1200, 1000); + ChoisirTitreFenetre("Snake By Moncef & Marco"); initialiserSerpent(serpent, &longueur); dessinerGrille(); pomme = creerPomme(); dessinerPomme(pomme); + while (1) { gestionDeplacements(serpent, &direction_x, &direction_y); @@ -56,26 +58,28 @@ void lancer_jeu1(void) { if (tuerSerpent(serpent, longueur)) { int choixGameOver; afficherMenuGameOver(); - + afficherScore(score); /* Attend le choix du joueur après le game over */ choixGameOver = attendreChoixGameOver(); } + + dessinerSerpent(serpent, &longueur); afficherScore(score); - - nanosleep(&delai, NULL); + + attendreSerpent(150000); } } void lancer_jeu2(void) { - struct timespec delai = {0, 55000000}; /*50 000 000 nanosecondes (0.05 seconde)*/ int i; Segment serpent[100]; int longueur = 10; int direction_x = 1; int direction_y = 0; + unsigned long int vitesse = 200000; /*vitesse de base*/ int score = 0; char scoreStr[20]; Pomme pommes[5]; @@ -83,6 +87,7 @@ void lancer_jeu2(void) { FermerGraphique(); InitialiserGraphique(); CreerFenetre(0, 0, 1200, 1000); + ChoisirTitreFenetre("Snake By Moncef & Marco"); initialiserSerpent(serpent, &longueur); dessinerGrille(); @@ -117,73 +122,27 @@ void lancer_jeu2(void) { afficherScore(score); - nanosleep(&delai, NULL); + attendreSerpent(vitesse); } } -void lancer_jeu3(void) { - struct timespec delai = {0, 40000000}; /*40 000 000 nanosecondes (0.04 seconde)*/ - Segment serpent[100]; - int longueur = 10; - int direction_x = 1; - int direction_y = 0; - int score = 0; - char scoreStr[20]; - Pomme pomme; - - FermerGraphique(); - InitialiserGraphique(); - CreerFenetre(0, 0, 1200, 1000); - - initialiserSerpent(serpent, &longueur); - dessinerGrille(); - - pomme = creerPomme(); - dessinerPomme(pomme); - - while (1) { - gestionDeplacements(serpent, &direction_x, &direction_y); - mettreAJourSerpent(serpent, &longueur, &direction_x, &direction_y); - - if (serpent[0].x == pomme.x && serpent[0].y == pomme.y) { - longueur++; - score += 5; - pomme = creerPomme(); - dessinerPomme(pomme); - } - - if (tuerSerpent(serpent, longueur)) { - int choixGameOver; - afficherMenuGameOver(); - - /* Attend le choix du joueur après le game over */ - choixGameOver = attendreChoixGameOver(); - } - - dessinerSerpent(serpent, &longueur); - - afficherScore(score); - - /*Permet de gérer la vitesse du serpent*/ - nanosleep(&delai, NULL); - } -} - void lancer_jeu4(void) { - struct timespec delai = {0, 28000000}; /*40 000 000 nanosecondes (0.04 seconde)*/ - Segment serpent[100]; int longueur = 10; int direction_x = 1; int direction_y = 0; int score = 0; + unsigned long int vitesse = 300000; /*vitesse de base*/ char scoreStr[20]; Pomme pomme; - + Segment serpent[100]; + FermerGraphique(); InitialiserGraphique(); CreerFenetre(0, 0, 1200, 1000); + ChoisirTitreFenetre("Snake By Moncef & Marco"); + initialiserSerpent(serpent, &longueur); dessinerGrille(); @@ -199,6 +158,9 @@ void lancer_jeu4(void) { score += 5; pomme = creerPomme(); dessinerPomme(pomme); + + /* Augmenter la vitesse à chaque pomme mangée*/ + vitesse -= 5000; /* Réduire la durée d'attente (augmenter la vitesse)*/ } if (tuerSerpent(serpent, longueur)) { @@ -209,13 +171,98 @@ void lancer_jeu4(void) { choixGameOver = attendreChoixGameOver(); } - dessinerSerpent(serpent, &longueur); - + dessinerSerpent(serpent, &longueur); afficherScore(score); - /*Permet de gérer la vitesse du serpent*/ - nanosleep(&delai, NULL); + attendreSerpent(vitesse); } } +void lancer_jeu3(void) { + int i,j; + int longueur = 10; + int direction_x = 1; + int direction_y = 0; + int score = 0; + unsigned long int vitesse = 100000; + char scoreStr[20]; + Pomme pomme; + int nombreObstacles = 10; + Obstacle *obstacles = malloc(nombreObstacles * sizeof(Obstacle)); + Segment serpent[100]; + + + FermerGraphique(); + InitialiserGraphique(); + CreerFenetre(0, 0, 1200, 1000); + ChoisirTitreFenetre("Snake By Moncef & Marco"); + + initialiserSerpent(serpent, &longueur); + dessinerGrille(); + + pomme = creerPomme(); + dessinerPomme(pomme); + + placerObstacle(obstacles, nombreObstacles, LARGEUR_GRILLE, HAUTEUR_GRILLE); + + while (1) { + gestionDeplacements(serpent, &direction_x, &direction_y); + mettreAJourSerpent(serpent, &longueur, &direction_x, &direction_y); + + if (serpent[0].x == pomme.x && serpent[0].y == pomme.y) { + longueur++; + score += 5; + pomme = creerPomme(); + dessinerPomme(pomme); + + + vitesse -= 5000; + } + + if (tuerSerpent(serpent, longueur)) { + int choixGameOver; + afficherMenuGameOver(); + afficherScore(score); + /* Attend le choix du joueur après le game over */ + choixGameOver = attendreChoixGameOver(); + } + + /*Vérifier la collision avec les obstacles*/ + for (i = 0; i < nombreObstacles; i++) { + if (estCollisionObstacle(obstacles[i], serpent, longueur)) { + int choixGameOver; + afficherMenuGameOver(); + + /* Attend le choix du joueur après le game over */ + choixGameOver = attendreChoixGameOver(); + if (choixGameOver == 1) { + /*Réinitialiser le jeu*/ + longueur = 10; + score = 0; + vitesse = 28000000; + initialiserSerpent(serpent, &longueur); + dessinerGrille(); + pomme = creerPomme(); + dessinerPomme(pomme); + placerObstacle(obstacles, nombreObstacles, LARGEUR_GRILLE, HAUTEUR_GRILLE); + } else if (choixGameOver == 2) { + FermerGraphique(); + } + } + } + + /*Dessiner le serpent et les obstacles*/ + dessinerSerpent(serpent, &longueur); + for (j = 0; j < nombreObstacles; j++) { + dessinerObstacle(obstacles[j]); + } + + afficherScore(score); + + /*Attendre en fonction de la vitesse actuelle*/ + attendreSerpent(vitesse); + +} +free(obstacles); +} diff --git a/src/main.c b/src/main.c index 9abc3e3..027b08e 100644 --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,7 @@ int main(void) { int choixModesDeJeu = 0; InitialiserGraphique(); CreerFenetre(0, 0, 1200, 1000); + ChoisirTitreFenetre("Snake By Moncef & Marco"); while (1) { @@ -35,6 +36,5 @@ int main(void) { return EXIT_SUCCESS; } } - return EXIT_SUCCESS; } diff --git a/src/menu.c b/src/menu.c index 0fef9e9..3b7b8f5 100644 --- a/src/menu.c +++ b/src/menu.c @@ -22,10 +22,10 @@ void afficherMenuModesDeJeu() { ChargerImageFond("../img/modes_de_jeu.png"); /* Affiche les boutons des modes de jeu */ - afficherBouton(38.7, 639.9, 280.3, 742.9, "Classique", CouleurParComposante(168, 116, 67), CouleurParNom("nom_de_la_couleur_bordure"), CouleurParNom("nom_de_la_couleur_texte"), 2); - afficherBouton(332.6, 639.9, 574.2, 742.9, "MultiPommes", CouleurParComposante(168, 116, 67), CouleurParNom("nom_de_la_couleur_bordure"), CouleurParNom("nom_de_la_couleur_texte"), 2); - afficherBouton(626.2, 639.9, 867.8, 742.9, "Rapide", CouleurParComposante(168, 116, 67), CouleurParNom("nom_de_la_couleur_bordure"), CouleurParNom("nom_de_la_couleur_texte"), 2); - afficherBouton(919.7, 639.9, 1161.3, 742.9, "Ultra rapide", CouleurParComposante(168, 116, 67), CouleurParNom("nom_de_la_couleur_bordure"), CouleurParNom("nom_de_la_couleur_texte"), 2); + afficherBouton(38.7, 639.9, 280.3, 742.9, "Classique", CouleurParComposante(168, 116, 67), CouleurParNom("black"), CouleurParNom("black"), 2); + afficherBouton(332.6, 639.9, 574.2, 742.9, "MultiPommes", CouleurParComposante(168, 116, 67), CouleurParNom("black"), CouleurParNom("black"), 2); + afficherBouton(626.2, 639.9, 867.8, 742.9, "Obstacles", CouleurParComposante(168, 116, 67), CouleurParNom("black"), CouleurParNom("black"), 2); + afficherBouton(919.7, 639.9, 1161.3, 742.9, "Acceleration", CouleurParComposante(168, 116, 67), CouleurParNom("black"), CouleurParNom("black"), 2); } @@ -116,7 +116,8 @@ int attendreChoixMenu(){ void afficherBouton(double x1, double y1, double x2, double y2, const char *texte, couleur arriere_plan, couleur bordure, couleur couleur_texte, int taille_texte) { /* Copie la chaîne constante dans une nouvelle chaîne non constante */ - char *texte_modifiable = strdup(texte); + char *texte_modifiable = malloc(strlen((const char *)texte) + 1); + strcpy(texte_modifiable, (const char *)texte); /* Affiche le bouton avec la couleur d'arrière-plan spécifiée */ ChoisirCouleurDessin(arriere_plan); diff --git a/src/obstacle.c b/src/obstacle.c new file mode 100644 index 0000000..434b90e --- /dev/null +++ b/src/obstacle.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include "../include/grille.h" +#include "../include/serpent.h" +#include "../include/obstacle.h" +#include "../include/pomme.h" + + + +void dessinerObstacle(Obstacle obstacle) { + ChoisirCouleurDessin(CouleurParComposante(10, 10, 10)); /*choix de la couleur de l'opstacle */ + RemplirRectangle(obstacle.x * TAILLE_CASE, obstacle.y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); +} + + +int estCollisionObstacle(Obstacle obstacle, Segment serpent[], int longueur) { + int i; + for (i = 0; i < longueur; i++) { + if (serpent[i].x == obstacle.x && serpent[i].y == obstacle.y) { + return 1; /*Collision avec un obstacle*/ + } + } + return 0; /*Pas de collision*/ +} + +Obstacle creerObstacle(int largeurGrille, int hauteurGrille) { + Obstacle obstacle; + obstacle.x = rand() % largeurGrille; + obstacle.y = rand() % hauteurGrille; + return obstacle; +} + +void placerObstacle(Obstacle obstacles[], int nombreObstacles, int largeurGrille, int hauteurGrille) { + int i; + for (i = 0; i < nombreObstacles; i++) { + obstacles[i] = creerObstacle(largeurGrille, hauteurGrille); + } +} + diff --git a/src/serpent.c b/src/serpent.c index cba968b..434a08b 100644 --- a/src/serpent.c +++ b/src/serpent.c @@ -1,6 +1,7 @@ #include #include #include "../include/serpent.h" +#include "../include/main.h" #define TAILLE_CASE 20 #define LARGEUR_GRILLE 60 #define HAUTEUR_GRILLE 40 @@ -8,9 +9,12 @@ void initialiserSerpent(Segment serpent[], int *longueur) { int i; + int centreX = LARGEUR_GRILLE / 2; + int centreY = HAUTEUR_GRILLE / 2; + for (i = 0; i < 10; ++i) { - serpent[i].x = 10 - i; - serpent[i].y = 10; + serpent[i].x = centreX - i; + serpent[i].y = centreY; } *longueur = 10; @@ -32,7 +36,10 @@ void gestionDeplacements(Segment serpent[], int *direction_x, int *direction_y) } else if (touche == XK_Right && *direction_x == 0) { *direction_x = 1; *direction_y = 0; - } + } else if (touche == XK_Escape) { + FermerGraphique(); + main(); + } } } @@ -59,20 +66,28 @@ void mettreAJourSerpent(Segment serpent[], int *longueur, int *direction_x, int int i; int ancienX = serpent[*longueur - 1].x; int ancienY = serpent[*longueur - 1].y; + + /* Déterminer la couleur de fond en fonction de la position de la case dans la grille */ couleur couleurFond = (ancienX + ancienY) % 2 == 0 ? CouleurParComposante(170, 215, 82) : CouleurParComposante(180, 220, 90); + /* Remplir la case avec la couleur de fond appropriée */ ChoisirCouleurDessin(couleurFond); RemplirRectangle(ancienX * TAILLE_CASE, ancienY * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); + /* Remplir la case avec la couleur de la grille à cet endroit précis */ + ChoisirCouleurDessin(CouleurParComposante(170, 215, 82)); + RemplirRectangle(0, 0, TAILLE_CASE, TAILLE_CASE); + for (i = *longueur - 1; i > 0; --i) { serpent[i] = serpent[i - 1]; } serpent[0].x += *direction_x; serpent[0].y += *direction_y; - tuerSerpent(serpent,*longueur); /*Appeler la fonction pour vérifier si le serpent est mort*/ + tuerSerpent(serpent, *longueur); /*Appeler la fonction pour vérifier si le serpent est mort*/ } + void dessinerSerpent(Segment serpent[], int *longueur) { int i; for (i = 0; i < *longueur; ++i) { @@ -80,3 +95,10 @@ void dessinerSerpent(Segment serpent[], int *longueur) { RemplirRectangle(serpent[i].x * TAILLE_CASE, serpent[i].y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } + +void attendreSerpent(unsigned long int microseconds) { + unsigned long int attente_jusqu_a = Microsecondes() + microseconds; + while (Microsecondes() < attente_jusqu_a) { + /*Attendre jusqu'au temps données en paramètre de la fonction*/ + } +} \ No newline at end of file diff --git a/src/timer.c b/src/timer.c index d75bde4..8362f2d 100644 --- a/src/timer.c +++ b/src/timer.c @@ -3,16 +3,15 @@ #include #define cycle 1000000L -unsigned long int attendre(void){ - int x=1; +unsigned long int attendre(void) { unsigned long int temps_pause; - unsigned long int t1=Microsecondes(); - while(x==1){ - if(Touche()==XK_space){ - x=0; + unsigned long int t1 = Microsecondes(); + while (1) { + if (ToucheEnAttente() && Touche() == XK_space) { + break; } } - temps_pause=Microsecondes()-t1; + temps_pause = Microsecondes() - t1; return temps_pause; } @@ -68,7 +67,6 @@ void creer_timer(void){ while(x=1){ if(Microsecondes()>seconde){ sec++; - printf("%d\n",sec); afficher_seconde(sec); seconde=Microsecondes()+cycle; if(sec==60){ @@ -90,6 +88,7 @@ void creer_timer(void){ } } +/* int main(void){ InitialiserGraphique(); CreerFenetre(1000,0,1000,1000); @@ -97,3 +96,4 @@ int main(void){ FermerGraphique(); return EXIT_SUCCESS; } +*/ \ No newline at end of file