2023-11-29 13:05:44 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <graph.h>
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
#define HAUTEUR 40
|
|
|
|
#define LARGEUR 60
|
|
|
|
#define CYCLE 100000L
|
2023-12-09 15:34:02 +01:00
|
|
|
#define SEGMENT 10
|
|
|
|
#define NOMBRE_POMMES 5
|
2023-11-30 13:20:34 +01:00
|
|
|
#define TAILLE_CASE 20
|
2023-12-09 15:34:02 +01:00
|
|
|
#define TAILLE_SERPENT 10
|
2023-11-29 13:05:44 +01:00
|
|
|
|
|
|
|
/* Enumeration des différentes directions possibles */
|
2023-12-09 15:34:02 +01:00
|
|
|
enum Direction { UP = 2, DOWN = 3, LEFT = 1, RIGHT = 2 };
|
2023-11-29 13:05:44 +01:00
|
|
|
|
|
|
|
typedef struct {
|
2023-12-09 15:34:02 +01:00
|
|
|
int x, y;
|
|
|
|
} Position;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
Position* corps;
|
|
|
|
int longueur;
|
|
|
|
} Serpent;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
Position pomme;
|
|
|
|
} Pomme;
|
|
|
|
|
|
|
|
Serpent serpent;
|
|
|
|
Pomme pommes[NOMBRE_POMMES];
|
2023-11-29 13:05:44 +01:00
|
|
|
|
|
|
|
/* Fonction pour concevoir le graphique */
|
|
|
|
void graphique() {
|
|
|
|
InitialiserGraphique();
|
2023-11-30 13:20:34 +01:00
|
|
|
CreerFenetre(10, 10, 1240, 940);
|
2023-12-01 09:56:16 +01:00
|
|
|
EcrireTexte(500, 400, "Le jeu va commencer !", 2);
|
2023-11-30 13:20:34 +01:00
|
|
|
sleep(1);
|
2023-12-01 09:56:16 +01:00
|
|
|
EffacerEcran(CouleurParComposante(0, 0, 0));
|
2023-11-30 13:20:34 +01:00
|
|
|
}
|
|
|
|
|
2023-12-01 09:56:16 +01:00
|
|
|
void AffichageBasique() {
|
|
|
|
ChoisirCouleurDessin(CouleurParComposante(111, 255, 94));
|
2023-12-09 15:34:02 +01:00
|
|
|
RemplirRectangle(10, 10, TAILLE_CASE * LARGEUR, TAILLE_CASE * LARGEUR);
|
2023-11-30 13:20:34 +01:00
|
|
|
}
|
|
|
|
|
2023-12-01 09:56:16 +01:00
|
|
|
void AfficheTemps(int minute, int seconde) {
|
|
|
|
char temps[6];
|
|
|
|
snprintf(temps, 6, "%02d:%02d", minute, seconde);
|
|
|
|
|
|
|
|
ChoisirCouleurDessin(CouleurParComposante(0, 0, 0));
|
|
|
|
RemplirRectangle(20, 870, 70, 40);
|
2023-11-30 13:20:34 +01:00
|
|
|
|
2023-12-01 09:56:16 +01:00
|
|
|
ChoisirCouleurDessin(CouleurParComposante(255, 255, 255));
|
|
|
|
EcrireTexte(20, 900, temps, 2);
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
void genererPommes() {
|
|
|
|
for (int i = 0; i < NOMBRE_POMMES; i++) {
|
|
|
|
pommes[i].pomme.x = rand() % (LARGEUR);
|
|
|
|
pommes[i].pomme.y = rand() % (HAUTEUR);
|
|
|
|
|
|
|
|
ChoisirCouleurDessin(CouleurParComposante(255, 0, 0));
|
|
|
|
RemplirRectangle(pommes[i].pomme.x * TAILLE_CASE, pommes[i].pomme.y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE);
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
/*Fonction permettant d'afficher le serpent*/
|
|
|
|
void AffichageSerpent(Segment serpent[], int taille) {
|
|
|
|
int i;
|
|
|
|
couleur couleurSerpent = CouleurParComposante(0,0,220);
|
|
|
|
ChoisirCouleurDessin(couleurSerpent);
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
|
serpent[i].x = LARGEUR / 2 + i * TAILLE_CASE;
|
|
|
|
serpent[i].y = HAUTEUR / 2;
|
|
|
|
}
|
|
|
|
for (i = 0; i < taille; i++) {
|
|
|
|
RemplirRectangle(serpent[i].x , serpent[i].y, TAILLE_CASE, TAILLE_CASE);
|
2023-12-01 09:56:16 +01:00
|
|
|
}
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
int collisionAvecPomme(Position *pomme) {
|
|
|
|
return (serpent.corps[0].x == pomme->x && serpent.corps[0].y == pomme->y);
|
|
|
|
}
|
2023-12-01 09:56:16 +01:00
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
int collisionAvecSerpent() {
|
|
|
|
for (int i = 1; i < serpent.longueur; i++) {
|
|
|
|
if (serpent.corps[0].x == serpent.corps[i].x && serpent.corps[0].y == serpent.corps[i].y) {
|
|
|
|
return 1;
|
2023-12-01 09:56:16 +01:00
|
|
|
}
|
|
|
|
}
|
2023-12-09 15:34:02 +01:00
|
|
|
return 0;
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
int collisionAvecBordures() {
|
|
|
|
return (serpent.corps[0].x < 0 || serpent.corps[0].x >= LARGEUR ||
|
|
|
|
serpent.corps[0].y < 0 || serpent.corps[0].y >= HAUTEUR);
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
void gestionCollision() {
|
|
|
|
for (int i = 0; i < NOMBRE_POMMES; i++) {
|
|
|
|
if (collisionAvecPomme(&(pommes[i].pomme))) {
|
|
|
|
serpent.longueur++;
|
|
|
|
serpent.corps = realloc(serpent.corps, sizeof(Position) * serpent.longueur);
|
|
|
|
genererPommes();
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
if (collisionAvecSerpent() || collisionAvecBordures()) {
|
|
|
|
FermerGraphique();
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fonction pour gérer le mouvement du serpent */
|
|
|
|
void mouvementSerpent(int dir) {
|
|
|
|
/* Déplace le corps du serpent en suivant la tête */
|
|
|
|
for (int i = serpent.longueur - 1; i > 0; i--) {
|
|
|
|
serpent.corps[i] = serpent.corps[i - 1];
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
/* Déplace la tête en fonction de la direction */
|
|
|
|
if (dir == LEFT) {
|
|
|
|
serpent.corps[0].x -= 1;
|
|
|
|
} else if (dir == RIGHT) {
|
|
|
|
serpent.corps[0].x += 1;
|
|
|
|
} else if (dir == UP) {
|
|
|
|
serpent.corps[0].y -= 1;
|
|
|
|
} else if (dir == DOWN) {
|
|
|
|
serpent.corps[0].y += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Affichage du serpent */
|
|
|
|
for (int i = 0; i < serpent.longueur; i++) {
|
|
|
|
ChoisirCouleurDessin(CouleurParComposante(0, 255, 0));
|
|
|
|
RemplirRectangle(serpent.corps[i].x * TAILLE_CASE, serpent.corps[i].y * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE);
|
|
|
|
}
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
/* Initialisation du jeu */
|
|
|
|
graphique();
|
2023-12-09 15:34:02 +01:00
|
|
|
AffichageBasique();
|
|
|
|
srand(time(NULL)); // Initialisation de la graine pour rand()
|
|
|
|
serpent.longueur = TAILLE_SERPENT;
|
|
|
|
serpent.corps = malloc(sizeof(Position) * serpent.longueur);
|
2023-11-29 13:05:44 +01:00
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
for (int i = 0; i < serpent.longueur; i++) {
|
|
|
|
serpent.corps[i].x = LARGEUR / 2;
|
|
|
|
serpent.corps[i].y = HAUTEUR / 2;
|
|
|
|
}
|
2023-11-29 13:05:44 +01:00
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
genererPommes();
|
2023-11-29 13:05:44 +01:00
|
|
|
|
2023-12-01 09:56:16 +01:00
|
|
|
unsigned long suivant = Microsecondes() + CYCLE;
|
2023-12-09 15:34:02 +01:00
|
|
|
int dir = RIGHT; /* Direction initiale vers la droite */
|
2023-12-01 09:56:16 +01:00
|
|
|
int temps[2] = {0, 0}, seconde_actuel, old_seconde;
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
while (1) {
|
|
|
|
if (ToucheEnAttente()) {
|
|
|
|
int touche = Touche();
|
|
|
|
switch (touche) {
|
|
|
|
case XK_Left:
|
|
|
|
dir = LEFT;
|
|
|
|
break;
|
|
|
|
case XK_Right:
|
|
|
|
dir = RIGHT;
|
|
|
|
break;
|
|
|
|
case XK_Up:
|
|
|
|
dir = UP;
|
|
|
|
break;
|
|
|
|
case XK_Down:
|
|
|
|
dir = DOWN;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-01 09:56:16 +01:00
|
|
|
/* Calcul du temps */
|
|
|
|
if (Microsecondes() > suivant) {
|
|
|
|
suivant = Microsecondes() + CYCLE;
|
|
|
|
seconde_actuel = (suivant / 1000000) % 10;
|
|
|
|
if (seconde_actuel != old_seconde) {
|
|
|
|
old_seconde = seconde_actuel;
|
|
|
|
if ((temps[1] + 1) == 60) {
|
|
|
|
temps[0]++;
|
|
|
|
temps[1] = 0;
|
|
|
|
} else {
|
|
|
|
temps[1]++;
|
|
|
|
}
|
|
|
|
/* Affichage du temps */
|
|
|
|
AfficheTemps(temps[0], temps[1]);
|
|
|
|
}
|
|
|
|
|
2023-12-09 15:34:02 +01:00
|
|
|
mouvementSerpent(dir);
|
|
|
|
gestionCollision();
|
|
|
|
ActualiserGraphique();
|
|
|
|
usleep(CYCLE);
|
2023-12-01 09:56:16 +01:00
|
|
|
}
|
2023-11-29 13:05:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
FermerGraphique();
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|