From 9c62a8ec83483cb61f233cec3adee903b2b85cc8 Mon Sep 17 00:00:00 2001 From: Felix-Vimalaratnam Date: Fri, 1 Dec 2023 15:05:42 +0100 Subject: [PATCH] serpent bouge et terrain fini --- main.c | 161 ++++++++++++++++++++++++++++++++++++++++++--- ressources/graph.h | 149 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 302 insertions(+), 8 deletions(-) create mode 100644 ressources/graph.h diff --git a/main.c b/main.c index 3e5c88d..d68ea61 100644 --- a/main.c +++ b/main.c @@ -1,22 +1,167 @@ #include #include #include +#include + +#define LARGEUR_FENETRE 1050 +#define HAUTEUR_FENETRE 750 #define TAILLE_CASE 15 -#define NBR_LIGNE 40 #define NBR_COLONNE 60 +#define NBR_LIGNE 40 + + +typedef struct { + int x; + int y; +} Segment; + + +/*Fonction permettant d'afficher le serpent*/ +void afficherSerpent(Segment serpent[], int taille) { + int i; + couleur couleurSerpent = CouleurParNom("yellow"); + ChoisirCouleurDessin(couleurSerpent); + + for (i = 0; i < 10; i++) { + serpent[i].x = LARGEUR_FENETRE / 2 + i * TAILLE_CASE; + serpent[i].y = HAUTEUR_FENETRE / 2; + } + + for (i = 0; i < taille; i++) { + RemplirRectangle(serpent[i].x , serpent[i].y, TAILLE_CASE, TAILLE_CASE); + } +} + + + +/*Fonction recursive permettant d'afficher au moment de l'initialisation un nombre donnée en parametre de pastille Rouge (oui j'en suis fiere meme si c'est pas incroyable)*/ +void afficherPastilleAleatoire(int z) { + int x,y,i; + if(z>0){ + couleur rouge = CouleurParNom("red"); + x = rand() % 60 * TAILLE_CASE + 5*15; + y = rand() % 40 * TAILLE_CASE + 5*15; + ChoisirCouleurDessin(rouge); + RemplirRectangle(x, y, TAILLE_CASE, TAILLE_CASE); + afficherPastilleAleatoire(z-1); + } +} + + +/*Fonction initialisant la fenetre de jeux en vert*/ +void EcranJeu(){ + int case_colone,case_ligne; + couleur v; + v = CouleurParNom("light green"); + for (case_ligne = 2; case_ligne < NBR_LIGNE+5; case_ligne++) { + for (case_colone = 5; case_colone < NBR_COLONNE+5; case_colone++) { + + ChoisirCouleurDessin(v); + RemplirRectangle(case_colone * TAILLE_CASE, case_ligne * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); + } + } +} + +void deplacerSerpent(int longueurSerpent, Segment serpent[], int direction){ + int i; + couleur c; + couleur v; + couleur s; + c = CouleurParNom("black"); + s = CouleurParNom("yellow"); + v = CouleurParNom("light green"); + + for(i=0;i0;i--){ + serpent[i] = serpent[i-1]; + } + + switch(direction){ + case 1: + serpent[0].x += TAILLE_CASE; + break; + case 2: + serpent[0].x -= TAILLE_CASE; + break; + case 3: + serpent[0].y -= TAILLE_CASE; + break; + case 4: + serpent[0].y += TAILLE_CASE; + break; + + } + + for(i=0;i +#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