diff --git a/includes/jeu.h b/includes/jeu.h index f983d60..c467cf6 100644 --- a/includes/jeu.h +++ b/includes/jeu.h @@ -68,8 +68,18 @@ void _jeu_joueur(Jeu *jeu, int case_i, int case_j, int case_i_direction, * Renvoie 0 en cas de coup illégal */ int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur); +/* Coups possibles d'un joueur */ +struct coups { + Liste *coups; + int taille_liste; +}; +typedef struct coups Coups; + +/* Libère les coups possibles de la mémoire */ +void free_coups(Coups *coups); + /* Vérifie si un joueur peut jouer */ -int action_possible_joueur(Jeton *plateau[LONGEUR][LARGEUR], int couleur); +Coups *action_possible_joueur(Jeton *plateau[LONGEUR][LARGEUR], int couleur); /* Auxiliaire : Demande au joueur où placer son jeton */ void _action_joueur_humain(int *ligne, int *colonne); @@ -86,7 +96,7 @@ int partie_finie(Jeu *jeu); * joueurs */ int selection_gagnant(Jeu *jeu, int *resultat); -/* Libère le jeu en mémoire */ +/* Libère le jeu de la mémoire */ void free_jeu(Jeu *jeu); #endif diff --git a/src/jeu.c b/src/jeu.c index 6bb37ca..5e3b5c6 100644 --- a/src/jeu.c +++ b/src/jeu.c @@ -35,12 +35,18 @@ void deroulement_partie(Jeu *jeu) { while (!partie_finie(jeu)) { affiche_plateau(jeu->plateau); - if (action_possible_joueur(jeu->plateau, tour)) { + Coups *possibilites = action_possible_joueur(jeu->plateau, tour); + if (possibilites->taille_liste > 0) { // Si le joueur peut jouer + printf("Coups possibles : "); + affiche_liste(possibilites->coups->premier); + printf("\n"); + action_joueur_humain(jeu, tour); } else { printf("Pas de coup jouable.\n"); } + free_coups(possibilites); tour = tour == NOIR ? BLANC : NOIR; } @@ -107,15 +113,12 @@ int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur) { for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { if (i != 0 || j != 0) { - if (case_i + i >= 0 && case_j + j >= 0 && + if (_case_jouable(jeu->plateau, case_i, case_j, i, j, + couleur) && jeu->plateau[case_i + i][case_j + j]->couleur == - couleur_ennemi(couleur) && - _case_jouable(jeu->plateau, case_i, case_j, i, j, - couleur)) { + couleur_ennemi(couleur)) { _jeu_joueur(jeu, case_i, case_j, i, j, couleur); flag = 1; - - break; } } } @@ -134,19 +137,21 @@ int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur) { return flag; } -int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) { - // TODO (enhancement): Instead of returning if the player can play, return a - // structure with: if the player can play, and the possible moves of the - // player +Coups *action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) { + Coups *coups = malloc(sizeof(Coups)); + coups->coups = nouvelle_liste(); + coups->taille_liste = 0; + for (int i = 0; i < LONGEUR; i++) { for (int j = 0; j < LARGEUR; j++) { if (case_jouable(plat, i, j, couleur)) { - return 1; + ajoute_liste(coups->coups, nouvel_element(plat[i][j])); + coups->taille_liste++; } } } - return 0; + return coups; } void _action_joueur_humain(int *ligne, int *colonne) { @@ -181,7 +186,7 @@ void _action_joueur_humain(int *ligne, int *colonne) { } void action_joueur_humain(Jeu *jeu, int couleur) { - printf("Tour de %c !\n", couleur); + printf("Tour des %c !\n", couleur); int ligne, colonne; _action_joueur_humain(&ligne, &colonne); @@ -201,9 +206,16 @@ void action_joueur_humain(Jeu *jeu, int couleur) { } int partie_finie(Jeu *jeu) { - return ((!action_possible_joueur(jeu->plateau, NOIR)) && - (!action_possible_joueur(jeu->plateau, BLANC))) || - plateau_rempli(jeu->plateau); + Coups *possibilites_j1 = action_possible_joueur(jeu->plateau, NOIR); + Coups *possibilites_j2 = action_possible_joueur(jeu->plateau, BLANC); + int reponse = ((possibilites_j1->taille_liste == 0) && + (possibilites_j2->taille_liste == 0)) || + plateau_rempli(jeu->plateau); + + free_coups(possibilites_j1); + free_coups(possibilites_j2); + + return reponse; } int selection_gagnant(Jeu *jeu, int *resultat) { @@ -242,3 +254,8 @@ void free_jeu(Jeu *jeu) { free(jeu); } + +void free_coups(Coups *coups) { + free_liste(coups->coups); + free(coups); +}