traitement de tout les input avant de update l'ecrant

This commit is contained in:
2024-12-20 16:11:59 +01:00
parent f01c3d1e8b
commit 02a2945bd6

View File

@@ -1,6 +1,7 @@
/** /**
* \file function.c * \file function.c
* Ce fichier contient toute les fonction utile pour le jeu. Sauf pour l'affichage. * Ce fichier contient toute les fonction utile pour le jeu. Sauf pour
* l'affichage.
* *
*/ */
@@ -18,10 +19,10 @@
#include <time.h> #include <time.h>
/** /**
* \brief Cette fonction permet de creer une liste 2D carre * \brief Cette fonction permet de creer une liste 2D carre
* \param N La valeur N est le nombre d'élément dans le tableau. * \param N La valeur N est le nombre d'élément dans le tableau.
* \return Le pointeur du tableau 2D carre de char (1 octet). * \return Le pointeur du tableau 2D carre de char (1 octet).
*/ */
char **creatArea2D (const unsigned int N) char **creatArea2D (const unsigned int N)
{ {
char **tab2d; char **tab2d;
@@ -56,11 +57,11 @@ char **creatArea2D (const unsigned int N)
} }
/** /**
* \brief Cette fontion permet de liberer l'espace tu tableau 2D de char. * \brief Cette fontion permet de liberer l'espace tu tableau 2D de char.
* \param tab Le tableau 2D. * \param tab Le tableau 2D.
* \param N Le nombre d'éléments. * \param N Le nombre d'éléments.
* \return Void. * \return Void.
*/ */
void free2D (char **tab, int N) void free2D (char **tab, int N)
{ {
int i; int i;
@@ -73,16 +74,20 @@ void free2D (char **tab, int N)
} }
/** /**
* \brief La fontction permet de savoir si le joueur peut ce deplacer dans une direction. * \brief La fontction permet de savoir si le joueur peut ce deplacer dans une
* \param valueOfNCase La valeur de la case dans la direction que le joueur veut aller. * direction.
* \param valueOfNPlusOneCase La valeur de la case dans la direction que le joueur veut aller mais une fois de plus. * \param valueOfNCase La valeur de la case dans la direction que le joueur
* \return 0 Si c'est un mur devant le joueur, 1 si c'est vide devant le joueur, 2 si c'est une boite mais qu'on peux la pousser * veut aller.
* ,3 si le joueur pousse une boite sur un point d'interer, 4 si le joueur bouge sur un point d'interer, 5 si le joueur peux pousser * \param valueOfNPlusOneCase La valeur de la case dans la direction que le
* une boite mais le joueur se place sur un point d'interer et 6 si le joeuur pousse une boite sur un point d'interer et que le joueu * joueur veut aller mais une fois de plus.
* est aussi sur un point d'interer. * \return 0 Si c'est un mur devant le joueur, 1 si c'est vide devant le
*/ * joueur, 2 si c'est une boite mais qu'on peux la pousser ,3 si le joueur
char canIGoDirection (char valueOfNCase, * pousse une boite sur un point d'interer, 4 si le joueur bouge sur un point
char valueOfNPlusOneCase) * d'interer, 5 si le joueur peux pousser une boite mais le joueur se place sur
* un point d'interer et 6 si le joeuur pousse une boite sur un point d'interer
* et que le joueu est aussi sur un point d'interer.
*/
char canIGoDirection (char valueOfNCase, char valueOfNPlusOneCase)
{ {
if (valueOfNCase != WALL) if (valueOfNCase != WALL)
{ {
@@ -126,16 +131,17 @@ char canIGoDirection (char valueOfNCase,
} }
/** /**
* \brief Cette fonction effectue les deplacements du joueur et des boites en fonction de la situation. * \brief Cette fonction effectue les deplacements du joueur et des boites en
* \param tab Le tableau 2D du plateau de jeu. * fonction de la situation.
* \param playerpos La position actuel du joueur. * \param tab Le tableau 2D du plateau de jeu.
* \param direction La direction que le joueur veut effectuer. * \param playerpos La position actuel du joueur.
* \param score_user Toutes les données nécessaire pour calculer le score fini du joueur. * \param direction La direction que le joueur veut effectuer.
* \return Void * \param score_user Toutes les données nécessaire pour calculer le score fini
* * du joueur.
*/ * \return Void
void move (char **tab, vect *playerPos, vect direction, *
score *score_user) */
void move (char **tab, vect *playerPos, vect direction, score *score_user)
{ {
short int valueOfNCase short int valueOfNCase
= tab[playerPos->x + direction.x][playerPos->y + direction.y]; = tab[playerPos->x + direction.x][playerPos->y + direction.y];
@@ -229,34 +235,34 @@ void move (char **tab, vect *playerPos, vect direction,
} }
/** /**
* *
* \brief La fonction permet de faire la boucle de jeu. * \brief La fonction permet de faire la boucle de jeu.
* \param tab2d Le tableau 2d carre. * \param tab2d Le tableau 2d carre.
* \param N LE nombre d'element de tab2d. * \param N LE nombre d'element de tab2d.
* \param playerPos La position de depart du joueur. * \param playerPos La position de depart du joueur.
* \param targets Le tableau de toutes les positions des points d'interer de la maps. * \param targets Le tableau de toutes les positions des points d'interer de la
* \param int nbr_targets Le nombre de point d'interer. * maps.
* \param display_user Tout les information SDL pour afficher le jeu. * \param int nbr_targets Le nombre de point d'interer.
* \param score_user Toute les données nécessaire pour calculer le score fini du joueur. * \param display_user Tout les information SDL pour afficher le jeu.
* \return Void * \param score_user Toute les données nécessaire pour calculer le score fini
*/ * du joueur.
void inGameLoop (char **tab2d, int N, vect *playerPos, * \return Void
vect *targets, int nbr_targets, dis *display_user, */
score *score_user) void inGameLoop (char **tab2d, int N, vect *playerPos, vect *targets,
int nbr_targets, dis *display_user, score *score_user)
{ {
vect size_menu vect size_menu
= { display_user->size_menu -10, display_user->size_window / 3 -10}; = { display_user->size_menu - 10, display_user->size_window / 3 - 10 };
vect coor_time vect coor_time
= { 10, display_user->size_window - display_user->size_menu + 10}; = { 10, display_user->size_window - display_user->size_menu + 10 };
vect coor_move_player vect coor_move_player
= { display_user->size_window / 3 + 10, = { display_user->size_window / 3 + 10,
display_user->size_window - display_user->size_menu + 10}; display_user->size_window - display_user->size_menu + 10 };
vect coor_move_box vect coor_move_box
= { (display_user->size_window / 3) * 2 + 10, = { (display_user->size_window / 3) * 2 + 10,
display_user->size_window - display_user->size_menu + 10}; display_user->size_window - display_user->size_menu + 10 };
displayTextSDL (display_user, "MP : 0", coor_move_player, size_menu, displayTextSDL (display_user, "MP : 0", coor_move_player, size_menu, 50);
50);
displayTextSDL (display_user, "MB : 0", coor_move_box, size_menu, 50); displayTextSDL (display_user, "MB : 0", coor_move_box, size_menu, 50);
time_t time_start = time (NULL); time_t time_start = time (NULL);
time_t current_time = time (NULL); time_t current_time = time (NULL);
@@ -267,66 +273,68 @@ void inGameLoop (char **tab2d, int N, vect *playerPos,
SDL_Event event; SDL_Event event;
while (!finish) while (!finish)
{ {
SDL_PollEvent (&event); while (SDL_PollEvent (&event))
if (event.type == SDL_KEYDOWN)
{ {
input = event.key.keysym.scancode; if (event.type == SDL_KEYDOWN)
switch (input)
{ {
case SDL_SCANCODE_ESCAPE: input = event.key.keysym.scancode;
finish = true; switch (input)
break; {
case SDL_SCANCODE_D: case SDL_SCANCODE_ESCAPE:
direction.y = 1; finish = true;
direction.x = 0; break;
break; case SDL_SCANCODE_D:
case SDL_SCANCODE_A: direction.y = 1;
direction.y = -1; direction.x = 0;
direction.x = 0; break;
break; case SDL_SCANCODE_A:
case SDL_SCANCODE_W: direction.y = -1;
direction.x = -1; direction.x = 0;
direction.y = 0; break;
break; case SDL_SCANCODE_W:
case SDL_SCANCODE_S: direction.x = -1;
direction.x = 1; direction.y = 0;
direction.y = 0; break;
break; case SDL_SCANCODE_S:
default: direction.x = 1;
direction.x = 0; direction.y = 0;
direction.y = 0; break;
} default:
move (tab2d, playerPos, direction, score_user); direction.x = 0;
direction.y = 0;
}
move (tab2d, playerPos, direction, score_user);
screenDisplayGameSDL (tab2d, display_user); screenDisplayGameSDL (tab2d, display_user);
char nbr_p[20]; char nbr_p[20];
snprintf (nbr_p, 20, "MP : %d", score_user->move_player); snprintf (nbr_p, 20, "MP : %d", score_user->move_player);
char nbr_b[20]; char nbr_b[20];
snprintf (nbr_b, 20, "MB : %d", score_user->move_box); snprintf (nbr_b, 20, "MB : %d", score_user->move_box);
displayTextSDL (display_user, nbr_p, coor_move_player, size_menu, displayTextSDL (display_user, nbr_p, coor_move_player,
50); size_menu, 50);
displayTextSDL (display_user, nbr_b, coor_move_box, size_menu, 50); displayTextSDL (display_user, nbr_b, coor_move_box, size_menu,
if (isWin (tab2d, targets, nbr_targets)) 50);
{ if (isWin (tab2d, targets, nbr_targets))
puts ("Win!"); {
finish = true; puts ("Win!");
} finish = true;
if (islose (tab2d, N)) }
{ if (islose (tab2d, N))
puts ("lose!"); {
finish = true; puts ("lose!");
finish = true;
}
} }
SDL_PollEvent (&event);
} }
current_time = time (NULL); current_time = time (NULL);
if (current_time > delay) if (current_time > delay)
{ {
delay = current_time; delay = current_time;
char *char_time = timeToText (time(NULL) - time_start); char *char_time = timeToText (time (NULL) - time_start);
displayTextSDL (display_user, char_time, coor_time, displayTextSDL (display_user, char_time, coor_time, size_menu, 50);
size_menu, 50); free (char_time);
free(char_time);
} }
SDL_Delay (16); SDL_Delay (16);
@@ -334,12 +342,13 @@ void inGameLoop (char **tab2d, int N, vect *playerPos,
} }
/** /**
* \brief Cette fonction verrifie si la partie est gagnante. * \brief Cette fonction verrifie si la partie est gagnante.
* \param tab2d Le tableau 2D du jeu. * \param tab2d Le tableau 2D du jeu.
* \param targets Le tableau de toute les positions des points d'interer. * \param targets Le tableau de toute les positions des points d'interer.
* \param nbr_targets Le nombre de points d'interer. * \param nbr_targets Le nombre de points d'interer.
* \return True si le joueur a remplis tout les points d'interer, false si ce n'est pas le cas . * \return True si le joueur a remplis tout les points d'interer, false si ce
*/ * n'est pas le cas .
*/
bool isWin (char **tab2d, vect *targets, int nbr_targets) bool isWin (char **tab2d, vect *targets, int nbr_targets)
{ {
int i; int i;
@@ -356,12 +365,12 @@ bool isWin (char **tab2d, vect *targets, int nbr_targets)
} }
/** /**
* \brief La fonction renvois si la partie est perdante. * \brief La fonction renvois si la partie est perdante.
* \param tab2d Le tableau 2d carre du plateau de jeu. * \param tab2d Le tableau 2d carre du plateau de jeu.
* \param N Le nombre d'éléments dans le tab2d. * \param N Le nombre d'éléments dans le tab2d.
* \return True si c'est perdu, false si c'est pas perdu a cette instant. * \return True si c'est perdu, false si c'est pas perdu a cette instant.
* *
*/ */
bool islose (char **tab2d, const int N) bool islose (char **tab2d, const int N)
{ {
int x = 0, y = 0; int x = 0, y = 0;
@@ -388,11 +397,11 @@ bool islose (char **tab2d, const int N)
} }
/** /**
* \brief La fonction fait une addition de vecteur, (x1+x2, y1+y2). * \brief La fonction fait une addition de vecteur, (x1+x2, y1+y2).
* \param one Premier vecteur. * \param one Premier vecteur.
* \param two Deuzieme vecteur. * \param two Deuzieme vecteur.
* \return vect Un vecteur de l'addition de one et two. * \return vect Un vecteur de l'addition de one et two.
*/ */
vect plusVect (vect one, vect two) vect plusVect (vect one, vect two)
{ {
vect result; vect result;
@@ -402,16 +411,17 @@ vect plusVect (vect one, vect two)
} }
/** /**
* \brief Renvois la longeur Manhattan * \brief Renvois la longeur Manhattan
*/ */
int lengthVect (vect vector) { return abs (vector.x) + abs (vector.y); } int lengthVect (vect vector) { return abs (vector.x) + abs (vector.y); }
/** /**
* \brief La fonction permet de savoir si une boite est dans une situation ou le joueur ne poura pas la debloqué. * \brief La fonction permet de savoir si une boite est dans une situation ou
* \param tab2d Le tableau 2D carre du plateau de jeu. * le joueur ne poura pas la debloqué.
* \param box_coor Les corrdonnée de la boite que la fonction test. * \param tab2d Le tableau 2D carre du plateau de jeu.
* \return True si la la boite est bloquer, sinon false. * \param box_coor Les corrdonnée de la boite que la fonction test.
*/ * \return True si la la boite est bloquer, sinon false.
*/
bool blockBox (char **tab2d, vect box_coor) bool blockBox (char **tab2d, vect box_coor)
{ {
int nbr_touch = 0; int nbr_touch = 0;
@@ -513,10 +523,10 @@ bool blockBox (char **tab2d, vect box_coor)
} }
/** /**
* \brief Cette fonction renvois transforme le forma time en texte. (min:sec) * \brief Cette fonction renvois transforme le forma time en texte. (min:sec)
* \param time Le temps qu'on veux convertire. * \param time Le temps qu'on veux convertire.
* \return char Le string du texte. * \return char Le string du texte.
*/ */
char *timeToText (time_t time) char *timeToText (time_t time)
{ {
char *result = calloc (20, sizeof (char)); char *result = calloc (20, sizeof (char));