diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e69de29 diff --git a/evenement.c b/evenement.c new file mode 100644 index 0000000..a3cf5e9 --- /dev/null +++ b/evenement.c @@ -0,0 +1,91 @@ +#include <graph.h> +#include <stdio.h> +#include <stdlib.h> +#include "main.h" + + +void AfficherTimerEtScore(int m,int n,int score) /*Afficher le temps passé et le score*/ +{ + char buf[100]; + char buff[100]; + couleur j; + j=CouleurParNom("yellow"); + ChoisirCouleurDessin(j); + + ChoisirEcran(1); + CopierZone(2,1,0,0,930,710,0,0); + snprintf(buf,100,"temps : %02d:%02d",m,n); + snprintf(buff,100,"SCORE : %07d",score); + EcrireTexte(60,650,buf,2); + EcrireTexte(600,650,buff,2); + CopierZone(1,0,0,0,930,710,0,0); +} + + +void MangerPastille(int *serpent, int* pastilles, int longueur_serpent, int longueur_pastilles) + { + int i = 0; + + for(i=0;i<longueur_pastilles;i+=2) + { + if(serpent[0] == pastilles[i] && serpent[1] == pastilles[i+1]) + { + + } + } + + } + +void DeplacementSerpent(int direction ,int *serpent, int longueur) +{ + int tempX = serpent[0]; + int tempY = serpent[1]; + int i; + couleur g; + couleur j; + ChoisirEcran(2); + j=CouleurParNom("yellow"); + g=CouleurParNom("lightgreen"); + + ChoisirCouleurDessin(g); + RemplirRectangle(serpent[longueur-2],serpent[longueur-1],T_PIXEL,T_PIXEL); + + for (i = 2; i < longueur; i += 2) { + int tempX2 = serpent[i]; + int tempY2 = serpent[i + 1]; + + serpent[i] = tempX; + serpent[i + 1] = tempY; + + tempX = tempX2; + tempY = tempY2; + } + + ChoisirCouleurDessin(j); + if(direction == 0) /* Direction vers la gauche */ + { + printf("Gauche %d\n",direction); + serpent[0]-=T_PIXEL; + + RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); + printf("Longueur = %d | x %d | y %d",longueur,serpent[longueur-1],serpent[longueur-2]); + } + else if(direction == 1) /* Direction vers le haut */ + { + printf("Haut %d\n",direction); + serpent[1]-=T_PIXEL; + RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); + } + else if(direction == 2) /* Direction vers la droite */ + { + printf("Droite %d\n",direction); + serpent[0]+=T_PIXEL; + RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); + } + else if(direction == 3) /* Direction vers le bas */ + { + printf("Bas %d\n",direction); + serpent[1]+=T_PIXEL; + RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); + } +} \ No newline at end of file diff --git a/evenement.h b/evenement.h new file mode 100644 index 0000000..274b155 --- /dev/null +++ b/evenement.h @@ -0,0 +1,6 @@ + +void AfficherTimerEtScore(int m,int n,int score); + +void MangerPastille(int *serpent, int* pastilles, int longueur_serpent, int longueur_pastilles); + +void DeplacementSerpent(int direction ,int *serpent, int longueur); \ No newline at end of file diff --git a/graph.h b/graph.h new file mode 100644 index 0000000..8244e09 --- /dev/null +++ b/graph.h @@ -0,0 +1,149 @@ +#ifndef _GRAPH_H +#define _GRAPH_H + +#include<X11/Xlib.h> +#include<X11/Xutil.h> +#include<X11/keysym.h> + +extern int _X; +extern int _Y; + +#define NB_PIXMAP 10 + +typedef unsigned long couleur; +typedef XPoint Point; + +int InitialiserGraphique(); +/* initialise le mode graphique : renvoie 1 en cas de succes, 0 sinon */ + +int CreerFenetre(int posx,int posy,int X,int Y); +/* creer la fenetre graphique de largeur X et longueur Y, et la positionne + sur l'ecran au point (posx,posy). Une seule fenetre autoris�e */ + +void ChoisirTitreFenetre(char *s); +/* change le titre de la fenetre */ + +void ChoisirCurseur(unsigned int forme); +/* change le curseur de la fenetre */ + +void CacherFenetre(void); +/* cache la fenetre */ + +void AfficherFenetre(void); +/* affiche la fenetre */ + +void ChoisirEcran(int n); +/* fixe l'ecran ou le dessin est effectue : cette ecran est soit 0 (la fenetre + visible, ecran par defaut au demarrage), soit le numero de l'�cran virtuel correspondant */ + +void ChoisirCouleurDessin(couleur c); +/* fixe la couleur qui sert au dessin */ + +couleur CouleurParNom(char * nom); +/* fait la traduction d'une couleur a partir de son nom : le fichier rgb.txt + contient la liste des couleurs accessibles via leur nom */ + +couleur CouleurParComposante(unsigned char r, unsigned char v,unsigned char b); +/* renvoie la couleur d�finie par ses trois composantes */ + +int Maxx(); +/* renvoie la largeur de l'ecran : il faut que le mode graphique ait �t� + initialise !!! */ + +int Maxy(); +/* renvoie la hauteur de l'ecran : il faut que le mode graphique ait �t� + initialise !!! */ + +void DessinerPixel(int x,int y); +/* allume un pixel avec la couleur de dessin */ + +void DessinerSegment(int x,int y,int xx,int yy); +/* idem precedent, mais avec la couleur de dessin */ + +void DessinerSegments(Point * sommets,int nb_sommets); +/* trace pour chaque paire sommet[i],sommet[i+1] le segment correspondant. Si le deux extr�mit�s correspondent, le polygone est ferm� */ + +void DessinerRectangle(int x,int y,int l,int h); +/* idem, mais utilise la couleur de dessin */ + +void RemplirRectangle(int x,int y,int l,int h); +/* trace un rectangle plein, rempli avec c */ + +void DessinerArc(int x,int y,int l,int h,int angle1,int angle2); +/* idem, mais utilise la couleur de dessin */ + +void RemplirArc(int x,int y,int l,int h,int angle1,int angle2); +/* trace un arc plein avec c */ + +void RemplirTriangle(int x,int y,int xx,int yy,int xxx,int yyy); +/* trace un triangle plein */ + +void RemplirPolygone(Point * sommets,int nb_sommet); +/* Trace un polygone plein d�fini par son tableau de sommets. Si les extremit�s ne coincident pas, le polygone est ferm� automatiquement. +*/ + +int ToucheEnAttente(); +/* renvoie 1 si une touche a �t� enfonc�e, 0 sinon */ + +KeySym Touche(); +/* renvoie la premiere touche du tampon : cette fonction est bloquante => + utiliser ToucheEnAttente pour la rendre non bloquante */ + +void EcrireTexte(int x,int y,char *texte,int taille); +/* ecrit la chaine texte au point (x,y) : taille indique la taille (0<->petit,1<->moyen,2<->grand) */ +#ifdef HAVE_XPM +void SauverImage(char * file,int x,int y,int l,int h); +/* sauvegarde d'une partie de la fenetre (x,y,x+l,y+h) au format xpm */ +#endif + +int ChargerImage(char *file,int x,int y,int xx,int yy,int l,int h); +/* charge une partie (xx,yy,xx+l,yy+h) d'image au format xpm dans +la fenetre a la position (x,y) */ + +void ChargerImageFond(char *file); +/* charge une image qui remplit le fond de la fen\^etre, en la r\'ep\'etant si necessaire */ + +void EffacerEcran(couleur c); +/* efface l'ecran avec la couleur c*/ + +void ChoisirModeDessin(int m); +/* fixe le mode d'affichage : 0<->ecrasement 1<->xor */ + +int TailleChaineEcran(char *t,int taile); +/* renvoie, en pixel, la taille horizontale occupee par la chaine � l'�cran :taille est la taille de la police (0,1,2) */ + +int TailleSupPolice(int taille); +/* renvoie la taiile maximale de la police, en pixel, au dessus de la ligne d'�criture */ + +int TailleInfPolice(int taille); +/* renvoie la taille maximale de la police, en pixel, en dessous de la ligne d'�criture */ + +void CopierZone(int src,int dst,int ox,int oy,int L,int H,int dx,int dy); +/* copie une zone de l'�cran vers l'�cran dst. La zone copi�e est le rectangle delimite par le coin superieure hauche (ox,oy) et sa largeur l et hauteur h. Cette zone est copi� au point (dx,dy) de l'ecran dst */ + +void FermerGraphique(); +/* fermeture du mode graphique */ + +unsigned long Microsecondes(); +/* renvoie le nombre de microsecondes ecoul�es depuis le +lancement du programme */ + +void SourisPosition(); +/* recupere les coordonnees de la souris dans la fenetre et les place dans _X et _Y*/ + +int SourisCliquee(); +/* indique un clic de souris (1 si oui, 0 sinon), et recupere si c'est le cas la position au moment du clic dans _X et _Y */ + + +/* fonctions a r��crire proprement */ + +int ChargerSprite(char *file); +/* charge un srpite en m�moire, et renvoie son num�ro + * -1 en cas d'echec */ +void AfficherSprite(int n,int x,int y); +/* affiche le sprite correspondant � son num�ro */ +void LibererSprite(int n); +/* libere les ressources associ�es au sprite + * n */ + +#endif diff --git a/main.c b/main.c index 289aa91..c9710cb 100644 --- a/main.c +++ b/main.c @@ -2,6 +2,8 @@ #include <stdio.h> #include <graph.h> #include <time.h> +#include "evenement.h" + #define W_WINDOW 930 /* Largeur de la fenêtre*/ #define H_WINDOW 710 /* Hauteur de la fenêtre*/ @@ -15,82 +17,6 @@ #define delta 100000L - -void Affichertimeretscore(int m,int n,int score) /*Afficher le temps passé et le score*/ -{ - char buf[100]; - char buff[100]; - couleur j; - j=CouleurParNom("yellow"); - ChoisirCouleurDessin(j); - - ChoisirEcran(1); - CopierZone(2,1,0,0,930,710,0,0); - snprintf(buf,100,"temps : %02d:%02d",m,n); - snprintf(buff,100,"SCORE : %07d",score); - EcrireTexte(60,650,buf,2); - EcrireTexte(600,650,buff,2); - CopierZone(1,0,0,0,930,710,0,0); -} -void grandirserpent(int *serpent) - { - - } - -void DeplacementSerpent(int direction ,int *serpent, int longueur) -{ - int tempX = serpent[0]; - int tempY = serpent[1]; - int i; - couleur g; - couleur j; - ChoisirEcran(2); - j=CouleurParNom("yellow"); - g=CouleurParNom("lightgreen"); - - ChoisirCouleurDessin(g); - RemplirRectangle(serpent[longueur-2],serpent[longueur-1],T_PIXEL,T_PIXEL); - - for (i = 2; i < longueur; i += 2) { - int tempX2 = serpent[i]; - int tempY2 = serpent[i + 1]; - - serpent[i] = tempX; - serpent[i + 1] = tempY; - - tempX = tempX2; - tempY = tempY2; - } - - ChoisirCouleurDessin(j); - if(direction == 0) /* Direction vers la gauche */ - { - printf("Gauche %d\n",direction); - serpent[0]-=T_PIXEL; - - RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); - printf("Longueur = %d | x %d | y %d",longueur,serpent[longueur-1],serpent[longueur-2]); - } - else if(direction == 1) /* Direction vers le haut */ - { - printf("Haut %d\n",direction); - serpent[1]-=T_PIXEL; - RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); - } - else if(direction == 2) /* Direction vers la droite */ - { - printf("Droite %d\n",direction); - serpent[0]+=T_PIXEL; - RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); - } - else if(direction == 3) /* Direction vers le bas */ - { - printf("Bas %d\n",direction); - serpent[1]+=T_PIXEL; - RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); - } -} - 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 */ @@ -102,7 +28,7 @@ int ArrondirPixel(int nombre) /* Calcule un arrondi du pixel pour pouvoir respec return arrondi; } -void gen_pastille(int nb_pastille, int *p_pastilles) /* Ajout des pointeurs pour le futur tableau de pastilles */ +void gen_pastille(int nb_pastille, int *p_pastilles) /* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/ /*Générer une pastille dans la grid*/ @@ -243,7 +169,7 @@ int main() direction = 3; if(direction_davant == 1 && direction == 3) { - direction = direction_davant; + direction = direction_davant; /* Changements de direction du serpent*/ } break; case XK_Left: @@ -260,12 +186,12 @@ int main() direction = direction_davant; } break; - + case XK_space: if(pause == 0) { pause = 1 ; - } + } /* Faire pause */ else if(pause == 1) { pause = 0; @@ -290,9 +216,11 @@ int main() n=0; } - Affichertimeretscore(m,n,score); + AfficherTimerEtScore(m,n,score); suivant=Microsecondes()+delta; - direction_davant = direction; + + direction_davant = direction; /* Check si le serpent à le droit de changer de direction */ + MangerPastille(serpent,pastilles,longueur_serpent,longueur_pastilles); DeplacementSerpent(direction,serpent,longueur_serpent); diff --git a/main.h b/main.h new file mode 100644 index 0000000..6adf711 --- /dev/null +++ b/main.h @@ -0,0 +1,11 @@ +#ifndef MAIN_H +#define MAIN_H + +#define W_WINDOW 930 +#define H_WINDOW 710 +#define W_GAME 900 +#define H_GAME 600 +#define T_PIXEL 15 +#define DECALEMENT 30 + +#endif \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..8613644 --- /dev/null +++ b/makefile @@ -0,0 +1,16 @@ +CC = gcc +CFLAGS = -Wall -Wextra + +all: prog + +prog: main.o evenement.o + $(CC) -ansi -pedantic -o $@ $^ -lgraph + +main.o: main.c evenement.h + $(CC) $(CFLAGS) -c $< -o $@ + +evenement.o: evenement.c evenement.h + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -f *.o prog diff --git a/prog b/prog index c91a7e7..9d969cf 100755 Binary files a/prog and b/prog differ