196 lines
6.3 KiB
C
196 lines
6.3 KiB
C
#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;
|
|
}
|
|
|
|
PIXELS gen_pastille(PIXELS *serpent,PIXELS *pastilles,PIXELS *obstacle,unsigned long longueur_serpent,unsigned long longueur_obstacle)
|
|
|
|
/* 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*/
|
|
{
|
|
int x_pastille,y_pastille;
|
|
unsigned long i;
|
|
int ok = 0;
|
|
PIXELS pastille;
|
|
do{
|
|
ok = 0;
|
|
x_pastille= ArrondirPixel(rand()%W_GAME);
|
|
y_pastille = ArrondirPixel(rand()%H_GAME);
|
|
|
|
if(x_pastille < DECALEMENT)
|
|
{
|
|
x_pastille =+ DECALEMENT;
|
|
}
|
|
|
|
if(y_pastille < DECALEMENT)
|
|
{
|
|
y_pastille =+ DECALEMENT;
|
|
}
|
|
|
|
for(i=0;i<=longueur_serpent;i++)
|
|
{
|
|
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;
|
|
}
|
|
|
|
}
|
|
for(i=0;i<=longueur_obstacle;i++)
|
|
{
|
|
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;
|
|
}
|
|
|
|
}
|
|
}while(ok);
|
|
|
|
|
|
pastille.x = x_pastille ;
|
|
pastille.y = y_pastille ;
|
|
|
|
return pastille;
|
|
}
|
|
|
|
PIXELS gen_obstacle(PIXELS *serpent,PIXELS *pastilles,PIXELS *obstacle,unsigned long longueur_serpent,unsigned long longueur_pastilles)
|
|
|
|
/* 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*/
|
|
{
|
|
int x_obstacles,y_obstacles;
|
|
unsigned long i;
|
|
int ok = 0;
|
|
PIXELS obstacles;
|
|
do{
|
|
ok = 0;
|
|
x_obstacles= ArrondirPixel(rand()%W_GAME);
|
|
y_obstacles = ArrondirPixel(rand()%H_GAME);
|
|
|
|
if(x_obstacles < DECALEMENT)
|
|
{
|
|
x_obstacles =+ DECALEMENT;
|
|
}
|
|
|
|
if(y_obstacles < DECALEMENT)
|
|
{
|
|
y_obstacles =+ DECALEMENT;
|
|
}
|
|
|
|
for(i=0;i<=longueur_serpent;i++)
|
|
{
|
|
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;
|
|
}
|
|
|
|
}
|
|
for(i=0;i<=longueur_pastilles;i++)
|
|
{
|
|
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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
void InitialiserPastilles(PIXELS *pastilles, PIXELS *serpent,PIXELS *obstacle, unsigned long longueur_serpent,unsigned long longueur_obstacle) {
|
|
int i;
|
|
|
|
srand(time(NULL));
|
|
|
|
for (i = 0; i < PASTILLES; i++) {
|
|
pastilles[i] = gen_pastille(serpent,pastilles,obstacle,longueur_serpent,longueur_obstacle);
|
|
ChargerImage("./images/PommePastille.png",pastilles[i].x,pastilles[i].y,0,0,T_PIXEL,T_PIXEL);
|
|
}
|
|
}
|
|
|
|
void InitialiserObstacle(PIXELS *pastilles, PIXELS *serpent,PIXELS *obstacle, unsigned long longueur_serpent,unsigned long longueur_pastilles) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
void DessinerScene(PIXELS *pastilles, PIXELS *serpent,PIXELS *obstacle, unsigned long longueur_serpent,unsigned long longueur_pastilles,unsigned long longueur_obstacle) /* Dessine la scène */
|
|
{
|
|
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);
|
|
InitialiserPastilles(pastilles,serpent,obstacle,longueur_serpent,longueur_obstacle);
|
|
InitialiserObstacle(pastilles,serpent,obstacle,longueur_serpent,longueur_pastilles);
|
|
} |