diff --git a/includes/Safari/PlateauSafari.hpp b/includes/Safari/PlateauSafari.hpp index 06d82b9..1ba54ab 100644 --- a/includes/Safari/PlateauSafari.hpp +++ b/includes/Safari/PlateauSafari.hpp @@ -1,5 +1,6 @@ #pragma once +#include "../Joueur.hpp" #include "../Plateau.hpp" #include "PieceSafari.hpp" @@ -30,6 +31,9 @@ struct PlateauSafari : public Plateau { // Place la barrière, renvoie si on a réussi bool placementBarriere(const int x, const int y); + // Renvoie le nombre d'animaux jouable pour un joueur donnné + int zoneDeplacementOk(const Joueur *joueur) const; + private: // Barrières std::vector barrieres; diff --git a/includes/Safari/Safari.hpp b/includes/Safari/Safari.hpp index 81817c8..17f5f64 100644 --- a/includes/Safari/Safari.hpp +++ b/includes/Safari/Safari.hpp @@ -59,9 +59,6 @@ class Safari : private Jeu { // Auxilliaire pour le choix des pièces par le joueur void choixJoueur(const Etape prochaineEtape); - // Renvoie le nombre d'animaux jouable par le joueur courant - int zoneDeplacementOk() const; - public: Safari(Joueur &joueur1, Joueur &joueur2, Joueur *joueur3 = nullptr); // constructor diff --git a/src/Safari/PlateauSafari.cpp b/src/Safari/PlateauSafari.cpp index 742fc9f..c13d7bf 100644 --- a/src/Safari/PlateauSafari.cpp +++ b/src/Safari/PlateauSafari.cpp @@ -251,3 +251,41 @@ bool PlateauSafari::placementBarriere(const int x, const int y) { return true; } + +int PlateauSafari::zoneDeplacementOk(const Joueur *joueur) const { + // Compte le nombre d'animaux qui ont encore des zones valides + // Zone valide = animal possède une zone de déplacement de mini 8 cases + + // Nombre d'animaux dans une zone libre valide + int nbAnimaux = 0; + + for (const Piece *animal : joueur->getPieces()) { + Position position = animal->getPos(); + + // Nombre de cases sur lesquels l'animal peut se rendre + int casesDisponibles = 0; + + bool cherchesCasesDispo = true; + for (int i = 0; i < taille && cherchesCasesDispo; ++i) { + for (int j = 0; j < taille && cherchesCasesDispo; ++j) { + // Regarde les cases vide uniquement + if (getPiece(i, j) != nullptr) { + continue; + } + + // Case dispo si on peut se déplacer dessus + if (deplacementValideCoor(position.first, position.second, i, j)) { + ++casesDisponibles; + } + + // Si 8 cases sont dispo on peut arrêter la recherche pour cette animal + if (casesDisponibles >= 8) { + ++nbAnimaux; + cherchesCasesDispo = false; + } + } + } + } + + return nbAnimaux; +} diff --git a/src/Safari/Safari.cpp b/src/Safari/Safari.cpp index 9d45bd5..912bd90 100644 --- a/src/Safari/Safari.cpp +++ b/src/Safari/Safari.cpp @@ -229,7 +229,7 @@ void Safari::event(const int x, const int y) { // Vérifie si le joueur pourra encore jouer // Càd au moins 1 animal possède une zone de déplacement d'au moins 8 cases - if (zoneDeplacementOk() == 0) { + if (plateau.zoneDeplacementOk(joueurCourant) == 0) { --joueursEnVie; } @@ -238,7 +238,25 @@ void Safari::event(const int x, const int y) { if (joueursEnVie <= 1) { etape = Fini; // TODO: Afficher le joueur gagnant (s'il y en a un) - Ecran::printMessage("Partie terminée !"); + std::string gagnant; + if (joueursEnVie == 0) { + gagnant = "Aucun gagnant."; + } else { + if (plateau.zoneDeplacementOk(&joueur1) > 0) { + gagnant = "Joueur 1 (" + + getPiece(joueur1.getPieces().at(0))->getName() + + ") à gagner"; + } else if (plateau.zoneDeplacementOk(&joueur2) > 0) { + gagnant = "Joueur 2 (" + + getPiece(joueur2.getPieces().at(0))->getName() + + ") à gagner"; + } else { + gagnant = "Joueur 3 (" + + getPiece(joueur3->getPieces().at(0))->getName() + + ") à gagner"; + } + } + Ecran::printMessage("Partie terminée ! " + gagnant); } else { // Le joueur a fini son tour // Réinitialise les variables @@ -280,43 +298,3 @@ void Safari::changerJoueurCourant() { joueurCourant = &joueur1; } } - -int Safari::zoneDeplacementOk() const { - // Compte le nombre d'animaux qui ont encore des zones valides - // Zone valide = animal possède une zone de déplacement de mini 8 cases - - // Nombre d'animaux dans une zone libre valide - int nbAnimaux = 0; - - for (const Piece *animal : joueurCourant->getPieces()) { - Position position = animal->getPos(); - - // Nombre de cases sur lesquels l'animal peut se rendre - int casesDisponibles = 0; - - bool cherchesCasesDispo = true; - const int taille = plateau.getTaille(); - for (int i = 0; i < taille && cherchesCasesDispo; ++i) { - for (int j = 0; j < taille && cherchesCasesDispo; ++j) { - // Regarde les cases vide uniquement - if (plateau.getPiece(i, j) != nullptr) { - continue; - } - - // Case dispo si on peut se déplacer dessus - if (plateau.deplacementValideCoor(position.first, position.second, i, - j)) { - ++casesDisponibles; - } - - // Si 8 cases sont dispo on peut arrêter la recherche pour cette animal - if (casesDisponibles >= 8) { - ++nbAnimaux; - cherchesCasesDispo = false; - } - } - } - } - - return nbAnimaux; -}