opt + fix a memory leak

This commit is contained in:
Mylloon 2022-11-16 16:29:39 +01:00
parent 2d408a24f7
commit 01447538e9
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 59 additions and 79 deletions

View file

@ -5,7 +5,7 @@
#include <stdlib.h>
/* Une case est soit vide, soit occupé par un des joueurs, noir ou blanc */
enum CASE_PLAT { VIDE, BLANC = -2, NOIR = 2 };
enum CASE_PLAT { VIDE, BLANC, NOIR };
/* Propriété globale du jeu */
enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 };
@ -18,21 +18,18 @@ struct jeton {
};
typedef struct jeton Jeton;
/* Créer un nouveau jeton */
Jeton *nouveau_jeton(void);
/* Ajoute un nouveau jeton */
Jeton *ajoute_jeton(int position_i, int position_j, int couleur);
/* Élement de la liste */
struct element {
Jeton *jeton_act;
Jeton *jeton;
struct element *suivant;
};
typedef struct element Element;
/* Créer un nouvel élément pour la liste */
Element *nouvel_element(void);
Element *nouvel_element(Jeton *jeton);
/* Liste chaînée */
struct list {
@ -44,10 +41,10 @@ typedef struct list Liste;
Liste *nouvelle_liste(void);
/* Ajoute un élément à la liste */
void ajoute_liste(Element *element_actuel, Element *nouvel_element);
void ajoute_liste(Liste *liste, Element *nouvel_element);
/* Supprime un élément de la liste */
int supprime_liste(Element *element_actuel, Jeton *jeton);
void supprime_liste(Element *element_actuel, Jeton *jeton);
/* Libère la liste en mémoire */
void free_liste(Liste *liste);
@ -65,14 +62,11 @@ typedef struct joueur Joueur;
/* Créer un nouveau joueur */
Joueur *nouveau_joueur(int pion);
/* Ajoute un nouveau joueur */
Joueur *ajoute_joueur(int pion, char *nom);
/* Ajoute un jeton d'un joueur */
void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton);
/* Ajoute un jeton d'un joueur à la liste */
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton);
/* Supprime le jeton d'un joueur de la liste */
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton);
/* Retire le jeton d'un joueur */
void retire_jeton_joueur(Joueur *joueur, Jeton *jeton);
/* Jeu contenant nos 2 joueurs et le plateau de jeu */
struct jeu {

View file

@ -1,13 +1,5 @@
#include "../includes/plateau.h"
Jeton *nouveau_jeton(void) {
Jeton *jeton = malloc(sizeof(Jeton));
jeton->couleur = NOIR;
jeton->pos_i = -1;
jeton->pos_j = -1;
return jeton;
}
Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) {
Jeton *jeton = malloc(sizeof(Jeton));
jeton->couleur = couleur;
@ -19,17 +11,7 @@ Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) {
Joueur *nouveau_joueur(int pion) {
Joueur *joueur = malloc(sizeof(Joueur));
joueur->nom = pion > 0 ? "NOIR" : "BLANC";
joueur->couleur = pion;
joueur->liste_jeton = nouvelle_liste();
joueur->nb_jeton = 0;
return joueur;
}
Joueur *ajoute_joueur(int pion, char *n) {
Joueur *joueur = malloc(sizeof(Joueur));
joueur->nom = n;
joueur->nom = pion == NOIR ? "NOIR" : "BLANC";
joueur->couleur = pion;
joueur->liste_jeton = nouvelle_liste();
joueur->nb_jeton = 0;
@ -53,5 +35,11 @@ void free_jeu(Jeu *jeu) {
free_liste(jeu->j2->liste_jeton);
free(jeu->j2);
for (int i = 0; i < LONGEUR; ++i) {
for (int j = 0; j < LARGEUR; ++j) {
free(jeu->plateau[i][j]);
}
}
free(jeu);
}

View file

@ -1,7 +1,9 @@
#include "../includes/struct.h"
#include <stdlib.h>
Element *nouvel_element(void) {
Element *nouvel_element(Jeton *jeton) {
Element *element = malloc(sizeof(Element));
element->jeton = jeton;
element->suivant = NULL;
return element;
}
@ -13,49 +15,49 @@ Liste *nouvelle_liste(void) {
return liste;
}
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton) {
joueur->nb_jeton = joueur->nb_jeton + 1;
Element *ajout = nouvel_element();
ajout->jeton_act = jeton;
ajoute_liste(joueur->liste_jeton->premier, ajout);
void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton) {
// Change le jeton
jeton->couleur = joueur->couleur;
// Ajoute le jeton à la liste des jetons du joueur
Element *element = nouvel_element(jeton);
ajoute_liste(joueur->liste_jeton, element);
joueur->nb_jeton++;
}
void ajoute_liste(Element *actuel, Element *nouveau) {
if (actuel == NULL) {
actuel = nouveau;
} else if (actuel->jeton_act->pos_i != nouveau->jeton_act->pos_i ||
actuel->jeton_act->pos_j != nouveau->jeton_act->pos_j) {
ajoute_liste(actuel->suivant, nouveau);
void ajoute_liste(Liste *liste, Element *nouveau) {
Element *ptr = liste->premier;
while (ptr) {
ptr = ptr->suivant;
}
ptr = nouveau;
}
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton) {
if (joueur->liste_jeton->premier->jeton_act != jeton) {
if (supprime_liste(joueur->liste_jeton->premier, jeton)) {
joueur->nb_jeton = joueur->nb_jeton - 1;
}
} else {
joueur->liste_jeton->premier = joueur->liste_jeton->premier->suivant;
joueur->nb_jeton = joueur->nb_jeton - 1;
}
}
int supprime_liste(Element *act, Jeton *data) {
if (act->suivant == NULL) {
fprintf(stderr, "N'est pas dans la liste, pas possible de supprimer\n");
return 0;
} else if (act->suivant->jeton_act == data) {
printf("C'est (%d;%d)\n", act->suivant->jeton_act->pos_i,
act->suivant->jeton_act->pos_j);
Element *tmp = act->suivant;
act->suivant = act->suivant->suivant;
void retire_jeton_joueur(Joueur *joueur, Jeton *jeton) {
Element *tmp = joueur->liste_jeton->premier;
if (tmp->jeton == jeton) {
joueur->liste_jeton->premier = tmp->suivant;
free(tmp);
return 1;
} else {
return supprime_liste(act->suivant, data);
supprime_liste(tmp, jeton);
}
joueur->nb_jeton--;
jeton->couleur = VIDE;
}
void supprime_liste(Element *act, Jeton *data) {
if (act->suivant == NULL) {
fprintf(stderr, "Élement introuvable dans la liste\n");
exit(EXIT_FAILURE);
} else if (act->suivant->jeton == data) {
Element *tmp = act->suivant;
printf("=> (%d;%d)\n", tmp->jeton->pos_i, tmp->jeton->pos_j);
act->suivant = tmp->suivant->suivant;
free(tmp);
} else {
supprime_liste(act->suivant, data);
}
}

View file

@ -8,20 +8,16 @@ void remplissage_debut(Jeu *jeu) {
}
// D4
jeu->plateau[3][3]->couleur = BLANC;
ajoute_jeton_liste(jeu->j2, jeu->plateau[3][3]);
ajoute_jeton_joueur(jeu->j2, jeu->plateau[3][3]);
// E4
jeu->plateau[3][4]->couleur = NOIR;
ajoute_jeton_liste(jeu->j1, jeu->plateau[3][4]);
ajoute_jeton_joueur(jeu->j1, jeu->plateau[3][4]);
// E5
jeu->plateau[4][4]->couleur = BLANC;
ajoute_jeton_liste(jeu->j2, jeu->plateau[4][4]);
ajoute_jeton_joueur(jeu->j2, jeu->plateau[4][4]);
// D5
jeu->plateau[4][3]->couleur = NOIR;
ajoute_jeton_liste(jeu->j1, jeu->plateau[4][3]);
ajoute_jeton_joueur(jeu->j1, jeu->plateau[4][3]);
}
char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) {