diff --git a/includes/Joueur.hpp b/includes/Joueur.hpp index f604573..e6d671e 100644 --- a/includes/Joueur.hpp +++ b/includes/Joueur.hpp @@ -13,17 +13,17 @@ class Joueur { // Pour le butin, tout simplement les pièces que le joueur gagne. // Pour les dames, peut être uniquement les pieces sur le plateau. // Pour le safari, les animaux du joueur - std::vector pieces; + std::vector pieces; public: Joueur(const int numeroJoueur); // constructor virtual ~Joueur(); // destructor // Ajoute une pièce à la liste de pièces du joueur - void ajoutPiece(const Piece *piece); + void ajoutPiece(Piece *piece); // Getter pour les pièces du joueur - const std::vector getPieces() const; + const std::vector getPieces() const; // Getter pour le nom du joueur int getNum() const; diff --git a/includes/Safari/PieceSafari.hpp b/includes/Safari/PieceSafari.hpp index b14d6e4..52078f5 100644 --- a/includes/Safari/PieceSafari.hpp +++ b/includes/Safari/PieceSafari.hpp @@ -21,6 +21,9 @@ struct PieceSafari : public Piece { // Catégorie représentée par la pièce enum Categorie getCategory() const; + // Nom de la pièce + std::string getName() const; + private: const std::string to_string(const enum Categorie) const; }; diff --git a/includes/Safari/Safari.hpp b/includes/Safari/Safari.hpp index f37353e..cf093ef 100644 --- a/includes/Safari/Safari.hpp +++ b/includes/Safari/Safari.hpp @@ -19,6 +19,7 @@ class Safari : private Jeu { ChoixJ1 = 0, ChoixJ2, ChoixJ3, + Placement, EnJeu, Fini, }; @@ -30,7 +31,7 @@ class Safari : private Jeu { int barrieres; // Permet de transformer une Piece en PieceSafari - const PieceSafari *getPiece(const int x, const int y) const; + PieceSafari *getPiece(const int x, const int y) const; // Position curseur const std::pair getPosition() const override; @@ -41,6 +42,12 @@ class Safari : private Jeu { // Message du choix des animaux const std::string msgChoixAnimal() const; + // Message pour le placement des animaux + const std::string msgPlacement() const; + + // Message à chaque tour de joueur + const std::string msgTonTour() const; + // Auxilliaire pour le choix des pièces par le joueur void choixJoueur(const Etape prochaineEtape); diff --git a/src/Dames/Dames.cpp b/src/Dames/Dames.cpp index 08d7aad..d183122 100644 --- a/src/Dames/Dames.cpp +++ b/src/Dames/Dames.cpp @@ -47,7 +47,7 @@ const std::pair Dames::getPosition() const { // les pièces aient des attributs pour leur position (comme proposé dans Piece) // ? bool Dames::prisePossible(Joueur &joueur) const { - const std::vector &pieces = joueur.getPieces(); + const std::vector &pieces = joueur.getPieces(); int x = 1; int y = 1; for (uint i = 0; i < pieces.size(); i++) { diff --git a/src/Joueur.cpp b/src/Joueur.cpp index abd2399..b844289 100644 --- a/src/Joueur.cpp +++ b/src/Joueur.cpp @@ -22,11 +22,11 @@ std::ostream &operator<<(std::ostream &out, const Joueur &data) { return out; } -void Joueur::ajoutPiece(const Piece *piece) { +void Joueur::ajoutPiece(Piece *piece) { pieces.push_back(piece); } -const std::vector Joueur::getPieces() const { +const std::vector Joueur::getPieces() const { return pieces; } diff --git a/src/Piece.cpp b/src/Piece.cpp index 85b6e12..e4a8f19 100644 --- a/src/Piece.cpp +++ b/src/Piece.cpp @@ -6,18 +6,11 @@ Piece::Piece(const std::string cat, const int posX, const int posY) Piece::~Piece() {} std::ostream &operator<<(std::ostream &out, const Piece &data) { - out << '"' << data.categorie << '"'; + out << '"' << data.categorie << '"' << ":" << data.x << "," << data.y; return out; } void Piece::moveTo(const int destX, const int destY) { - if (destX < 0 || destY < 0) { - return; - } - - // Note: On vérifie pas si la pièce sort du plateau par rapport à la taille - // du plateau (on a pas l'info ici?) - x = destX; y = destY; } diff --git a/src/Safari/PieceSafari.cpp b/src/Safari/PieceSafari.cpp index b0bb0e7..4019ea9 100644 --- a/src/Safari/PieceSafari.cpp +++ b/src/Safari/PieceSafari.cpp @@ -30,3 +30,7 @@ const sf::Color PieceSafari::getScreenColor() const { enum PieceSafari::Categorie PieceSafari::getCategory() const { return _category; } + +std::string PieceSafari::getName() const { + return categorie; +} diff --git a/src/Safari/Safari.cpp b/src/Safari/Safari.cpp index 3fad96e..5b2ac49 100644 --- a/src/Safari/Safari.cpp +++ b/src/Safari/Safari.cpp @@ -14,15 +14,6 @@ Safari::Safari(Joueur &j1, Joueur &j2, Joueur *j3) Safari::~Safari() {} -const PieceSafari *Safari::getPiece(const int x, const int y) const { - return dynamic_cast(plateau.getPiece(x, y)); -} - -const std::string Safari::msgChoixAnimal() const { - return "Joueur " + std::to_string(joueurCourant->getNum()) + - ", choississez un animal."; -} - std::ostream &operator<<(std::ostream &out, const Safari &data) { out << "j1: " << data.joueur1 << "\nj2: " << data.joueur2; if (data.joueur3 != nullptr) { @@ -34,6 +25,28 @@ std::ostream &operator<<(std::ostream &out, const Safari &data) { return out; } +PieceSafari *Safari::getPiece(const int x, const int y) const { + return dynamic_cast(plateau.getPiece(x, y)); +} + +const std::string Safari::msgChoixAnimal() const { + return "Joueur " + std::to_string(joueurCourant->getNum()) + + ", choississez un animal."; +} + +const std::string Safari::msgPlacement() const { + return "Joueur " + std::to_string(joueurCourant->getNum()) + + ", placez votre " + + dynamic_cast(joueurCourant->getPieces().at(0)) + ->getName() + + "."; +} + +const std::string Safari::msgTonTour() const { + return "Joueur " + std::to_string(joueurCourant->getNum()) + + ", c'est votre tour de placer une barrière."; +} + void Safari::play() { plateau.afficherPlateau(std::cout); @@ -58,14 +71,20 @@ void Safari::play() { delete p; // On passe à l'étape suivante - etape = Etape::EnJeu; + etape = Etape::Placement; + Ecran::printMessage(msgPlacement()); } return; } + + // Placement des animaux + if (etape <= Etape::Placement) { + return; + } } void Safari::choixJoueur(const Etape next) { - const PieceSafari *p = getPiece(posCurseur.first, posCurseur.second); + PieceSafari *p = getPiece(posCurseur.first, posCurseur.second); // Vérifie qu'une pièce à été cliquée if (p == nullptr) { return; @@ -74,8 +93,14 @@ void Safari::choixJoueur(const Etape next) { // Donne la pièce au joueur, il est maintenant lié à cette animal joueurCourant->ajoutPiece(p); + // Ajoute les 2 autre animaux que le joueur va devoir placer + for (int i = 0; i < 2; ++i) { + joueurCourant->ajoutPiece(new PieceSafari(p->getCategory(), -1, -1)); + } + // Retire la pièce du plateau plateau.modifierPlateau(posCurseur.first, posCurseur.second, nullptr); + p->moveTo(-1, -1); // On passe à l'étape suivante etape = next; @@ -97,17 +122,47 @@ void Safari::event(const int x, const int y) { << posCurseur.first << ", " << posCurseur.second << ")\n"; switch (etape) { - // Clic du J1 + // Choix animal J1 case ChoixJ1: { choixJoueur(ChoixJ2); break; } case ChoixJ2: { + // Choix animal J2 choixJoueur(ChoixJ3); break; } case ChoixJ3: { - choixJoueur(EnJeu); + // Choix animal J3 + choixJoueur(Placement); + Ecran::printMessage(msgPlacement()); + break; + } + case Placement: { + const Piece *p = getPiece(posCurseur.first, posCurseur.second); + // Vérifie que la case choisie est vide + if (p == nullptr) { + // Placement des animaux des joueurs, tour à tour + for (Piece *it : joueurCourant->getPieces()) { + if (it->getPos().first == -1) { + plateau.modifierPlateau(posCurseur.first, posCurseur.second, it); + break; + } + } + + // On laisse la main + changerJoueurCourant(); + + // Détection tout les joueurs ont placés leurs animaux + int total = plateau.getPieces().size(); + if ((joueur3 && total == 9) || (!joueur3 && total == 6)) { + etape = Etape::EnJeu; + Ecran::printMessage(msgTonTour()); + } else { + Ecran::printMessage(msgPlacement()); + } + } + break; } case EnJeu: {