110 lines
3.4 KiB
C
110 lines
3.4 KiB
C
|
#include "../includes/joueur.h"
|
||
|
|
||
|
Joueur *nouveau_joueur(int pion) {
|
||
|
Joueur *joueur = malloc(sizeof(Joueur));
|
||
|
joueur->nom = pion == NOIR ? "noir" : "blanc";
|
||
|
joueur->couleur = pion;
|
||
|
joueur->liste_jeton = nouvelle_liste();
|
||
|
joueur->nb_jeton = 0;
|
||
|
|
||
|
return joueur;
|
||
|
}
|
||
|
|
||
|
void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton) {
|
||
|
// Change le jeton
|
||
|
jeton->couleur = joueur->couleur;
|
||
|
|
||
|
// Ajoute le jeton à la liste des jetons du joueur
|
||
|
Element *element = nouvel_element(jeton);
|
||
|
ajoute_liste(joueur->liste_jeton, element);
|
||
|
joueur->nb_jeton++;
|
||
|
}
|
||
|
|
||
|
void retire_jeton_joueur(Joueur *joueur, Jeton *jeton) {
|
||
|
Element *tmp = joueur->liste_jeton->premier;
|
||
|
if (tmp->jeton == jeton) {
|
||
|
joueur->liste_jeton->premier = tmp->suivant;
|
||
|
free(tmp);
|
||
|
} else {
|
||
|
supprime_liste(tmp, jeton);
|
||
|
}
|
||
|
joueur->nb_jeton--;
|
||
|
jeton->couleur = VIDE;
|
||
|
}
|
||
|
|
||
|
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_jouable(jeu->plateau, case_i, case_j, i, j,
|
||
|
couleur) &&
|
||
|
jeu->plateau[case_i + i][case_j + j]->couleur ==
|
||
|
couleur_ennemi(couleur)) {
|
||
|
_jeu_joueur(jeu, case_i, case_j, i, j, couleur);
|
||
|
flag = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Case actuelle
|
||
|
if (flag) {
|
||
|
jeu->plateau[case_i][case_j]->couleur = couleur;
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
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 >= LONGEUR ||
|
||
|
case_j + case_j_direction < 0 || case_j + case_j_direction >= LARGEUR) {
|
||
|
// 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_ennemi(couleur)) {
|
||
|
jeu->plateau[case_i + case_i_direction][case_j + case_j_direction]
|
||
|
->couleur = couleur;
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|