From b637d047c921f59e34ce4a300df110a11b8530ce Mon Sep 17 00:00:00 2001 From: Vince <vi.teissier@gmail.com> Date: Sat, 2 Dec 2023 10:05:42 +0100 Subject: [PATCH] =?UTF-8?q?Repartitions=20du=20code=20en=20plusieurs=20fic?= =?UTF-8?q?hier=20(d=C3=A9but=20du=20vrai=20programme)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 0 evenement.c | 91 ++++++++++++++++++++++++++++++++ evenement.h | 6 +++ graph.h | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 92 ++++---------------------------- main.h | 11 ++++ makefile | 16 ++++++ prog | Bin 17152 -> 17192 bytes 8 files changed, 283 insertions(+), 82 deletions(-) create mode 100644 Makefile create mode 100644 evenement.c create mode 100644 evenement.h create mode 100644 graph.h create mode 100644 main.h create mode 100644 makefile 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 c91a7e76b98beff7886539a6e017bb1dcccf25e5..9d969cf13f3d8f96c738d88d8c60be4e00941d70 100755 GIT binary patch delta 2584 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 Nno7f;Mc!3;{{hMKV`TsU delta 2540 zcmZuyYfMx}6uxtJsVqKV0oh%7?P@71%EJesv=z{+S6gGWty<p?P%-#I@EIydP}kKK zJ=LmBQ`;Yv+BRx7wrZ>>Sj7ZwOpF?vrnG9aSXx0v7esHrnY)Y7I>|j}=A84L^Uche z-O4SjWDBe4&oXxn_|3FFSQ2ABnOTzQj;yclxW}_3X7<?iWrrrGd_Vluy@tB$$?uO{ zGb?GsnCx-4md>b2bnh@636=+%=#8*zlpUEcu(rD-sm_ZY?=wwPo#j>y%B3q<AHZ70 zklbT^PM<`^%afkb*+|ETnLwS%fgR8jytXF@k*+;P4&SL%IIpTZd#nEoy4y~DqN1WL zycVKP@?EIT>NDFhshSSqX>UiFXj&N+ltAr>Dmx!ip}G`rj+$VM>yPll0M7)#FV#E@ zj%j;Ob>3B-#a^n58ZzuUkKY+EElA(cR=#v9O)xF>nF@82mnY<VE^MbE(HZigr?eva z)3^gqHLa|;P6{q3)Nv_w&I`aUGj-bJjW$Y(NtAzRqq#AuLk*o>3)(cT!HA<m3RX1L z4}Tii3I1jq)yAaC5pBC;dk0r`_WaRGuf`_!t8Ue_zosFBp=h!{!-CFnyIQFzHnm$G z;wmoHkSTms@^{_z{c;=j>#YKL$&&y&*x@x8FDj3?sbMh4c^<aX;qVmsY%Bd5e*E?Q zuXJK}`U&ou--u_k7pZ(_G!}DLQIkt)Jjpxo6c<SR`4hU*JJFHEBX<T|570T(BL(N+ z2iHHL=m?9P_JmR+l=11ls3rf2;_Hh_Q#JU3>mVqdMhWb$qDL;JsY~gvAJh4W%dxjw za9xT=E-Utg27joC#tYbM)QSAvLPsr`{oc`+dWX&tfJOis!#+4#g`SW+hg&GjIx%7+ zT%uQ8ibp+HFZ1SD+(K)tF`Lr*@r>tAIS_sZ)Ff>88-rfu7r;(%Tf+>Tn_5=vm5K(d zt^mVJFl&97LmimcfYF(`A8Fdj3s|1|5>aP3Go9Yjmhs|zXZygBoTu+%zUR%1v*BDr z@FE&GJ3Zfd<SX;C;BrfcsreDjvi&)F4Ce{J<c9!!i#inzUkQ0o$OA%t3|UfKg@>>m zGd*Q8QmP}Ao2xgFvyU?89+tY}1~RDu2e&ZfRc^YJTBlM6TJ_Fq)in`qQ>!|!pkVxC z{<y9oXZmwLv<ILf$)y^Jzh<?pF%S<vu!gR7-@4l#NG0~dgo4~0X`OwfJub(dVP7vM zK~mP5`O6FKQvbM|L2wMPgC+)zvS)2#k%o+XEPCKezprTrp-(hvS}k-fbUk$X15Mio z?EnEUbP0B2#Zi3(oeo`q#+wd(8G0S`B)p=1(8r-qK$qf|;wCg7;kuI8hA9$T7eXr> zW>!h14hyTG{f>C%p>qz)rg|`0=|gZp6uuq!9AGk++m&7+TjbF_UolK&J-P)7Kfj)N zU?_h0{r<7stK;jSC&7OkclrW<OZMX%VGhNy&y=K1F9PH#A_FJT1BE9dU~?A&>pKYW zmv{t6un4go1?1Ts__yJ2fxoT`zNQ185BnE5GTC76l)%u+8M>SM1_setIh0xljbr)l ztiiEH+Lmmkc`3#KhEuJl{VDM&r+H~9O!EJ+i6z9(_?Tps0!R5Ry1q-zDHdBePQ)(R zBq_72mr=99!v3LBqlIZgh6{_8N{3i%v7j3&g-FM(I!YW1ri19%5DUxTk+jcfwaw>o zvRTTH?V5eD$hDEoLzCD6F|QQzM<FlsEVc$<&8Px;V&L~l3@`Uahk|#=OL)h^-j|Na zVQeI&470EaLQbRk!z{Li@Nw2@ee_J?vM^o6V^YfDHOn?BFjM#X<!&EphHtOv5it&O zl<knuYw|U>=ur4iQ!}d9it4vTWQ#9yNpBr5dKFV69UE?8W|}<QGCl%7UYy})K8B)Q z5R>S$uk~R?AH$vnyIJZZ*)y@g;Qh|WyCUZuQGGG}j{M7o#U<o^E^UW>IrDgbW5`(Z zafDW-{^ZV1Tg9k4eOp-8qD6TNm*f@{<}J%D$SqvGa76*BBQkm|E||YOC$C_2Zo$gj z<%P6)#9sH{k!zW|GNazW-XiCyB$NNv^Xc5Ead_RP%p{Y)J3W+@nP!^q&}&Y2mu7a8 gdnV&QmXBzBp|mGE!L%|}7^LHLDLakD5gQ%<FLSRyC;$Ke