* add possibilites in a dedicated struct
* add somes fixes?
This commit is contained in:
parent
571dee4435
commit
c7141b1b8e
2 changed files with 46 additions and 19 deletions
|
@ -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
|
||||
|
|
51
src/jeu.c
51
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);
|
||||
}
|
||||
|
|
Reference in a new issue