commit ddb902638c1f6ac351dc7b0168469cb129ddad7a Author: Josue KONAN Date: Sun Nov 24 18:54:52 2024 +0100 Téléverser les fichiers vers "/" diff --git a/blocus.h b/blocus.h new file mode 100644 index 0000000..75865d8 --- /dev/null +++ b/blocus.h @@ -0,0 +1,25 @@ +#ifndef BLOCUS_H +#define BLOCUS_H + +#define EMPTY 0 +#define PLAYER1 1 +#define PLAYER2 2 +#define BLOCKED -1 + +typedef struct { + int size; + int grid[9][9]; + int player1_x, player1_y; + int player2_x, player2_y; + int current_player; + int winner; +} Game; + +// Prototypes +void initialize_game(Game *game, int size); +int is_valid_move(Game *game, int x, int y); +void move_player(Game *game, int x, int y); +void block_cell(Game *game, int x, int y); +int has_lost(Game *game); + +#endif diff --git a/graph.c b/graph.c new file mode 100644 index 0000000..deda835 --- /dev/null +++ b/graph.c @@ -0,0 +1,773 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "config.h" + +#ifdef HAVE_XPM +#include +#endif + + +#include "graph.h" +#include "image.h" +#define N 50 + + +void _get_GC(Window win, GC *gc); + +typedef struct +{ + int posx,posy; + int tx,ty; + int etat; + Pixmap s; + Pixmap smask; + Pixmap sauvegarde; +} +sprite; + +sprite S[N]; /* tableau de sprite */ +int S_alloue[N]; /* tableau d'allocation */ + +/******************** variables globales beurk ****************************/ + +Display *display; +int screen; +int display_width=0,display_height=0; +int X_fen,Y_fen; +int connecte=0; +int nbfen=0; +Window win; +XColor coul; +unsigned long couleur_dess; +XEvent report; /* structure des evenements */ + +GC gc; /* ID du contexte graphique */ +unsigned int border_w=4; +Cursor croix; +XSetWindowAttributes attribut; +Colormap pal; /* palette */ +Font f[3]; /* polices d'ecriture */ +XFontStruct *s[3]; +XFontStruct *stemp; +Pixmap icone=NULL,icone_mask=NULL; +XPoint sommet[3]; +int num_ecran=0; +Window ecran[NB_PIXMAP+1]; +int app=0; +XWMHints * wm_hints; +XClassHint * class_hints; +XSizeHints * size_hints; + +XTextProperty nom_fenetre,nom_icone; +char *nf="IUT de Fontainebleau"; // changer si vous voulez :-) +char *ni="mon_icone"; + +int _X=0,_Y=0; + +//#include "image.c" + +void ChoisirModeDessin(int m) +{ + switch(m) + { + case 0 : XSetFunction(display,gc,GXcopy); + break; + case 1 : XSetFunction(display,gc,GXxor); + break; + case 2 : XSetFunction(display,gc,GXinvert); + break; + default : XSetFunction(display,gc,GXcopy); + } +} +void ChoisirCouleurDessin(unsigned long couleur) +{ + couleur_dess=couleur; + XSetForeground(display,gc,couleur); + XFlush(display); +} + +void ChoisirEcran(int n) +{ + if (0<=n&&n<=NB_PIXMAP) num_ecran=n; +} + +int InitialiserGraphique() +{ + if (!connecte) + { + if((display=XOpenDisplay(NULL))==NULL) { + fprintf(stderr,"erreur : ne peut pas se connecter "); + fprintf(stderr,"au serveur %s\n",XDisplayName(NULL)); + return 0; + } + if (connecte) //return 0; + return 1; + + /* Recuperer les informations concernant l'ecran (root window) sur + lequel on va afficher notre application. Le numero de l'ecran + par defaut s'obtient a l'aide de la macro DefaultScreen(), la + taille a l'aide des macros DisplayWidth() et + DisplayHeight().*/ + + screen = DefaultScreen(display); + display_width = DisplayWidth(display,screen); + display_height = DisplayHeight(display,screen); + pal=DefaultColormap(display,screen); + connecte=1; + return 1; + } +} + +int CreerFenetre(int posx,int posy,int X,int Y) +{ + int i; + Visual *v; + char buf[1024]; + int trouve; + + if (!connecte) + { + perror("initialisez d'abord le mode graphique\n"); + //return (1); + return 0; + } + + if (nbfen==1) + { + printf("une seule fentre on a dit !!!!\n"); + //return(1); + return 0; + } + + ecran[0] = XCreateSimpleWindow(display, RootWindow(display, screen), + posx, posy,X, Y, border_w, + BlackPixel(display,screen), + WhitePixel(display,screen)); + + /* sensibilisation de la fenêtre */ + + XSelectInput(display, ecran[0], + ExposureMask | KeyPressMask |ButtonPressMask ); + + + /* creation d'un contexte graphique pour cette fenetre, + indispensable pour dessiner ou afficher du texte */ + + _get_GC(ecran[0], &gc); + + /* creation d'une fonte curseur */ + + croix=XCreateFontCursor(display,XC_crosshair); + XDefineCursor(display,ecran[0],croix); + + /* le contenu de la fenetre est persistant : le serveur le supporte-t-il ? */ + + attribut.backing_store=Always; + XChangeWindowAttributes(display,ecran[0],CWBackingStore,&attribut); + + /* chargement d'une font par defaut pour l'ecriture de texte */ + + trouve=0; + i=10; + while(!trouve&&i<=15) + { + sprintf(buf,"-adobe-helvetica-*-r-*-*-%d-*-*-*-*-*-*-*",i); + stemp=XLoadQueryFont(display,buf); + if (stemp==NULL) i++; + else + trouve=1; + } + + if (!trouve) + { + sprintf(buf,"6x13"); + if ((stemp=XLoadQueryFont(display,buf))==NULL) + stemp=XLoadQueryFont(display,"fixed"); + } + f[0]=stemp->fid; + s[0]=stemp; + + + trouve=0; + i=20; + while(!trouve&&i<=25) + { + sprintf(buf,"-adobe-helvetica-*-r-*-*-%d-*-*-*-*-*-*-*",i); + stemp=XLoadQueryFont(display,buf); + if (stemp==NULL) i++; + else + trouve=1; + } + if (!trouve) + { + sprintf(buf,"8x16"); + if ((stemp=XLoadQueryFont(display,buf))==NULL) + stemp=XLoadQueryFont(display,"fixed"); + } + f[1]=stemp->fid; + s[1]=stemp; + + + trouve=0; + i=30; + while(!trouve&&i<=35) + { + sprintf(buf,"-adobe-helvetica-*-r-*-*-%d-*-*-*-*-*-*-*",i); + stemp=XLoadQueryFont(display,buf); + if (stemp==NULL) i++; + else + trouve=1; + } + if (!trouve) + { + sprintf(buf,"12x24"); + if ((stemp=XLoadQueryFont(display,buf))==NULL) + stemp=XLoadQueryFont(display,"fixed"); + } + + f[2]=stemp->fid; + s[2]=stemp; + + + XSetFont(display,gc,f[1]); + + + + /* creation des pixmaps pour la sauvegarde d'images */ + + for(i=1;i<=NB_PIXMAP;i++) + { + ecran[i]=XCreatePixmap( display , DefaultRootWindow(display), X , Y , DefaultDepth(display,screen) ); + } + /* variables globales pour la taille de la fenetre */ + + X_fen=X; + Y_fen=Y; + + bzero(S_alloue,N*sizeof(int)); + wm_hints=XAllocWMHints(); + class_hints=XAllocClassHint(); + size_hints=XAllocSizeHints(); + + XStringListToTextProperty(&nf,1,&nom_fenetre); + XStringListToTextProperty(&ni,1,&nom_icone); + wm_hints->initial_state=NormalState; + wm_hints->input=True; + wm_hints->flags=StateHint|InputHint; + size_hints->x=posx; + size_hints->y=posy; + size_hints->flags=USPosition; + //class_hints->res_name="Graphique"; + XSetWMProperties(display,ecran[0],&nom_fenetre,&nom_icone,NULL,0,size_hints,wm_hints,NULL); + //XSetWMNormalHints(display,ecran[0],size_hints); + XSetIconName(display,ecran[0],"Super"); + // XStoreName(display,ecran[0],"D.M Entertainment"); + XMapWindow(display,ecran[0]); + + XFree(wm_hints); + XFree(size_hints); + XFree(class_hints); + wm_hints=XGetWMHints(display,ecran[0]); + do + { + XWindowEvent(display,ecran[0],ExposureMask,&report); + } + while(report.xexpose.count); + nbfen=1; + return 1; +} + +void ChoisirTitreFenetre(char *s) +{ + XStoreName(display,ecran[0],s ); +} +void ChoisirCurseur(unsigned int forme) +{ + XFreeCursor(display,croix); + croix=XCreateFontCursor(display,forme); + XDefineCursor(display,ecran[0],croix); +} + + +/*----------------------*/ + +void _get_GC(Window win, GC *gc) + +{ + unsigned long valuemask = 0; /* Ignore XGCvalues et prend les + valeurs par defaut */ + XGCValues values; + + /* creation d'un contexte graphique par defaut */ + + *gc = XCreateGC(display, ecran[0], valuemask, &values); + + + /* specification d'un background noir, puisque par defaut on fait du + blanc sur du blanc */ + //XSetBackground(display,*gc,154); + + XSetForeground(display, *gc, BlackPixel(display, screen)); + XSetGraphicsExposures(display,*gc,False); + + /* inutile d'enfler la file d'evenements avec les evenements + Noexpose et GraphicsExpose */ +} + +int Maxx() +{ + if (!connecte) return -1; + else return display_width; +} + +int Maxy() +{ + if (!connecte) return -1; + else return display_height; +} + +void DessinerPixelC(int x,int y,unsigned long couleur) +{ + XSetForeground(display,gc,couleur); + XDrawPoint(display,ecran[num_ecran],gc,x,y); + XSetForeground(display,gc,couleur_dess); + XFlush(display); +} + +void DessinerPixel(int x,int y) +{ + XDrawPoint(display,ecran[num_ecran],gc,x,y); + XFlush(display); +} + +void DessinerSegmentC(int x,int y,int xx,int yy,unsigned long couleur) +{ + XSetForeground(display,gc,couleur); + XDrawLine(display,ecran[num_ecran],gc,x,y,xx,yy); + XSetForeground(display,gc,couleur_dess); + XFlush(display); +} +void DessinerSegment(int x,int y,int xx,int yy) +{ + XDrawLine(display,ecran[num_ecran],gc,x,y,xx,yy); + XFlush(display); +} + +void FermerGraphique() +{ + int i; + XSync(display,True); + for (i=0;i<3;i++) XUnloadFont(display,f[i]); + for (i=1;i<=NB_PIXMAP;i++) + XFreePixmap(display,ecran[i]); + for(i=0;i2) return; + XSetFont(display,gc,f[mode]); + XSetForeground(display,gc,c); + XDrawString(display,ecran[num_ecran],gc,x,y,texte,strlen(texte)); + XSetForeground(display,gc,couleur_dess); + XFlush(display); +} + +void EcrireTexte(int x,int y,char *texte,int mode) +{ + if (mode<0||mode>2) return; + XSetFont(display,gc,f[mode]); + XDrawString(display,ecran[num_ecran],gc,x,y,texte,strlen(texte)); + XFlush(display); + +} +#ifdef HAVE_XPM +void SauverImage(char * file,int x,int y,int l,int h) +{ + XEvent report; + Pixmap p1=0; + p1=XCreatePixmap( display , DefaultRootWindow(display), X_fen , Y_fen , DefaultDepth(display,screen) ); + XCopyArea(display,ecran[num_ecran],p1,gc,x,y,l,h,0,0); + XpmWriteFileFromPixmap(display,file,p1,0,NULL); + if (p1) XFreePixmap(display,p1); + while(XCheckWindowEvent(display,ecran[0],ExposureMask,&report)); + while(XCheckTypedEvent(display,GraphicsExpose,&report)); + while(XCheckTypedEvent(display,NoExpose,&report)); +} +#endif + +int ChargerImage(char *file,int x,int y,int xx,int yy,int l,int h) +{ + XEvent report; + Pixmap p1=0,p1mask=0; + int wi,hi; + if (!_chargerimage(file, &wi,&hi,&p1 , &p1mask,display,gc,screen)) return 0; + + //XpmReadFileToPixmap(display,ecran[num_ecran],file,&p1,&p1mask,NULL); + + XSetClipMask(display,gc,p1mask); + XSetClipOrigin(display,gc,x,y); + XCopyArea(display,p1,ecran[num_ecran],gc,xx,yy,l,h,x,y); + + XSetClipMask(display,gc,None); + if (p1) XFreePixmap(display,p1); + if (p1mask) XFreePixmap(display,p1mask); + + //XFlush(display); + + while(XCheckWindowEvent(display,ecran[0],ExposureMask,&report)); + while(XCheckTypedEvent(display,GraphicsExpose,&report)); + while(XCheckTypedEvent(display,NoExpose,&report)); + return 1; + +} + +void ChargerImageFond(char *file) +{ + XSetWindowAttributes att; + Pixmap pbackground=0,pmask=0; + int i=num_ecran; + int x,y; + if (i<0 || i>NB_PIXMAP) return ; + + switch(i) + { + case 0 : + //XpmReadFileToPixmap(display,ecran[i],file,&pbackground,&pmask,NULL); + _chargerimage(file, &x,&y,&pbackground , &pmask,display,gc,screen); + att.background_pixmap=pbackground; + XChangeWindowAttributes(display,ecran[i],CWBackPixmap,&att); + XClearWindow(display,ecran[i]); + + if (pbackground) XFreePixmap(display,pbackground); + if (pmask) XFreePixmap(display,pmask); + XFlush(display); + break; + default: + ChargerImage(file,0,0,0,0,X_fen,Y_fen); + } +} + +int TailleChaineEcran(char *t,int mode) +{ + if (mode<0||mode>2) return -1; + else return XTextWidth(s[mode],t,strlen(t)); +} +int TailleSupPolice(int mode) +{ + if (mode<0||mode>2) return -1; + return s[mode]->ascent; +} + +int TailleInfPolice(int mode) +{ + if (mode<0||mode>2) return -1; + return s[mode]->descent; +} + + +void CopierZone(int src,int dst,int ox,int oy,int L,int H,int dx,int dy) +{ + XEvent report; + XCopyArea(display,ecran[src],ecran[dst],gc,ox,oy,L,H,dx,dy); + XFlush(display); + while(XCheckWindowEvent(display,ecran[0],ExposureMask,&report)); + while(XCheckTypedEvent(display,GraphicsExpose,&report)); + while(XCheckTypedEvent(display,NoExpose,&report)); +} + + +void CacherFenetre() +{ + XUnmapWindow(display,ecran[0]); + XFlush(display); +}; + +void AfficherFenetre(void) +{ + XMapWindow(display,ecran[0]); + XFlush(display); +} + + +unsigned long CouleurParComposante(unsigned char r, unsigned char v,unsigned char b) +{ + /* on suppose qu'on est en True Color */ + /* C'est a ameliorer !!! */ + /* XColor c; + c.red=r; + c.red<<=8; + c.green=v; + c.green<<=8; + c.blue=b; + c.blue<<=8; + XAllocColor(display,DefaultColormap(display,screen),&c); + return c.pixel;*/ + unsigned long cr=r,cg=v,cb=b; + return (cr<<16)|(cg<<8)|cb; +} + + +unsigned long Microsecondes() +{ + struct timeval t; + gettimeofday(&t, NULL); + return t.tv_usec+t.tv_sec*1000000; +} + + +/* + int souris(int *X,int *Y) + { + XEvent r; + if (XCheckWindowEvent(display,ecran[0],PointerMotionMask,&r)) + {*X=r.xmotion.x;*Y=r.xmotion.y;return 1;} + return 0; + } + */ + + + +void SourisPosition() +{ + int x,y,rx,ry; + unsigned int etat; + Window a,b; + XQueryPointer(display, ecran[0], &a, &b, &rx, &ry, &x, &y, &etat); + _X=x;_Y=y; +} + +int _longueur() +{ + return XQLength(display); +} + +int SourisCliquee() +{ + XEvent r; + if (XCheckWindowEvent(display,ecran[0],ButtonPressMask,&r)) + { + _X=r.xbutton.x; + _Y=r.xbutton.y; + return 1; + } + return 0; +} +int SpriteLibre() +{ + int i; + for(i=0;i=N) return; + if (S_alloue[n]!=1) return; + /* if ((S[n].etat)==0) + { + p=XCreatePixmap( display , DefaultRootWindow(display), S[n].tx ,S[n].ty , DefaultDepth(display,screen) ); + XCopyArea(display,ecran[num_ecran],p,gc,x,y,S[n].tx,S[n].ty,0,0); + S[n].sauvegarde=p; + + + }*/ + + /* restitue la zone */ + + //XSetClipMask(display,gc,None); + //if (S[n].etat!=0) XCopyArea(display,S[n].sauvegarde,ecran[num_ecran],gc,0,0,S[n].tx,S[n].ty,S[n].posx,S[n].posy); + + //XCopyArea(display,ecran[num_ecran],S[n].sauvegarde,gc,x,y,S[n].tx,S[n].ty,0,0); + if (S[n].smask!=0) { + XSetClipMask(display,gc,S[n].smask); + XSetClipOrigin(display,gc,x,y); + } + XCopyArea(display,S[n].s,ecran[num_ecran],gc,0,0,S[n].tx,S[n].ty,x,y); + S[n].posx=x; + S[n].posy=y; + S[n].etat=1; + XFlush(display); + XSetClipMask(display,gc,None); +} + +/*void EffacerSprite(int n) +{ + n--; + if (S[n].etat!=0) XCopyArea(display,S[n].sauvegarde,ecran[num_ecran],gc,0,0,S[n].tx,S[n].ty,S[n].posx,S[n].posy); + S[n].etat=0; +}*/ + +void LibererSprite(int n) +{ + n--; + if (n<0||n>=N) return; + if (S_alloue[n]!=1) return; + if (S[n].s>0) XFreePixmap(display,S[n].s); + if (S[n].smask>0) XFreePixmap(display,S[n].smask); + if (S[n].sauvegarde>0) XFreePixmap(display,S[n].sauvegarde); + S_alloue[n]=0; +} + 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 +#include +#include + +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/graphics_utils.c b/graphics_utils.c new file mode 100644 index 0000000..407f5e3 --- /dev/null +++ b/graphics_utils.c @@ -0,0 +1,36 @@ +#include "graphics_utils.h" +#include +#include + +void draw_grid(Game *game) { + EffacerEcran(CouleurParNom("white")); + int cell_size = 500 / game->size; + + for (int i = 0; i <= game->size; i++) { + DessinerSegment(50 + i * cell_size, 50, 50 + i * cell_size, 50 + game->size * cell_size); + DessinerSegment(50, 50 + i * cell_size, 50 + game->size * cell_size, 50 + i * cell_size); + } +} + +int choose_grid_size(int *mode) { + EffacerEcran(CouleurParNom("white")); + EcrireTexte(100, 100, "Choisissez une taille de grille (3 à 9)", 2); + EcrireTexte(100, 200, "Mode : 1 joueur (1) ou 2 joueurs (2)", 2); + + int grid_size = 5; + + while (!SourisCliquee()); + SourisPosition(); + + grid_size = (_X - 50) / 100 + 3; // Ajustez selon votre interface + *mode = (_Y < 300) ? 1 : 2; + + return grid_size; +} + +void display_winner(int player) { + EffacerEcran(CouleurParNom("white")); + char msg[50]; + sprintf(msg, "Le gagnant est le joueur %d!", player); + EcrireTexte(200, 250, msg, 2); +} diff --git a/graphics_utils.h b/graphics_utils.h new file mode 100644 index 0000000..73ff219 --- /dev/null +++ b/graphics_utils.h @@ -0,0 +1,10 @@ +#ifndef GRAPHICS_UTILS_H +#define GRAPHICS_UTILS_H + +#include "blocus.h" + +void draw_grid(Game *game); +void display_winner(int player); +int choose_grid_size(int *mode); + +#endif