2023-11-23 11:08:18 +01:00
# include <stdlib.h>
# include <graph.h>
2023-12-01 15:55:06 +01:00
# include <time.h>
2023-12-12 12:24:31 +01:00
# include <stdio.h>
2023-12-01 15:05:42 +01:00
# define LARGEUR_FENETRE 1050
# define HAUTEUR_FENETRE 750
2023-11-23 11:08:18 +01:00
# define TAILLE_CASE 15
2023-12-12 12:24:31 +01:00
# define ESPACE_BAS 75
# define ESPACE_HAUT 75
# define NBR_PASTILLE_INITIAL 5
# define COLONNES 60
# define LIGNES 40
# define LARGEUR_ECRAN_JEU 900
# define HAUTEUR_ECRAN_JEU 600
# define TAILLE_CARRE 120
# define CYCLE 1000000L
# define MAX_LONGUEUR 100
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
typedef struct
{
2023-12-01 15:05:42 +01:00
int x ;
int y ;
} Segment ;
2023-12-12 12:24:31 +01:00
typedef struct
{
int x ;
int y ;
} Pastille ;
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
void Attendre ( unsigned int millisecondes )
{
unsigned long debut = Microsecondes ( ) ;
unsigned long attente = millisecondes * 1000 ;
while ( Microsecondes ( ) - debut < attente )
{
}
}
/*Fonction Perdu !!!*/
void perdu ( char * texte , int score , int minutes , int secondes , int pour_l_instant_t_a_pas_encore_perdue )
{
ChargerImage ( " perdu-removebg-preview.png " , 300 , 150 , 30 , 30 , 900 , 900 ) ;
/*Afficher le score sur l'image*/
ChoisirCouleurDessin ( CouleurParNom ( " black " ) ) ;
sprintf ( texte , " %3d " , score ) ;
EcrireTexte ( 455 , 364 , texte , 2 ) ;
/*affichage du timer au menu*/
sprintf ( texte , " %02d:%02d " , minutes , secondes ) ;
EcrireTexte ( 660 , 364 , texte , 2 ) ;
if ( Touche ( ) = = XK_Escape )
{
pour_l_instant_t_a_pas_encore_perdue = 0 ;
}
else if ( Touche ( ) = = XK_Return )
{
main ( ) ;
}
}
void effacerSerpent ( Segment serpent [ ] , int longueurSerpent )
{
int i ;
ChoisirCouleurDessin ( CouleurParComposante ( 126 , 217 , 87 ) ) ;
for ( i = 0 ; i < longueurSerpent ; i + + )
{
RemplirRectangle ( serpent [ i ] . x , serpent [ i ] . y , TAILLE_CASE , TAILLE_CASE ) ;
}
}
2023-12-01 15:05:42 +01:00
/*Fonction permettant d'afficher le serpent*/
2023-12-12 12:24:31 +01:00
void afficherSerpent ( Segment serpent [ ] , int taille )
{
2023-12-01 15:05:42 +01:00
int i ;
couleur couleurSerpent = CouleurParNom ( " yellow " ) ;
ChoisirCouleurDessin ( couleurSerpent ) ;
2023-12-12 12:24:31 +01:00
for ( i = 0 ; i < taille ; i + + )
{
2023-12-01 15:05:42 +01:00
serpent [ i ] . x = LARGEUR_FENETRE / 2 + i * TAILLE_CASE ;
serpent [ i ] . y = HAUTEUR_FENETRE / 2 ;
}
2023-12-12 12:24:31 +01:00
for ( i = 0 ; i < taille ; i + + )
{
RemplirRectangle ( serpent [ i ] . x , serpent [ i ] . y , TAILLE_CASE , TAILLE_CASE ) ;
2023-12-01 15:05:42 +01:00
}
}
2023-12-12 12:24:31 +01:00
/*Fonction recursive permettant d'afficher au moment de l'initialisation un nombre donn<6E> e en parametre de pastille Rouge (oui j'en suis fiere meme si c'est pas incroyable)*/
void afficherPastilleAleatoire ( int z , Pastille pomme [ ] )
{
int i ;
for ( i = 0 ; i < z ; i + + )
{
;
pomme [ i ] . x = rand ( ) % ( COLONNES - 10 ) * TAILLE_CASE + 5 * TAILLE_CASE ;
pomme [ i ] . y = rand ( ) % ( LIGNES - 5 ) * TAILLE_CASE + ( ESPACE_HAUT - 3 * TAILLE_CASE ) ;
ChoisirCouleurDessin ( CouleurParNom ( " red " ) ) ;
RemplirArc ( pomme [ i ] . x , pomme [ i ] . y , TAILLE_CASE , TAILLE_CASE , 0 , 360 ) ;
2023-12-01 15:05:42 +01:00
}
}
/*Fonction initialisant la fenetre de jeux en vert*/
2023-12-12 12:24:31 +01:00
void EcranJeu ( )
{
int i , j ;
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
for ( i = 2 ; i < LIGNES + 2 ; i + + )
{
for ( j = 5 ; j < COLONNES + 5 ; j + + )
{
ChoisirCouleurDessin ( CouleurParComposante ( 126 , 217 , 87 ) ) ;
RemplirRectangle ( j * TAILLE_CASE , i * TAILLE_CASE , TAILLE_CASE , TAILLE_CASE ) ;
2023-12-01 15:05:42 +01:00
}
2023-12-12 12:24:31 +01:00
}
}
void deplacerSerpent ( int * longueurSerpent , Segment serpent [ ] , int direction )
{
int i ;
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
effacerSerpent ( serpent , * longueurSerpent ) ;
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 ( CouleurParNom ( " yellow " ) ) ;
2023-12-01 15:05:42 +01:00
RemplirRectangle ( serpent [ i ] . x , serpent [ i ] . y , TAILLE_CASE , TAILLE_CASE ) ;
}
2023-12-12 12:24:31 +01:00
Attendre ( 75 ) ;
2023-12-01 15:05:42 +01:00
}
2023-12-12 12:24:31 +01:00
int main ( )
{
unsigned long debut , suivant ;
int n = 0 , minutes , secondes , score = 0 ;
char texte [ 20 ] ;
int nbr_pastille = 5 , touche , pour_l_instant_t_a_pas_encore_perdue = 1 , i , j , x = 0 , direction = 1 , verifSerpent = 0 , longueurSerpent = 10 ;
Pastille * pomme = ( Pastille * ) malloc ( nbr_pastille * sizeof ( Pastille ) ) ;
Segment * serpent = ( Segment * ) malloc ( MAX_LONGUEUR * sizeof ( Segment ) ) ;
2023-12-01 15:35:48 +01:00
2023-12-12 12:24:31 +01:00
if ( pomme = = NULL | | serpent = = NULL )
{
printf ( " Erreur d'allocation de m<> moire. \n " ) ;
return EXIT_FAILURE ;
}
2023-12-01 15:05:42 +01:00
2023-11-23 11:08:18 +01:00
InitialiserGraphique ( ) ;
2023-12-12 12:24:31 +01:00
CreerFenetre ( 350 , 100 , LARGEUR_FENETRE , HAUTEUR_FENETRE ) ;
2023-12-01 15:05:42 +01:00
srand ( time ( NULL ) ) ;
2023-12-12 12:24:31 +01:00
EffacerEcran ( CouleurParNom ( " black " ) ) ;
2023-12-01 15:05:42 +01:00
EcranJeu ( ) ;
2023-12-12 12:24:31 +01:00
afficherPastilleAleatoire ( NBR_PASTILLE_INITIAL , pomme ) ;
2023-12-01 15:05:42 +01:00
afficherSerpent ( serpent , longueurSerpent ) ;
2023-12-12 12:24:31 +01:00
while ( pour_l_instant_t_a_pas_encore_perdue )
{
if ( longueurSerpent > = MAX_LONGUEUR ) {
serpent = ( Segment * ) realloc ( serpent , ( MAX_LONGUEUR + MAX_LONGUEUR ) * sizeof ( Segment ) ) ;
}
/*Temps ecoul<75> debut*/
if ( Microsecondes ( ) > suivant )
{
2023-12-01 15:35:48 +01:00
suivant = Microsecondes ( ) + CYCLE ;
2023-12-12 12:24:31 +01:00
n + + ;
minutes = n / 60 ;
secondes = n % 60 ;
ChoisirCouleurDessin ( CouleurParNom ( " black " ) ) ;
RemplirRectangle ( 75 , 650 , 250 , 40 ) ;
ChoisirCouleurDessin ( CouleurParNom ( " blue " ) ) ;
printf ( " Temps : %d secondes \n " , n ) ;
sprintf ( texte , " Temps : %02d : %02d " , minutes , secondes ) ;
EcrireTexte ( 85 , 685 , texte , 2 ) ;
2023-12-01 15:35:48 +01:00
}
2023-12-12 12:24:31 +01:00
/*Temps ecoul<75> fin */
if ( ToucheEnAttente ( ) )
{
switch ( Touche ( ) )
{
case XK_Right :
2023-12-01 15:05:42 +01:00
direction = 1 ;
break ;
2023-12-12 12:24:31 +01:00
case XK_Left :
2023-12-01 15:05:42 +01:00
direction = 2 ;
break ;
2023-12-12 12:24:31 +01:00
case XK_Up :
2023-12-01 15:05:42 +01:00
direction = 3 ;
break ;
2023-12-12 12:24:31 +01:00
case XK_Down :
2023-12-01 15:05:42 +01:00
direction = 4 ;
break ;
2023-12-12 12:24:31 +01:00
case XK_space :
ChargerImage ( " pause.png " , 300 , 150 , 30 , 30 , 900 , 900 ) ;
while ( Touche ( ) ! = XK_space )
{
Attendre ( 10 ) ;
}
EcranJeu ( ) ;
for ( i = 0 ; i < nbr_pastille ; i + + ) {
ChoisirCouleurDessin ( CouleurParNom ( " red " ) ) ;
RemplirArc ( pomme [ i ] . x , pomme [ i ] . y , TAILLE_CASE , TAILLE_CASE , 0 , 360 ) ;
}
}
}
deplacerSerpent ( & longueurSerpent , serpent , direction ) ;
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
for ( i = 0 ; i < NBR_PASTILLE_INITIAL ; i + + )
{
/*Mise a zero du score*/
ChoisirCouleurDessin ( CouleurParNom ( " blue " ) ) ;
sprintf ( texte , " Score : %3d " , score ) ;
EcrireTexte ( 825 , 685 , texte , 2 ) ;
if ( serpent [ i ] . x = = pomme [ i ] . x & & serpent [ i ] . y = = pomme [ i ] . y )
{
longueurSerpent + = 1 ;
pomme [ i ] . x = rand ( ) % ( COLONNES - 10 ) * TAILLE_CASE + 5 * TAILLE_CASE ;
pomme [ i ] . y = rand ( ) % ( LIGNES - 5 ) * TAILLE_CASE + ( ESPACE_HAUT - 3 * TAILLE_CASE ) ;
ChoisirCouleurDessin ( CouleurParNom ( " red " ) ) ;
RemplirArc ( pomme [ i ] . x , pomme [ i ] . y , TAILLE_CASE , TAILLE_CASE , 0 , 360 ) ;
/*+1 au score a chaque pomme*/
score = score + 1 ;
ChoisirCouleurDessin ( CouleurParNom ( " black " ) ) ;
RemplirRectangle ( 825 , 655 , 150 , 40 ) ;
ChoisirCouleurDessin ( CouleurParNom ( " blue " ) ) ;
sprintf ( texte , " Score : %3d " , score ) ;
EcrireTexte ( 825 , 685 , texte , 2 ) ;
}
}
printf ( " La longueur d'un serpent est de : %d \n " , longueurSerpent ) ;
/*Delimitation du terrain de jeu */
if ( serpent [ 0 ] . x < 5 * TAILLE_CASE | | serpent [ 0 ] . x > = LARGEUR_ECRAN_JEU + 5 * TAILLE_CASE | | serpent [ 0 ] . y < ESPACE_HAUT - 3 * TAILLE_CASE | | serpent [ 0 ] . y > = HAUTEUR_ECRAN_JEU + 2 * TAILLE_CASE )
{
ChoisirCouleurDessin ( CouleurParNom ( " black " ) ) ;
RemplirRectangle ( serpent [ 0 ] . x , serpent [ 0 ] . y , TAILLE_CASE , TAILLE_CASE ) ;
Attendre ( 1000 ) ;
/*Execution de la fontion perdu*/
perdu ( texte , score , minutes , secondes , pour_l_instant_t_a_pas_encore_perdue = 0 ) ;
2023-12-01 15:05:42 +01:00
}
2023-11-23 11:08:18 +01:00
}
2023-12-12 12:24:31 +01:00
2023-12-01 15:05:42 +01:00
2023-12-12 12:24:31 +01:00
free ( pomme ) ;
free ( serpent ) ;
2023-11-23 11:08:18 +01:00
Touche ( ) ;
FermerGraphique ( ) ;
return EXIT_SUCCESS ;
2023-12-01 15:05:42 +01:00
}