diff --git a/includes/jeu.h b/includes/jeu.h index 743e369..f983d60 100644 --- a/includes/jeu.h +++ b/includes/jeu.h @@ -56,13 +56,22 @@ Jeu *nouvelle_partie(void); /* Lance et joue une partie */ void deroulement_partie(Jeu *jeu); -/* Gère le coup d'un joueur en faisant les changements nécessaire au jeu */ +/* Renvoie la couleur de l'ennemi */ +int couleur_ennemi(int couleur); + +/* Auxiliaire : S'occupe de faire les changements de jetons récursivement + * lorsqu'un joueur joue */ +void _jeu_joueur(Jeu *jeu, int case_i, int case_j, int case_i_direction, + int case_j_direction, int couleur); + +/* Gère le coup d'un joueur en faisant les changements nécessaire au jeu. + * Renvoie 0 en cas de coup illégal */ int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur); /* Vérifie si un joueur peut jouer */ int 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); /* Joue le tour d'un joueur humain */ diff --git a/src/jeu.c b/src/jeu.c index 029f893..2bb63bd 100644 --- a/src/jeu.c +++ b/src/jeu.c @@ -55,11 +55,83 @@ void deroulement_partie(Jeu *jeu) { } } -int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur) { - // TODO - (void)jeu, (void)case_i, (void)case_j, (void)couleur; +void _jeu_joueur(Jeu *jeu, int case_i, int case_j, int case_i_direction, + int case_j_direction, int couleur) { + if (case_i + case_i_direction < 0 || case_i + case_i_direction > 7 || + case_j + case_j_direction < 0 || case_j + case_j_direction > 7) { + // Après une suite de pion ennemi, si l'on arrive à l'extérieur du + // plateau ce n'est pas valide + return; + } + if (jeu->plateau[case_i + case_i_direction][case_j + case_j_direction] + ->couleur == -couleur) { + jeu->plateau[case_i + case_i_direction][case_j + case_j_direction] + ->couleur = couleur; - return 0; + Joueur *joueur, *adversaire; + if (couleur == NOIR) { + joueur = jeu->j1; + adversaire = jeu->j2; + } else { + joueur = jeu->j2; + adversaire = jeu->j1; + } + + // Retire le jeton de l'adversaire + retire_jeton_joueur( + adversaire, + jeu->plateau[case_i + case_i_direction][case_j + case_j_direction]); + + // Ajoute le jeton du joueur + ajoute_jeton_joueur( + joueur, + jeu->plateau[case_i + case_i_direction][case_j + case_j_direction]); + + _jeu_joueur(jeu, case_i + case_i_direction, case_j + case_j_direction, + case_i_direction, case_j_direction, couleur); + } +} + +int couleur_ennemi(int couleur) { return couleur == NOIR ? BLANC : NOIR; } + +int jeu_joueur(Jeu *jeu, int case_i, int case_j, int couleur) { + int flag = 0; + + // Coup illégal + if (jeu->plateau[case_i][case_j]->couleur == NOIR || + jeu->plateau[case_i][case_j]->couleur == BLANC) { + return flag; + } + + // Regarde dans toutes les directions + 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 && + jeu->plateau[case_i + i][case_j + j]->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); + flag = 1; + + break; + } + } + } + } + + // Case actuelle + jeu->plateau[case_i][case_j]->couleur = couleur; + if (flag) { + if (couleur == NOIR) { + ajoute_jeton_joueur(jeu->j1, jeu->plateau[case_i][case_j]); + } else { + ajoute_jeton_joueur(jeu->j2, jeu->plateau[case_i][case_j]); + } + } + + return flag; } int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) { @@ -121,6 +193,9 @@ void action_joueur_humain(Jeu *jeu, int couleur) { printf("mais ce n'est pas possible, réessayez !\n"); _action_joueur_humain(&ligne, &colonne); + } else { + printf("et c'est un bon coup ;)\n"); + ok = 1; } } }