affichage nom gagnant

This commit is contained in:
Mylloon 2024-01-08 10:18:01 +01:00
parent f298f9c8b8
commit 576d5968c7
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 62 additions and 45 deletions

View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "../Joueur.hpp"
#include "../Plateau.hpp" #include "../Plateau.hpp"
#include "PieceSafari.hpp" #include "PieceSafari.hpp"
@ -30,6 +31,9 @@ struct PlateauSafari : public Plateau {
// Place la barrière, renvoie si on a réussi // Place la barrière, renvoie si on a réussi
bool placementBarriere(const int x, const int y); 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: private:
// Barrières // Barrières
std::vector<PieceSafari *> barrieres; std::vector<PieceSafari *> barrieres;

View file

@ -59,9 +59,6 @@ class Safari : private Jeu {
// Auxilliaire pour le choix des pièces par le joueur // Auxilliaire pour le choix des pièces par le joueur
void choixJoueur(const Etape prochaineEtape); void choixJoueur(const Etape prochaineEtape);
// Renvoie le nombre d'animaux jouable par le joueur courant
int zoneDeplacementOk() const;
public: public:
Safari(Joueur &joueur1, Joueur &joueur2, Safari(Joueur &joueur1, Joueur &joueur2,
Joueur *joueur3 = nullptr); // constructor Joueur *joueur3 = nullptr); // constructor

View file

@ -251,3 +251,41 @@ bool PlateauSafari::placementBarriere(const int x, const int y) {
return true; 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;
}

View file

@ -229,7 +229,7 @@ void Safari::event(const int x, const int y) {
// Vérifie si le joueur pourra encore jouer // 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 // 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; --joueursEnVie;
} }
@ -238,7 +238,25 @@ void Safari::event(const int x, const int y) {
if (joueursEnVie <= 1) { if (joueursEnVie <= 1) {
etape = Fini; etape = Fini;
// TODO: Afficher le joueur gagnant (s'il y en a un) // 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 { } else {
// Le joueur a fini son tour // Le joueur a fini son tour
// Réinitialise les variables // Réinitialise les variables
@ -280,43 +298,3 @@ void Safari::changerJoueurCourant() {
joueurCourant = &joueur1; 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;
}