* 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 */
|
* 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
|
||||||
|
|
49
src/jeu.c
49
src/jeu.c
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Reference in a new issue