2023-11-26 19:49:21 +01:00
# include <stdlib.h>
# include <stdio.h>
# include <graph.h>
# include <time.h>
# define HAUTEUR 40
# define LARGEUR 60
# define CYCLE 10000L
2023-11-27 15:43:45 +01:00
# define SEGMENT 10
2023-11-26 19:49:21 +01:00
/*enumération des différentes direction possible*/
enum Direction { UP = 2 , DOWN = 3 , LEFT = 0 , RIGHT = 1 } ;
/*permet de stocker les coordonnes des segment du serpent*/
typedef struct {
int x , y ;
} SnakePoint ;
/*permet de concevoir le graphique sur lequel le serpent se déplacera*/
void graphique ( ) {
2023-11-27 15:43:45 +01:00
InitialiserGraphique ( ) ;
2023-11-28 15:43:48 +01:00
CreerFenetre ( 10 , 10 , 1700 , 950 ) ;
2023-11-27 15:43:45 +01:00
couleur c , b ;
b = CouleurParComposante ( 0 , 0 , 0 ) ;
ChoisirCouleurDessin ( b ) ;
RemplirRectangle ( 0 , 0 , 1750 , 950 ) ;
c = CouleurParComposante ( 111 , 255 , 94 ) ;
ChoisirCouleurDessin ( c ) ;
RemplirRectangle ( 100 , 100 , 1500 , 750 ) ;
} ;
2023-11-26 19:49:21 +01:00
/*Déclaration de la fonction, qui va permettre d'afficher le serpent selon la couleur de la composante*/
void serpent ( Point * snake , int taille ) {
int i ;
for ( i = 0 ; i < taille ; i + + ) {
couleur s = CouleurParComposante ( 255 , 255 , 0 ) ;
ChoisirCouleurDessin ( s ) ;
RemplirRectangle ( snake [ i ] . x * SEGMENT , snake [ i ] . y * SEGMENT , SEGMENT , SEGMENT ) ;
}
}
void mouvement ( Point * snake , int * taille , int * dir , Point * pomme , int * perdu ) {
/*Déplace le serpent*/
for ( int i = * taille - 1 ; i > 0 ; i - - ) {
snake [ i ] = snake [ i - 1 ] ;
}
/*cette partie permet de gérer les mouvement de la tete*/
if ( ToucheEnAttente ( ) ) {
if ( Touche ( ) = = XK_Left & & * dir ! = RIGHT ) {
* dir = LEFT ;
}
else if ( Touche ( ) = = XK_Right & & * dir ! = LEFT ) {
* dir = RIGHT ;
}
else if ( Touche ( ) = = XK_Up & & * dir ! = DOWN ) {
* dir = UP ;
}
else if ( Touche ( ) = = XK_Down & & * dir ! = UP ) {
* dir = DOWN ;
}
}
/*deplace la tete en fonction de la direction*/
if ( * dir = = LEFT ) {
snake [ 0 ] . x - = 1 ;
}
else if ( * dir = = RIGHT ) {
snake [ 0 ] . x + = 1 ;
}
else if ( * dir = = UP ) {
snake [ 0 ] . y - = 1 ;
}
else if ( * dir = = DOWN ) {
snake [ 0 ] . y + = 1 ;
}
2023-11-27 15:43:45 +01:00
if ( snake [ 0 ] . x < 0 | | snake [ 0 ] . x > = LARGEUR | | snake [ 0 ] . y < 0 | | snake [ 0 ] . y > = HAUTEUR ) {
2023-11-26 19:49:21 +01:00
* perdu = 1 ;
return ;
}
/*cette partie permet de verifier si le serpent a mangerla pomme a partir des coordonnes et genere une nouvelle pomme a une position aleatoire grace a rand*/
if ( snake [ 0 ] . x = = pomme - > x & & snake [ 0 ] . y = = pomme - > y ) {
pomme - > x = rand ( ) % LARGEUR ;
pomme - > y = rand ( ) % HAUTEUR ;
/*permet d'augmenter la taille du serpent*/
( * taille ) + + ;
}
}
int main ( ) {
/*initialisation du jeu*/
2023-11-27 15:43:45 +01:00
graphique ( ) ;
int tab [ HAUTEUR ] [ LARGEUR ] ;
int i , j ;
2023-11-26 19:49:21 +01:00
int perdu = 0 ;
int dir = RIGHT ;
SnakePoint snake [ HAUTEUR * LARGEUR ] ;
SnakePoint pomme ;
unsigned long suivant ;
int g = 0 ;
suivant = Microsecondes ( ) + CYCLE ;
/*taille minimum du serpent au début du jeu*/
2023-11-27 15:43:45 +01:00
int taille = 10 ;
2023-11-26 19:49:21 +01:00
srand ( time ( NULL ) ) ;
for ( int i = 0 ; i < taille ; i + + ) {
snake [ i ] . x = LARGEUR / 2 ;
snake [ i ] . y = HAUTEUR / 2 + 1 ;
}
pomme . x = rand ( ) % LARGEUR ;
pomme . y = rand ( ) % HAUTEUR ;
graphique ( ) ;
2023-11-28 15:43:48 +01:00
while ( ! perdu ) {
serpent ( snake , taille ) ;
mouvement ( snake , & taille , & dir , & pomme , & perdu ) ;
usleep ( CYCLE ) ;
2023-11-26 19:49:21 +01:00
}
2023-11-27 15:43:45 +01:00
2023-11-28 15:43:48 +01:00
if ( perdu ) {
2023-11-26 19:49:21 +01:00
printf ( " Vous avez perdu ! \n " ) ;
2023-11-27 15:43:45 +01:00
FermerGraphique ( ) ;
2023-11-26 19:49:21 +01:00
}
2023-11-27 15:43:45 +01:00
2023-11-26 19:49:21 +01:00
return EXIT_SUCCESS ;
}