2023-11-21 18:15:28 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <graph.h>
|
|
|
|
#include <time.h>
|
2023-12-24 01:48:21 +01:00
|
|
|
#include "evenements.h"
|
2023-12-03 14:16:38 +01:00
|
|
|
#include "main.h"
|
2023-12-21 14:32:55 +01:00
|
|
|
#include "gui.h"
|
|
|
|
#include "scene.h"
|
2023-11-22 14:10:35 +01:00
|
|
|
|
2023-12-18 15:21:28 +01:00
|
|
|
#define DELTA 100000L
|
|
|
|
#define DELTA2 1000000L
|
2023-11-24 11:12:49 +01:00
|
|
|
|
2023-12-23 17:08:17 +01:00
|
|
|
void FinJeu(PIXELS* serpent,PIXELS* pastilles,PIXELS* obstacle)
|
|
|
|
{
|
|
|
|
free(serpent);
|
|
|
|
free(pastilles);
|
|
|
|
free(obstacle);
|
|
|
|
FermerGraphique();
|
|
|
|
}
|
|
|
|
|
2023-11-22 23:32:52 +01:00
|
|
|
int main()
|
2023-11-29 23:20:57 +01:00
|
|
|
{
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Déclarations des variables */
|
2023-11-29 23:20:57 +01:00
|
|
|
unsigned char pause = 0;
|
2023-12-18 15:21:28 +01:00
|
|
|
unsigned long score = 0;
|
2023-11-22 23:32:52 +01:00
|
|
|
unsigned long suivant;
|
2023-12-15 22:58:53 +01:00
|
|
|
unsigned long suivant2;
|
2023-12-19 17:23:38 +01:00
|
|
|
int game_on=0;
|
|
|
|
int window_on=1;
|
2023-12-15 22:58:53 +01:00
|
|
|
int secondes = 0;
|
|
|
|
int minutes = 0;
|
2023-12-18 15:21:28 +01:00
|
|
|
unsigned long int vitesse = DELTA;
|
2023-12-19 17:23:38 +01:00
|
|
|
int valeur_retourne = 0;
|
2023-12-21 14:32:55 +01:00
|
|
|
unsigned char perdu = 0;
|
2023-12-03 14:16:38 +01:00
|
|
|
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Tailles des tableaux dynamiques */
|
2023-12-18 15:21:28 +01:00
|
|
|
size_t longueur_serpent = 10;
|
2023-12-12 17:29:02 +01:00
|
|
|
size_t longueur_pastilles = PASTILLES;
|
2023-12-22 19:40:06 +01:00
|
|
|
size_t longueur_obstacle = OBSTACLE;
|
2023-12-23 17:08:17 +01:00
|
|
|
|
|
|
|
/* Allocation dynamique des tableaux */
|
2023-12-12 16:03:47 +01:00
|
|
|
PIXELS *serpent = (PIXELS *)malloc(longueur_serpent * sizeof(PIXELS));
|
2023-12-03 14:16:38 +01:00
|
|
|
PIXELS *pastilles = (PIXELS *)malloc(longueur_pastilles * sizeof(PIXELS));
|
2023-12-22 19:40:06 +01:00
|
|
|
PIXELS *obstacle = (PIXELS *)malloc(longueur_obstacle * sizeof(PIXELS));
|
|
|
|
|
2023-12-03 14:16:38 +01:00
|
|
|
|
2023-11-24 11:12:49 +01:00
|
|
|
int direction = 0;
|
2023-12-02 08:02:05 +01:00
|
|
|
int direction_davant = 0;
|
2023-11-24 11:12:49 +01:00
|
|
|
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Vérification des allocations mémoire */
|
|
|
|
|
2023-11-24 11:12:49 +01:00
|
|
|
if(serpent == NULL) {
|
|
|
|
fprintf(stderr, "Erreur d'allocation de mémoire.\n");
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
if(pastilles == NULL) {
|
|
|
|
fprintf(stderr, "Erreur d'allocation de mémoire.\n");
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2023-12-22 19:40:06 +01:00
|
|
|
if(obstacle == NULL) {
|
|
|
|
fprintf(stderr, "Erreur d'allocation de mémoire.\n");
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Initialisations */
|
2023-11-21 16:45:49 +01:00
|
|
|
InitialiserGraphique();
|
2023-11-22 23:32:52 +01:00
|
|
|
CreerFenetre(10,10,W_WINDOW,H_WINDOW); /* Peut être changer cette ligne avec la fonction Maxx et Maxy fournie dans graph.h ??*/
|
2023-11-21 18:15:28 +01:00
|
|
|
ChoisirTitreFenetre("SNAKE SAE11 IN C");
|
2023-12-22 19:40:06 +01:00
|
|
|
DessinerScene(pastilles,serpent,obstacle,longueur_serpent,longueur_pastilles,longueur_obstacle);
|
2023-12-19 17:23:38 +01:00
|
|
|
while(window_on)
|
|
|
|
{
|
2023-12-21 14:32:55 +01:00
|
|
|
if(perdu == 1)
|
2023-12-23 16:00:48 +01:00
|
|
|
{
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Affichage de l'écran de fin de partie */
|
2023-12-23 16:00:48 +01:00
|
|
|
PerduGUI();
|
2023-12-21 14:32:55 +01:00
|
|
|
if (ToucheEnAttente() == 1)
|
2023-11-22 23:32:52 +01:00
|
|
|
{
|
2023-12-21 14:32:55 +01:00
|
|
|
switch (Touche())
|
|
|
|
{
|
|
|
|
case XK_Return:
|
|
|
|
perdu = 0;
|
|
|
|
break;
|
2023-12-23 17:08:17 +01:00
|
|
|
case XK_Escape:
|
|
|
|
FinJeu(serpent,pastilles,obstacle);
|
|
|
|
return EXIT_SUCCESS;
|
2023-12-21 14:32:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-12-23 17:08:17 +01:00
|
|
|
/* Affichage du menu principal */
|
2023-12-23 16:00:48 +01:00
|
|
|
Menu();
|
2023-12-21 14:32:55 +01:00
|
|
|
if (ToucheEnAttente() == 1)
|
|
|
|
{
|
|
|
|
switch (Touche())
|
|
|
|
{
|
|
|
|
case XK_Return :
|
|
|
|
game_on=1;
|
|
|
|
secondes = 0;
|
|
|
|
minutes = 0;
|
|
|
|
score = 0;
|
|
|
|
vitesse = DELTA;
|
|
|
|
longueur_serpent = 10;
|
|
|
|
direction = 0;
|
|
|
|
direction_davant = 0;
|
2023-12-22 19:40:06 +01:00
|
|
|
DessinerScene(pastilles,serpent,obstacle,longueur_serpent,longueur_pastilles,longueur_obstacle);
|
2023-12-21 14:32:55 +01:00
|
|
|
break;
|
|
|
|
case XK_Escape:
|
2023-12-23 17:08:17 +01:00
|
|
|
FinJeu(serpent,pastilles,obstacle);
|
2023-12-21 14:32:55 +01:00
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
2023-11-22 23:32:52 +01:00
|
|
|
}
|
|
|
|
}
|
2023-12-19 17:23:38 +01:00
|
|
|
|
|
|
|
while(game_on) /* Lancement du cycle pour les Inputs et le Jeu*/
|
|
|
|
{
|
2023-12-24 01:48:21 +01:00
|
|
|
if (ToucheEnAttente() == 1)
|
2023-12-18 15:21:28 +01:00
|
|
|
{
|
2023-12-24 01:48:21 +01:00
|
|
|
switch (Touche())
|
|
|
|
{
|
|
|
|
case XK_Up:
|
|
|
|
direction = 1;
|
|
|
|
if(direction_davant == 3 && direction == 1)
|
|
|
|
{
|
|
|
|
direction = direction_davant;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case XK_Down:
|
|
|
|
direction = 3;
|
|
|
|
if(direction_davant == 1 && direction == 3)
|
|
|
|
{
|
|
|
|
direction = direction_davant; /* Changements de direction du serpent */
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case XK_Left:
|
|
|
|
direction = 0;
|
|
|
|
if(direction_davant == 2 && direction == 0)
|
|
|
|
{
|
|
|
|
direction = direction_davant;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case XK_Right:
|
|
|
|
direction = 2;
|
|
|
|
if(direction_davant == 0 && direction == 2)
|
|
|
|
{
|
|
|
|
direction = direction_davant;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case XK_space:
|
|
|
|
if(pause ==0)
|
|
|
|
{
|
|
|
|
pause=1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
pause=0;
|
|
|
|
break;
|
2023-12-21 14:32:55 +01:00
|
|
|
|
2023-12-24 01:48:21 +01:00
|
|
|
case XK_Escape:
|
|
|
|
if(pause == 1)
|
|
|
|
{
|
|
|
|
FinJeu(serpent,pastilles,obstacle);
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-19 17:23:38 +01:00
|
|
|
if(pause==1)
|
|
|
|
{
|
2023-12-23 16:00:48 +01:00
|
|
|
Pause();
|
2023-12-19 17:23:38 +01:00
|
|
|
}
|
2023-12-23 17:08:17 +01:00
|
|
|
else if(pause==0)
|
2023-12-19 17:23:38 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
if (Microsecondes()>suivant2)
|
2023-12-18 15:21:28 +01:00
|
|
|
{
|
2023-12-19 17:23:38 +01:00
|
|
|
secondes++;
|
|
|
|
if(secondes == 60)
|
|
|
|
{
|
|
|
|
minutes++;
|
|
|
|
secondes = 0;
|
|
|
|
}
|
|
|
|
suivant2=Microsecondes()+DELTA2;
|
2023-12-18 15:21:28 +01:00
|
|
|
}
|
2023-12-19 17:23:38 +01:00
|
|
|
|
|
|
|
if (Microsecondes()>suivant)
|
|
|
|
{
|
2023-12-21 14:32:55 +01:00
|
|
|
serpent = (PIXELS*) realloc(serpent,longueur_serpent * sizeof(PIXELS));
|
2023-12-19 17:23:38 +01:00
|
|
|
suivant=Microsecondes()+vitesse;
|
|
|
|
AfficherTimerEtScore(&score,minutes,secondes);
|
|
|
|
direction_davant = direction; /* Check si le serpent à le droit de changer de direction */
|
|
|
|
|
2023-12-22 19:40:06 +01:00
|
|
|
valeur_retourne = Serpent(serpent,pastilles,obstacle,&score,&longueur_serpent,longueur_obstacle,&vitesse,direction);
|
2023-12-19 17:23:38 +01:00
|
|
|
if(valeur_retourne == 1)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if (valeur_retourne == 2)
|
|
|
|
{
|
2023-12-23 16:00:48 +01:00
|
|
|
CheckScore(score);
|
2023-12-21 14:32:55 +01:00
|
|
|
perdu=1;
|
2023-12-19 17:23:38 +01:00
|
|
|
game_on=0;
|
|
|
|
}
|
2023-12-18 15:21:28 +01:00
|
|
|
}
|
2023-12-09 09:04:42 +01:00
|
|
|
}
|
2023-11-29 23:20:57 +01:00
|
|
|
}
|
2023-11-27 00:24:33 +01:00
|
|
|
}
|
2023-12-23 17:08:17 +01:00
|
|
|
FinJeu(serpent,pastilles,obstacle);
|
2023-11-21 16:45:49 +01:00
|
|
|
return EXIT_SUCCESS;
|
2023-12-24 01:48:21 +01:00
|
|
|
}
|