* 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 */ * Renvoie 0 en cas de coup illégal */
int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur); 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 */ /* 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 */ /* Auxiliaire : Demande au joueur où placer son jeton */
void _action_joueur_humain(int *ligne, int *colonne); void _action_joueur_humain(int *ligne, int *colonne);
@ -86,7 +96,7 @@ int partie_finie(Jeu *jeu);
* joueurs */ * joueurs */
int selection_gagnant(Jeu *jeu, int *resultat); 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); void free_jeu(Jeu *jeu);
#endif #endif

View file

@ -35,12 +35,18 @@ void deroulement_partie(Jeu *jeu) {
while (!partie_finie(jeu)) { while (!partie_finie(jeu)) {
affiche_plateau(jeu->plateau); 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 // Si le joueur peut jouer
printf("Coups possibles : ");
affiche_liste(possibilites->coups->premier);
printf("\n");
action_joueur_humain(jeu, tour); action_joueur_humain(jeu, tour);
} else { } else {
printf("Pas de coup jouable.\n"); printf("Pas de coup jouable.\n");
} }
free_coups(possibilites);
tour = tour == NOIR ? BLANC : NOIR; 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 i = -1; i <= 1; ++i) {
for (int j = -1; j <= 1; ++j) { for (int j = -1; j <= 1; ++j) {
if (i != 0 || j != 0) { 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 == jeu->plateau[case_i + i][case_j + j]->couleur ==
couleur_ennemi(couleur) && couleur_ennemi(couleur)) {
_case_jouable(jeu->plateau, case_i, case_j, i, j,
couleur)) {
_jeu_joueur(jeu, case_i, case_j, i, j, couleur); _jeu_joueur(jeu, case_i, case_j, i, j, couleur);
flag = 1; flag = 1;
break;
} }
} }
} }
@ -134,19 +137,21 @@ int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur) {
return flag; return flag;
} }
int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) { Coups *action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) {
// TODO (enhancement): Instead of returning if the player can play, return a Coups *coups = malloc(sizeof(Coups));
// structure with: if the player can play, and the possible moves of the coups->coups = nouvelle_liste();
// player coups->taille_liste = 0;
for (int i = 0; i < LONGEUR; i++) { for (int i = 0; i < LONGEUR; i++) {
for (int j = 0; j < LARGEUR; j++) { for (int j = 0; j < LARGEUR; j++) {
if (case_jouable(plat, i, j, couleur)) { 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) { 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) { void action_joueur_humain(Jeu *jeu, int couleur) {
printf("Tour de %c !\n", couleur); printf("Tour des %c !\n", couleur);
int ligne, colonne; int ligne, colonne;
_action_joueur_humain(&ligne, &colonne); _action_joueur_humain(&ligne, &colonne);
@ -201,9 +206,16 @@ void action_joueur_humain(Jeu *jeu, int couleur) {
} }
int partie_finie(Jeu *jeu) { int partie_finie(Jeu *jeu) {
return ((!action_possible_joueur(jeu->plateau, NOIR)) && Coups *possibilites_j1 = action_possible_joueur(jeu->plateau, NOIR);
(!action_possible_joueur(jeu->plateau, BLANC))) || 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); plateau_rempli(jeu->plateau);
free_coups(possibilites_j1);
free_coups(possibilites_j2);
return reponse;
} }
int selection_gagnant(Jeu *jeu, int *resultat) { int selection_gagnant(Jeu *jeu, int *resultat) {
@ -242,3 +254,8 @@ void free_jeu(Jeu *jeu) {
free(jeu); free(jeu);
} }
void free_coups(Coups *coups) {
free_liste(coups->coups);
free(coups);
}