* select the winner

* check if move playable
This commit is contained in:
Mylloon 2022-11-17 22:01:25 +01:00
parent 0d24785b3e
commit 2eae2e2f1e
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
3 changed files with 67 additions and 8 deletions

View file

@ -59,12 +59,17 @@ void deroulement_partie(Jeu *jeu);
/* Vérifie si un joueur peut jouer */ /* Vérifie si un joueur peut jouer */
int action_possible_joueur(Jeton *plateau[LONGEUR][LARGEUR], int couleur); int action_possible_joueur(Jeton *plateau[LONGEUR][LARGEUR], int couleur);
/* Joue le tour d'un joueur */ /* Joue le tour d'un joueur humain */
void action_joueur(Jeu *jeu, int couleur); void action_joueur_humain(Jeu *jeu, int couleur);
/* Vérifie si une partie est terminée */ /* Vérifie si une partie est terminée */
int partie_finie(Jeu *jeu); int partie_finie(Jeu *jeu);
/* Compte les points, change le résultat avec le gagnant ainsi que les points de
* chacun des joueurs (Gagnant, Perdant). Renvoie 0 si égalité entre les 2
* joueurs */
int selection_gagnant(Jeu *jeu, int *resultat);
/* Libère le jeu en mémoire */ /* Libère le jeu en mémoire */
void free_jeu(Jeu *jeu); void free_jeu(Jeu *jeu);

View file

@ -36,18 +36,28 @@ void deroulement_partie(Jeu *jeu) {
// TODO: Check if player can play // TODO: Check if player can play
if (action_possible_joueur(jeu->plateau, tour)) { if (action_possible_joueur(jeu->plateau, tour)) {
action_joueur(jeu, tour); action_joueur_humain(jeu, tour);
} else {
printf("Pas de coup jouable.\n");
} }
tour = tour == NOIR ? BLANC : NOIR; tour = tour == NOIR ? BLANC : NOIR;
} }
// TODO: Handle end game // TODO: Handle end game
int resultat[3];
if (selection_gagnant(jeu, resultat)) {
printf("Fin de partie ! Le joueur %c a gagné %d contre %d !\n",
resultat[0], resultat[1], resultat[2]);
} else {
printf("Égalité parfaite, %d contre %d !\n", jeu->j1->nb_jeton,
jeu->j2->nb_jeton);
}
} }
int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) { int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) {
for (int i = 0; i < 8; i++) { for (int i = 0; i < LONGEUR; i++) {
for (int j = 0; j < 8; j++) { for (int j = 0; j < LARGEUR; j++) {
if (case_jouable(plat, i, j, couleur)) { if (case_jouable(plat, i, j, couleur)) {
return 1; return 1;
} }
@ -56,7 +66,7 @@ int action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR], int couleur) {
return 0; return 0;
} }
void action_joueur(Jeu *jeu, int couleur) { void action_joueur_humain(Jeu *jeu, int couleur) {
// TODO // TODO
printf("Tour de %c !\n", couleur); printf("Tour de %c !\n", couleur);
} }
@ -67,6 +77,27 @@ int partie_finie(Jeu *jeu) {
plateau_rempli(jeu->plateau); plateau_rempli(jeu->plateau);
} }
int selection_gagnant(Jeu *jeu, int *resultat) {
if (jeu->j1->nb_jeton == jeu->j2->nb_jeton) {
// Si égalité
return 0;
}
if (jeu->j1->nb_jeton > jeu->j2->nb_jeton) {
// Si le joueur 1 a gagné
resultat[0] = jeu->j1->couleur;
resultat[1] = jeu->j1->nb_jeton;
resultat[2] = jeu->j2->nb_jeton;
} else {
// Si le joueur 2 a gagné
resultat[0] = jeu->j2->couleur;
resultat[1] = jeu->j2->nb_jeton;
resultat[2] = jeu->j1->nb_jeton;
}
return 1;
}
void free_jeu(Jeu *jeu) { void free_jeu(Jeu *jeu) {
free_liste(jeu->j1->liste_jeton); free_liste(jeu->j1->liste_jeton);
free(jeu->j1); free(jeu->j1);

View file

@ -63,8 +63,31 @@ void affiche_plateau(Jeton *plat[LONGEUR][LARGEUR]) {
int _case_jouable(Jeton *plat[LONGEUR][LARGEUR], int case_i, int case_j, int _case_jouable(Jeton *plat[LONGEUR][LARGEUR], int case_i, int case_j,
int case_i_direction, int case_j_direction, int couleur) { int case_i_direction, int case_j_direction, int couleur) {
// TODO if (case_i + case_i_direction < 0 ||
case_i + case_i_direction > (LONGEUR - 1) ||
case_j + case_j_direction < 0 ||
case_j + case_j_direction > (LARGEUR - 1)) {
// Après une suite de pion ennemi, si l'on arrive à l'extérieur du
// plateau ce n'est pas valide
return 0;
}
// S'il y a un pion ennemi
if (plat[case_i + case_i_direction][case_j + case_j_direction]->couleur ==
(couleur == NOIR ? BLANC : NOIR)) {
return _case_jouable(plat, case_i + case_i_direction,
case_j + case_j_direction, case_i_direction,
case_j_direction, couleur);
}
// Si c'est bon
if (plat[case_i + case_i_direction][case_j + case_j_direction]->couleur ==
couleur) {
return 1; return 1;
}
// Couleur vide
return 0;
} }
int case_jouable(Jeton *plat[LONGEUR][LARGEUR], int case_i, int case_j, int case_jouable(Jeton *plat[LONGEUR][LARGEUR], int case_i, int case_j,