2023-12-21 14:32:55 +01:00
# include <graph.h>
# include <time.h>
# include <stdlib.h>
# include "main.h"
int ArrondirPixel ( int nombre ) /* Calcule un arrondi du pixel pour pouvoir respecter la norme des 40 lignes et 60 colonnes */
{
/* Calcul du reste de la division par 15 */
int reste = nombre % 15 ;
/* Calcul de l'arrondi au multiple de 15 le plus proche */
int arrondi = ( reste < = 7 ) ? nombre - reste : nombre + ( 15 - reste ) ;
return arrondi ;
}
2023-12-22 21:12:26 +01:00
PIXELS gen_pastille ( PIXELS * serpent , PIXELS * pastilles , PIXELS * obstacle , unsigned long longueur_serpent , unsigned long longueur_obstacle )
2023-12-21 14:32:55 +01:00
/* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/
/*-Elles se génèrent à des endroits qui peuvent être les mêmes ou gêner le snake*/
{
2023-12-22 21:12:26 +01:00
int x_pastille , y_pastille ;
unsigned long i ;
2023-12-21 14:32:55 +01:00
int ok = 0 ;
PIXELS pastille ;
do {
ok = 0 ;
x_pastille = ArrondirPixel ( rand ( ) % W_GAME ) ;
y_pastille = ArrondirPixel ( rand ( ) % H_GAME ) ;
2023-12-24 01:48:21 +01:00
if ( x_pastille < DECALEMENT )
{
x_pastille = + DECALEMENT ;
}
if ( y_pastille < DECALEMENT )
{
y_pastille = + DECALEMENT ;
}
for ( i = 0 ; i < = longueur_serpent ; i + + )
2023-12-21 14:32:55 +01:00
{
if ( x_pastille = = serpent [ i ] . x & & y_pastille = = serpent [ i ] . y )
{
ok = 1 ; /* Check si la pastille se genère sur une coordonné du serpent */
}
if ( x_pastille = = pastilles [ i ] . x & & y_pastille = = pastilles [ i ] . y )
{
ok = 1 ;
}
}
2023-12-24 01:48:21 +01:00
for ( i = 0 ; i < = longueur_obstacle ; i + + )
2023-12-22 19:40:06 +01:00
{
if ( x_pastille = = obstacle [ i ] . x & & y_pastille = = obstacle [ i ] . y )
{
ok = 1 ; /* Check si la pastille se genère sur une coordonné du serpent */
}
if ( x_pastille = = pastilles [ i ] . x & & y_pastille = = pastilles [ i ] . y )
{
ok = 1 ;
}
}
2023-12-21 14:32:55 +01:00
} while ( ok ) ;
pastille . x = x_pastille ;
pastille . y = y_pastille ;
return pastille ;
}
2023-12-22 21:12:26 +01:00
PIXELS gen_obstacle ( PIXELS * serpent , PIXELS * pastilles , PIXELS * obstacle , unsigned long longueur_serpent , unsigned long longueur_pastilles )
2023-12-22 19:40:06 +01:00
/* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/
/*-Elles se génèrent à des endroits qui peuvent être les mêmes ou gêner le snake*/
{
2023-12-22 21:12:26 +01:00
int x_obstacles , y_obstacles ;
unsigned long i ;
2023-12-22 19:40:06 +01:00
int ok = 0 ;
PIXELS obstacles ;
do {
ok = 0 ;
x_obstacles = ArrondirPixel ( rand ( ) % W_GAME ) ;
y_obstacles = ArrondirPixel ( rand ( ) % H_GAME ) ;
2023-12-24 01:48:21 +01:00
if ( x_obstacles < DECALEMENT )
{
x_obstacles = + DECALEMENT ;
}
if ( y_obstacles < DECALEMENT )
{
y_obstacles = + DECALEMENT ;
}
for ( i = 0 ; i < = longueur_serpent ; i + + )
2023-12-22 19:40:06 +01:00
{
if ( x_obstacles = = serpent [ i ] . x & & y_obstacles = = serpent [ i ] . y )
{
ok = 1 ; /* Check si la pastille se genère sur une coordonné du serpent */
}
if ( x_obstacles = = obstacle [ i ] . x & & y_obstacles = = obstacle [ i ] . y )
{
ok = 1 ;
}
}
2023-12-24 01:48:21 +01:00
for ( i = 0 ; i < = longueur_pastilles ; i + + )
2023-12-22 19:40:06 +01:00
{
if ( x_obstacles = = pastilles [ i ] . x & & y_obstacles = = pastilles [ i ] . y )
{
ok = 1 ; /* Check si la pastille se genère sur une coordonné du serpent */
}
if ( x_obstacles = = obstacle [ i ] . x & & y_obstacles = = obstacle [ i ] . y )
{
ok = 1 ;
}
}
} while ( ok ) ;
obstacles . x = x_obstacles ;
obstacles . y = y_obstacles ;
return obstacles ;
}
2023-12-21 14:32:55 +01:00
void InitialisationDuSerpent ( PIXELS * p_serpent ) /* L'initialisation du serpent */
{
int x_millieu = 0 , y_millieu = 0 , compteur = 0 ;
x_millieu = T_PIXEL * 30 ; /* 30 = 60 colonnes divisé par 2*/
y_millieu = T_PIXEL * 20 ; /* 20 = 40 colonnes divisé par 2*/
ChoisirEcran ( 2 ) ;
ChargerImage ( " ./images/SnakePart.png " , x_millieu , y_millieu , 0 , 0 , T_PIXEL , T_PIXEL ) ;
p_serpent [ 0 ] . x = x_millieu ;
p_serpent [ 0 ] . y = y_millieu ;
for ( compteur = 0 ; compteur < 9 ; compteur + + ) /*Commence par 1 car p_serpent index 0 initialisées pour la tête et 2 + 2x9 = 10 couples de coordonnées 2D */
{
p_serpent [ compteur + 1 ] . x = p_serpent [ compteur ] . x + T_PIXEL ;
p_serpent [ compteur + 1 ] . y = p_serpent [ compteur ] . y ;
ChargerImage ( " ./images/SnakePart.png " , p_serpent [ compteur + 1 ] . x , p_serpent [ compteur + 1 ] . y , 0 , 0 , T_PIXEL , T_PIXEL ) ;
}
}
2023-12-22 21:12:26 +01:00
void InitialiserPastilles ( PIXELS * pastilles , PIXELS * serpent , PIXELS * obstacle , unsigned long longueur_serpent , unsigned long longueur_obstacle ) {
2023-12-21 14:32:55 +01:00
int i ;
srand ( time ( NULL ) ) ;
for ( i = 0 ; i < PASTILLES ; i + + ) {
2023-12-22 19:40:06 +01:00
pastilles [ i ] = gen_pastille ( serpent , pastilles , obstacle , longueur_serpent , longueur_obstacle ) ;
2023-12-21 14:32:55 +01:00
ChargerImage ( " ./images/PommePastille.png " , pastilles [ i ] . x , pastilles [ i ] . y , 0 , 0 , T_PIXEL , T_PIXEL ) ;
}
}
2023-12-22 21:12:26 +01:00
void InitialiserObstacle ( PIXELS * pastilles , PIXELS * serpent , PIXELS * obstacle , unsigned long longueur_serpent , unsigned long longueur_pastilles ) {
2023-12-22 19:40:06 +01:00
int i ;
srand ( time ( NULL ) ) ;
for ( i = 0 ; i < OBSTACLE ; i + + ) {
obstacle [ i ] = gen_obstacle ( serpent , pastilles , obstacle , longueur_serpent , longueur_pastilles ) ;
ChargerImage ( " ./images/Danger.png " , obstacle [ i ] . x , obstacle [ i ] . y , 0 , 0 , T_PIXEL , T_PIXEL ) ;
}
}
2023-12-22 21:12:26 +01:00
void DessinerScene ( PIXELS * pastilles , PIXELS * serpent , PIXELS * obstacle , unsigned long longueur_serpent , unsigned long longueur_pastilles , unsigned long longueur_obstacle ) /* Dessine la scène */
2023-12-21 14:32:55 +01:00
{
couleur bg ;
couleur border ;
ChoisirEcran ( 2 ) ;
border = CouleurParComposante ( 78 , 93 , 47 ) ;
bg = CouleurParComposante ( 171 , 204 , 104 ) ;
ChoisirCouleurDessin ( border ) ;
RemplirRectangle ( 0 , 0 , 930 , 630 ) ;
ChoisirCouleurDessin ( bg ) ;
RemplirRectangle ( 0 , 630 , 930 , 650 ) ;
ChoisirCouleurDessin ( border ) ;
RemplirRectangle ( 0 , 650 , 930 , 15 ) ;
ChoisirCouleurDessin ( bg ) ;
RemplirRectangle ( T_PIXEL , T_PIXEL , W_GAME , H_GAME ) ;
InitialisationDuSerpent ( serpent ) ;
2023-12-22 19:40:06 +01:00
InitialiserPastilles ( pastilles , serpent , obstacle , longueur_serpent , longueur_obstacle ) ;
InitialiserObstacle ( pastilles , serpent , obstacle , longueur_serpent , longueur_pastilles ) ;
2023-12-21 14:32:55 +01:00
}