serpent bouge et terrain fini
This commit is contained in:
161
main.c
161
main.c
@@ -1,22 +1,167 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <graph.h>
|
#include <graph.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define LARGEUR_FENETRE 1050
|
||||||
|
#define HAUTEUR_FENETRE 750
|
||||||
#define TAILLE_CASE 15
|
#define TAILLE_CASE 15
|
||||||
#define NBR_LIGNE 40
|
|
||||||
#define NBR_COLONNE 60
|
#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;i<longueurSerpent;i++){
|
||||||
|
|
||||||
|
ChoisirCouleurDessin(v);
|
||||||
|
RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=longueurSerpent-1;i>0;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<longueurSerpent;i++){
|
||||||
|
|
||||||
|
ChoisirCouleurDessin(s);
|
||||||
|
RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE);
|
||||||
|
}
|
||||||
|
Attendre(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void timer(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int case_ligne,case_colonne;
|
int touche,i, j,x=0,direction=1,longueurSerpent=10;
|
||||||
|
Segment serpent[10];
|
||||||
couleur c;
|
couleur c;
|
||||||
c=CouleurParComposante(100,250,100);
|
couleur v;
|
||||||
|
couleur s;
|
||||||
|
|
||||||
InitialiserGraphique();
|
InitialiserGraphique();
|
||||||
CreerFenetre(400,225,900,600);
|
CreerFenetre(400, 250, LARGEUR_FENETRE, HAUTEUR_FENETRE);
|
||||||
|
srand(time(NULL));
|
||||||
|
c = CouleurParNom("black");
|
||||||
|
s = CouleurParNom("yellow");
|
||||||
|
v = CouleurParNom("green");
|
||||||
EffacerEcran(c);
|
EffacerEcran(c);
|
||||||
for (case_ligne=0;case_ligne<NBR_LIGNE;case_ligne++){
|
EcranJeu();
|
||||||
for (case_colonne=0;case_colonne<NBR_COLONNE;case_colonne++)
|
afficherPastilleAleatoire(5);
|
||||||
DessinerRectangle(case_ligne*TAILLE_CASE,case_colonne*TAILLE_CASE,TAILLE_CASE,TAILLE_CASE);
|
afficherSerpent(serpent, longueurSerpent);
|
||||||
|
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
int touche;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(ToucheEnAttente()){
|
||||||
|
touche = Touche();
|
||||||
|
switch(touche){
|
||||||
|
case XK_Right:
|
||||||
|
direction = 1;
|
||||||
|
break;
|
||||||
|
case XK_Left:
|
||||||
|
direction = 2;
|
||||||
|
break;
|
||||||
|
case XK_Up:
|
||||||
|
direction = 3;
|
||||||
|
break;
|
||||||
|
case XK_Down:
|
||||||
|
direction = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deplacerSerpent(longueurSerpent, serpent, direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Touche();
|
Touche();
|
||||||
FermerGraphique();
|
FermerGraphique();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
149
ressources/graph.h
Normal file
149
ressources/graph.h
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user