* add possibilites in a dedicated struct

* add somes fixes?
This commit is contained in:
Mylloon 2022-11-18 15:15:18 +01:00
parent 571dee4435
commit c7141b1b8e
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 46 additions and 19 deletions

View file

@ -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

View file

@ -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);
}