diff --git a/Makefile b/Makefile index 1747d20..1ea5a49 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CFLAGS = -Wall -Wextra all: prog -prog: main.o evenement.o GUI.o +prog: main.o evenement.o gui.o scene.o $(CC) -o $@ $^ -lgraph main.o: main.c evenement.h @@ -12,8 +12,12 @@ main.o: main.c evenement.h evenement.o: evenement.c evenement.h $(CC) $(CFLAGS) -c $< -o $@ -GUI.o: GUI.c GUI.h +gui.o: gui.c gui.h $(CC) $(CFLAGS) -c $< -o $@ +scene.o: scene.c scene.h + $(CC) $(CFLAGS) -c $< -o $@ + + clean: rm -f *.o prog diff --git a/evenement.c b/evenement.c index 2bc7c50..6c39fb1 100644 --- a/evenement.c +++ b/evenement.c @@ -3,7 +3,8 @@ #include <stdlib.h> #include <time.h> #include "main.h" -#include "GUI.h" +#include "gui.h" +#include "scene.h" void AfficherTimerEtScore(long unsigned int *score, int minutes,int secondes) /*Afficher le temps passé et le score*/ { @@ -25,17 +26,6 @@ void AfficherTimerEtScore(long unsigned int *score, int minutes,int secondes) CopierZone(1,0,0,0,930,710,0,0); } -void InitialiserPastilles(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent) { - int i; - - srand(time(NULL)); - - for (i = 0; i < PASTILLES; i++) { - pastilles[i] = gen_pastille(serpent,pastilles,longueur_serpent); - ChargerImage("./images/PommePastille.png",pastilles[i].x,pastilles[i].y,0,0,T_PIXEL,T_PIXEL); - } -} - int MourrirSerpent(PIXELS *serpent, int longueur_serpent) { int i = 0; @@ -94,7 +84,6 @@ void DeplacementSerpent(int direction ,PIXELS *serpent, int longueur) tempY = tempY2; } - if(direction == 0) /* Direction vers la gauche */ { serpent[0].x-=T_PIXEL; @@ -117,7 +106,7 @@ void DeplacementSerpent(int direction ,PIXELS *serpent, int longueur) } } -int Serpent(PIXELS *serpent,PIXELS *pastilles,unsigned long *score,int *longueur_serpent,unsigned long int *vitesse,int direction) +int Serpent(PIXELS *serpent,PIXELS *pastilles,unsigned long *score,unsigned long *longueur_serpent,unsigned long int *vitesse,int direction) { if(MourrirSerpent(serpent,*longueur_serpent) == 1) { diff --git a/evenement.h b/evenement.h index 3fbd7c7..ea85f25 100644 --- a/evenement.h +++ b/evenement.h @@ -15,7 +15,7 @@ int PastilleSurSerpent(PIXELS pastille, PIXELS *serpent, int longueur_serpent); int MourrirSerpent(PIXELS *serpent, int longueur_serpent); -int Serpent(PIXELS *serpent,PIXELS *pastilles,unsigned long *score,int *longueur_serpent,unsigned long int *vitesse,int direction); +int Serpent(PIXELS *serpent,PIXELS *pastilles,unsigned long *score,unsigned long *longueur_serpent,unsigned long int *vitesse,int direction); #endif \ No newline at end of file diff --git a/gui.c b/gui.c new file mode 100644 index 0000000..f887ed0 --- /dev/null +++ b/gui.c @@ -0,0 +1,21 @@ +#include <stdlib.h> +#include <stdio.h> +#include <graph.h> + +void Menu() +{ + ChoisirEcran(0); + ChargerImage("./images/Menu.png",0,0,0,0,930,710); +} + +void Pause() +{ + ChoisirEcran(0); + ChargerImage("./images/Pause.png",0,0,0,0,930,710); +} + +void PerduGUI() +{ + ChoisirEcran(0); + ChargerImage("./images/Perdu.png",0,0,0,0,930,710); +} \ No newline at end of file diff --git a/gui.h b/gui.h new file mode 100644 index 0000000..007bbaf --- /dev/null +++ b/gui.h @@ -0,0 +1,10 @@ +#ifndef GUI_H +#define GUI_H + +void Menu(); +void PerduGUI(); +void Pause(); +void Reinitialiser(); +int AfficherGUI(unsigned char menu); + +#endif \ No newline at end of file diff --git a/images/PERDU.png b/images/Perdu.png similarity index 100% rename from images/PERDU.png rename to images/Perdu.png diff --git a/main.c b/main.c index d770ff0..6c51310 100644 --- a/main.c +++ b/main.c @@ -4,107 +4,12 @@ #include <time.h> #include "evenement.h" #include "main.h" -#include "GUI.h" +#include "gui.h" +#include "scene.h" #define DELTA 100000L #define DELTA2 1000000L -int ArrondirPixel(int nombre) /* Calcule un arrondi du pixel pour pouvoir respecter la norme des 40 lignes et 60 colonnes */ -{ - /* Calcul du reste de la division par 15 */ - int reste = nombre % 15; - - /* Calcul de l'arrondi au multiple de 15 le plus proche */ - int arrondi = (reste <= 7) ? nombre - reste : nombre + (15 - reste); - - return arrondi; -} - -PIXELS gen_pastille(PIXELS *serpent,PIXELS *pastilles,int longueur_serpent) - - /* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/ - /*-Elles se génèrent à des endroits qui peuvent être les mêmes ou gêner le snake*/ -{ - int x_pastille,y_pastille,i; - int ok = 0; - PIXELS pastille; - do{ - ok = 0; - x_pastille= ArrondirPixel(rand()%W_GAME); - y_pastille = ArrondirPixel(rand()%H_GAME); - for(i=0;i<longueur_serpent;i++) - { - if(x_pastille == serpent[i].x && y_pastille == serpent[i].y) - { - ok = 1; /* Check si la pastille se genère sur une coordonné du serpent */ - } - if(x_pastille == pastilles[i].x && y_pastille == pastilles[i].y) - { - ok = 1; - } - - } - }while(ok); - - if(x_pastille < DECALEMENT) - { - x_pastille =+ DECALEMENT; - } - - if(y_pastille < DECALEMENT) - { - y_pastille =+ DECALEMENT; - } - - - pastille.x = x_pastille ; - pastille.y = y_pastille ; - - return pastille; -} - -void InitialisationDuSerpent(PIXELS *p_serpent) /* L'initialisation du serpent */ -{ - int x_millieu = 0, y_millieu = 0 , compteur = 0; - x_millieu = T_PIXEL*30; /* 30 = 60 colonnes divisé par 2*/ - y_millieu = T_PIXEL*20; /* 20 = 40 colonnes divisé par 2*/ - ChoisirEcran(2); - ChargerImage("./images/SnakePart.png",x_millieu,y_millieu,0,0,T_PIXEL,T_PIXEL); - - p_serpent[0].x = x_millieu; - p_serpent[0].y = y_millieu; - for(compteur=0;compteur<9;compteur++) /*Commence par 1 car p_serpent index 0 initialisées pour la tête et 2 + 2x9 = 10 couples de coordonnées 2D */ - { - p_serpent[compteur+1].x = p_serpent[compteur].x+T_PIXEL; - p_serpent[compteur+1].y = p_serpent[compteur].y; - - ChargerImage("./images/SnakePart.png",p_serpent[compteur+1].x,p_serpent[compteur+1].y,0,0,T_PIXEL,T_PIXEL); - } -} - -void DessinerScene(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent) /* Dessine la scène */ -{ - couleur bg; - couleur border; - ChoisirEcran(2); - border=CouleurParComposante(78, 93, 47); - bg=CouleurParComposante(171, 204, 104); - - ChoisirCouleurDessin(border); - RemplirRectangle(0,0,930,630); - - ChoisirCouleurDessin(bg); - RemplirRectangle(0,630,930,650); - - ChoisirCouleurDessin(border); - RemplirRectangle(0,650,930,15); - - ChoisirCouleurDessin(bg); - RemplirRectangle(T_PIXEL,T_PIXEL,W_GAME,H_GAME); - InitialiserPastilles(pastilles,serpent,longueur_serpent); - InitialisationDuSerpent(serpent); -} - int main() { unsigned char pause = 0; @@ -117,6 +22,7 @@ int main() int minutes = 0; unsigned long int vitesse = DELTA; int valeur_retourne = 0; + unsigned char perdu = 0; size_t longueur_serpent = 10; size_t longueur_pastilles = PASTILLES; @@ -141,16 +47,43 @@ int main() DessinerScene(pastilles,serpent,longueur_serpent); while(window_on) { - ChoisirEcran(0); - Menu(); - if (ToucheEnAttente() == 1) + if(perdu == 1) { - switch (Touche()) + PerduGUI(); + if (ToucheEnAttente() == 1) { - case XK_space: - game_on=1; - DessinerScene(pastilles,serpent,longueur_serpent); - break; + switch (Touche()) + { + case XK_Return: + perdu = 0; + break; + } + } + } + else + { + Menu(); + if (ToucheEnAttente() == 1) + { + switch (Touche()) + { + case XK_Return : + game_on=1; + secondes = 0; + minutes = 0; + score = 0; + vitesse = DELTA; + longueur_serpent = 10; + direction = 0; + direction_davant = 0; + DessinerScene(pastilles,serpent,longueur_serpent); + break; + case XK_Escape: + free(serpent); + free(pastilles); + FermerGraphique(); + return EXIT_SUCCESS; + } } } @@ -195,16 +128,23 @@ int main() pause=1; break; } - else if(pause == 1) - { pause=0; break; + + case XK_Escape: + if(pause == 1) + { + free(serpent); + free(pastilles); + FermerGraphique(); + return EXIT_SUCCESS; } - } + break; + } + if(pause==1) { - ChoisirEcran(0); Pause(); } @@ -226,6 +166,7 @@ int main() if (Microsecondes()>suivant) { + serpent = (PIXELS*) realloc(serpent,longueur_serpent * sizeof(PIXELS)); suivant=Microsecondes()+vitesse; AfficherTimerEtScore(&score,minutes,secondes); direction_davant = direction; /* Check si le serpent à le droit de changer de direction */ @@ -233,10 +174,10 @@ int main() valeur_retourne = Serpent(serpent,pastilles,&score,&longueur_serpent,&vitesse,direction); if(valeur_retourne == 1) { - serpent = (PIXELS*) realloc(serpent,longueur_serpent * sizeof(PIXELS)); } else if (valeur_retourne == 2) { + perdu=1; game_on=0; } } @@ -244,7 +185,8 @@ int main() } } } - + free(serpent); + free(pastilles); FermerGraphique(); return EXIT_SUCCESS; } diff --git a/prog b/prog index 3ee3a30..4303411 100755 Binary files a/prog and b/prog differ diff --git a/scene.c b/scene.c new file mode 100644 index 0000000..4c14736 --- /dev/null +++ b/scene.c @@ -0,0 +1,113 @@ +#include <graph.h> +#include <time.h> +#include <stdlib.h> +#include "main.h" + + + +int ArrondirPixel(int nombre) /* Calcule un arrondi du pixel pour pouvoir respecter la norme des 40 lignes et 60 colonnes */ +{ + /* Calcul du reste de la division par 15 */ + int reste = nombre % 15; + + /* Calcul de l'arrondi au multiple de 15 le plus proche */ + int arrondi = (reste <= 7) ? nombre - reste : nombre + (15 - reste); + + return arrondi; +} + +PIXELS gen_pastille(PIXELS *serpent,PIXELS *pastilles,int longueur_serpent) + + /* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/ + /*-Elles se génèrent à des endroits qui peuvent être les mêmes ou gêner le snake*/ +{ + int x_pastille,y_pastille,i; + int ok = 0; + PIXELS pastille; + do{ + ok = 0; + x_pastille= ArrondirPixel(rand()%W_GAME); + y_pastille = ArrondirPixel(rand()%H_GAME); + for(i=0;i<longueur_serpent;i++) + { + if(x_pastille == serpent[i].x && y_pastille == serpent[i].y) + { + ok = 1; /* Check si la pastille se genère sur une coordonné du serpent */ + } + if(x_pastille == pastilles[i].x && y_pastille == pastilles[i].y) + { + ok = 1; + } + + } + }while(ok); + + if(x_pastille < DECALEMENT) + { + x_pastille =+ DECALEMENT; + } + + if(y_pastille < DECALEMENT) + { + y_pastille =+ DECALEMENT; + } + + + pastille.x = x_pastille ; + pastille.y = y_pastille ; + + return pastille; +} + +void InitialisationDuSerpent(PIXELS *p_serpent) /* L'initialisation du serpent */ +{ + int x_millieu = 0, y_millieu = 0 , compteur = 0; + x_millieu = T_PIXEL*30; /* 30 = 60 colonnes divisé par 2*/ + y_millieu = T_PIXEL*20; /* 20 = 40 colonnes divisé par 2*/ + ChoisirEcran(2); + ChargerImage("./images/SnakePart.png",x_millieu,y_millieu,0,0,T_PIXEL,T_PIXEL); + + p_serpent[0].x = x_millieu; + p_serpent[0].y = y_millieu; + for(compteur=0;compteur<9;compteur++) /*Commence par 1 car p_serpent index 0 initialisées pour la tête et 2 + 2x9 = 10 couples de coordonnées 2D */ + { + p_serpent[compteur+1].x = p_serpent[compteur].x+T_PIXEL; + p_serpent[compteur+1].y = p_serpent[compteur].y; + + ChargerImage("./images/SnakePart.png",p_serpent[compteur+1].x,p_serpent[compteur+1].y,0,0,T_PIXEL,T_PIXEL); + } +} + +void InitialiserPastilles(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent) { + int i; + + srand(time(NULL)); + + for (i = 0; i < PASTILLES; i++) { + pastilles[i] = gen_pastille(serpent,pastilles,longueur_serpent); + ChargerImage("./images/PommePastille.png",pastilles[i].x,pastilles[i].y,0,0,T_PIXEL,T_PIXEL); + } +} + +void DessinerScene(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent) /* Dessine la scène */ +{ + couleur bg; + couleur border; + ChoisirEcran(2); + border=CouleurParComposante(78, 93, 47); + bg=CouleurParComposante(171, 204, 104); + + ChoisirCouleurDessin(border); + RemplirRectangle(0,0,930,630); + + ChoisirCouleurDessin(bg); + RemplirRectangle(0,630,930,650); + + ChoisirCouleurDessin(border); + RemplirRectangle(0,650,930,15); + + ChoisirCouleurDessin(bg); + RemplirRectangle(T_PIXEL,T_PIXEL,W_GAME,H_GAME); + InitialiserPastilles(pastilles,serpent,longueur_serpent); + InitialisationDuSerpent(serpent); +} \ No newline at end of file diff --git a/scene.h b/scene.h new file mode 100644 index 0000000..e7ffc2e --- /dev/null +++ b/scene.h @@ -0,0 +1,10 @@ +#include "main.h" + +#ifndef SCENE_H +#define SCENE_H + +void InitialiserPastilles(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent); +PIXELS gen_pastille(PIXELS *serpent,PIXELS *pastilles,int longueur_serpent); +void DessinerScene(PIXELS *pastilles, PIXELS *serpent, int longueur_serpent); + +#endif \ No newline at end of file