opt + fix a memory leak
This commit is contained in:
parent
2d408a24f7
commit
01447538e9
4 changed files with 59 additions and 79 deletions
|
@ -5,7 +5,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* Une case est soit vide, soit occupé par un des joueurs, noir ou blanc */
|
/* 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 */
|
/* Propriété globale du jeu */
|
||||||
enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 };
|
enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 };
|
||||||
|
@ -18,21 +18,18 @@ struct jeton {
|
||||||
};
|
};
|
||||||
typedef struct jeton Jeton;
|
typedef struct jeton Jeton;
|
||||||
|
|
||||||
/* Créer un nouveau jeton */
|
|
||||||
Jeton *nouveau_jeton(void);
|
|
||||||
|
|
||||||
/* Ajoute un nouveau jeton */
|
/* Ajoute un nouveau jeton */
|
||||||
Jeton *ajoute_jeton(int position_i, int position_j, int couleur);
|
Jeton *ajoute_jeton(int position_i, int position_j, int couleur);
|
||||||
|
|
||||||
/* Élement de la liste */
|
/* Élement de la liste */
|
||||||
struct element {
|
struct element {
|
||||||
Jeton *jeton_act;
|
Jeton *jeton;
|
||||||
struct element *suivant;
|
struct element *suivant;
|
||||||
};
|
};
|
||||||
typedef struct element Element;
|
typedef struct element Element;
|
||||||
|
|
||||||
/* Créer un nouvel élément pour la liste */
|
/* Créer un nouvel élément pour la liste */
|
||||||
Element *nouvel_element(void);
|
Element *nouvel_element(Jeton *jeton);
|
||||||
|
|
||||||
/* Liste chaînée */
|
/* Liste chaînée */
|
||||||
struct list {
|
struct list {
|
||||||
|
@ -44,10 +41,10 @@ typedef struct list Liste;
|
||||||
Liste *nouvelle_liste(void);
|
Liste *nouvelle_liste(void);
|
||||||
|
|
||||||
/* Ajoute un élément à la liste */
|
/* 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 */
|
/* 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 */
|
/* Libère la liste en mémoire */
|
||||||
void free_liste(Liste *liste);
|
void free_liste(Liste *liste);
|
||||||
|
@ -65,14 +62,11 @@ typedef struct joueur Joueur;
|
||||||
/* Créer un nouveau joueur */
|
/* Créer un nouveau joueur */
|
||||||
Joueur *nouveau_joueur(int pion);
|
Joueur *nouveau_joueur(int pion);
|
||||||
|
|
||||||
/* Ajoute un nouveau joueur */
|
/* Ajoute un jeton d'un joueur */
|
||||||
Joueur *ajoute_joueur(int pion, char *nom);
|
void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton);
|
||||||
|
|
||||||
/* Ajoute un jeton d'un joueur à la liste */
|
/* Retire le jeton d'un joueur */
|
||||||
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton);
|
void retire_jeton_joueur(Joueur *joueur, Jeton *jeton);
|
||||||
|
|
||||||
/* Supprime le jeton d'un joueur de la liste */
|
|
||||||
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton);
|
|
||||||
|
|
||||||
/* Jeu contenant nos 2 joueurs et le plateau de jeu */
|
/* Jeu contenant nos 2 joueurs et le plateau de jeu */
|
||||||
struct jeu {
|
struct jeu {
|
||||||
|
|
26
src/jeu.c
26
src/jeu.c
|
@ -1,13 +1,5 @@
|
||||||
#include "../includes/plateau.h"
|
#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 *ajoute_jeton(int pos_i, int pos_j, int couleur) {
|
||||||
Jeton *jeton = malloc(sizeof(Jeton));
|
Jeton *jeton = malloc(sizeof(Jeton));
|
||||||
jeton->couleur = couleur;
|
jeton->couleur = couleur;
|
||||||
|
@ -19,17 +11,7 @@ Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) {
|
||||||
|
|
||||||
Joueur *nouveau_joueur(int pion) {
|
Joueur *nouveau_joueur(int pion) {
|
||||||
Joueur *joueur = malloc(sizeof(Joueur));
|
Joueur *joueur = malloc(sizeof(Joueur));
|
||||||
joueur->nom = pion > 0 ? "NOIR" : "BLANC";
|
joueur->nom = pion == NOIR ? "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->couleur = pion;
|
joueur->couleur = pion;
|
||||||
joueur->liste_jeton = nouvelle_liste();
|
joueur->liste_jeton = nouvelle_liste();
|
||||||
joueur->nb_jeton = 0;
|
joueur->nb_jeton = 0;
|
||||||
|
@ -53,5 +35,11 @@ void free_jeu(Jeu *jeu) {
|
||||||
free_liste(jeu->j2->liste_jeton);
|
free_liste(jeu->j2->liste_jeton);
|
||||||
free(jeu->j2);
|
free(jeu->j2);
|
||||||
|
|
||||||
|
for (int i = 0; i < LONGEUR; ++i) {
|
||||||
|
for (int j = 0; j < LARGEUR; ++j) {
|
||||||
|
free(jeu->plateau[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
free(jeu);
|
free(jeu);
|
||||||
}
|
}
|
||||||
|
|
76
src/liste.c
76
src/liste.c
|
@ -1,7 +1,9 @@
|
||||||
#include "../includes/struct.h"
|
#include "../includes/struct.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
Element *nouvel_element(void) {
|
Element *nouvel_element(Jeton *jeton) {
|
||||||
Element *element = malloc(sizeof(Element));
|
Element *element = malloc(sizeof(Element));
|
||||||
|
element->jeton = jeton;
|
||||||
element->suivant = NULL;
|
element->suivant = NULL;
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
@ -13,49 +15,49 @@ Liste *nouvelle_liste(void) {
|
||||||
return liste;
|
return liste;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton) {
|
void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton) {
|
||||||
joueur->nb_jeton = joueur->nb_jeton + 1;
|
// Change le jeton
|
||||||
Element *ajout = nouvel_element();
|
jeton->couleur = joueur->couleur;
|
||||||
ajout->jeton_act = jeton;
|
|
||||||
ajoute_liste(joueur->liste_jeton->premier, ajout);
|
// 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) {
|
void ajoute_liste(Liste *liste, Element *nouveau) {
|
||||||
if (actuel == NULL) {
|
Element *ptr = liste->premier;
|
||||||
actuel = nouveau;
|
while (ptr) {
|
||||||
} else if (actuel->jeton_act->pos_i != nouveau->jeton_act->pos_i ||
|
ptr = ptr->suivant;
|
||||||
actuel->jeton_act->pos_j != nouveau->jeton_act->pos_j) {
|
|
||||||
ajoute_liste(actuel->suivant, nouveau);
|
|
||||||
}
|
}
|
||||||
|
ptr = nouveau;
|
||||||
}
|
}
|
||||||
|
|
||||||
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton) {
|
void retire_jeton_joueur(Joueur *joueur, Jeton *jeton) {
|
||||||
if (joueur->liste_jeton->premier->jeton_act != jeton) {
|
Element *tmp = joueur->liste_jeton->premier;
|
||||||
if (supprime_liste(joueur->liste_jeton->premier, jeton)) {
|
if (tmp->jeton == jeton) {
|
||||||
joueur->nb_jeton = joueur->nb_jeton - 1;
|
joueur->liste_jeton->premier = tmp->suivant;
|
||||||
}
|
|
||||||
|
|
||||||
} 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;
|
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
return 1;
|
|
||||||
} else {
|
} 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,20 +8,16 @@ void remplissage_debut(Jeu *jeu) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// D4
|
// D4
|
||||||
jeu->plateau[3][3]->couleur = BLANC;
|
ajoute_jeton_joueur(jeu->j2, jeu->plateau[3][3]);
|
||||||
ajoute_jeton_liste(jeu->j2, jeu->plateau[3][3]);
|
|
||||||
|
|
||||||
// E4
|
// E4
|
||||||
jeu->plateau[3][4]->couleur = NOIR;
|
ajoute_jeton_joueur(jeu->j1, jeu->plateau[3][4]);
|
||||||
ajoute_jeton_liste(jeu->j1, jeu->plateau[3][4]);
|
|
||||||
|
|
||||||
// E5
|
// E5
|
||||||
jeu->plateau[4][4]->couleur = BLANC;
|
ajoute_jeton_joueur(jeu->j2, jeu->plateau[4][4]);
|
||||||
ajoute_jeton_liste(jeu->j2, jeu->plateau[4][4]);
|
|
||||||
|
|
||||||
// D5
|
// D5
|
||||||
jeu->plateau[4][3]->couleur = NOIR;
|
ajoute_jeton_joueur(jeu->j1, jeu->plateau[4][3]);
|
||||||
ajoute_jeton_liste(jeu->j1, jeu->plateau[4][3]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) {
|
char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) {
|
||||||
|
|
Reference in a new issue