diff --git a/includes/Butin/PieceButin.hpp b/includes/Butin/PieceButin.hpp index ce2c12e..078cab7 100644 --- a/includes/Butin/PieceButin.hpp +++ b/includes/Butin/PieceButin.hpp @@ -5,6 +5,7 @@ struct PieceButin : public Piece { friend Butin; + friend PlateauButin; enum Categorie { Jaune = 1, diff --git a/includes/Butin/PlateauButin.hpp b/includes/Butin/PlateauButin.hpp index 352068f..9e0d97c 100644 --- a/includes/Butin/PlateauButin.hpp +++ b/includes/Butin/PlateauButin.hpp @@ -13,4 +13,7 @@ public: // Renvoie la liste des pièces entre la pièce sélectionné et une position std::vector cheminPieces(const int destX, const int destY) const; + + // Vrai si la pièce sélectionnée est jaune + bool selectionJaune() const; }; diff --git a/src/Butin/Butin.cpp b/src/Butin/Butin.cpp index 6fec466..6059948 100644 --- a/src/Butin/Butin.cpp +++ b/src/Butin/Butin.cpp @@ -109,31 +109,49 @@ void Butin::event(const int x, const int y) { break; } case EnJeu: { - if (!true) { - // TODO: Si plus aucun coup n'est possible - etape = Fini; - Ecran::printMessage("Bravo !"); + Piece *p = getPiece(posCurseur.first, posCurseur.second); + // Vérifie que la pièce sélectionnée = Jaune et que la case choisie = vide + if (plateau.selectionJaune() && p == nullptr) { + // Récupère la liste des pièces sur le chemin + std::vector chemin = + plateau.cheminPieces(posCurseur.first, posCurseur.second); + + // Si le chemin est valide == Si des pièces sont sur le chemin + if (!chemin.empty()) { + // Déplace la pièce vers l'arrivé + plateau.moveSelection(posCurseur.first, posCurseur.second); + + // Mange les pièces sur le chemin + for (auto it : chemin) { + // Récupère la pièce + std::pair pos = it->getPos(); + Piece *gain = plateau.getPiece(pos.first, pos.second); + + // Retire la pièce + plateau.modifierPlateau(pos.first, pos.second, nullptr); + + // Ajoute le point au joueur + joueurCourant.ajoutPiece(gain); + } + + // Vérification partie terminé + // TODO: Si plus aucun coup n'est possible + if (!true /* plateau.coupsPossible() */) { + etape = Fini; + Ecran::printMessage("Partie terminé ! Joueur " + + std::to_string(joueurCourant.getNum()) + + " a gagné !"); + } else { + // On donne la main à l'adversaire + changerJoueurCourant(); + Ecran::printMessage(msgTonTour()); + } + } } - // TODO - Piece *p = getPiece(posCurseur.first, posCurseur.second); - plateau.modifierSelection(posCurseur.first, posCurseur.second); - if (p == nullptr) { - // TODO - Si le coup est faisable (définir dans PlateauButin ?) - if (true) { - std::pair from = - plateau.moveSelection(posCurseur.first, posCurseur.second); - - // Coordonnées de départ : (from.first , from.second) - // Coordonnées d'arrivée : (posCurseur.first, posCurseur.second) - // TODO: Récupérer la/les pièce/s entre ces 2 coordonnées (définir dans - // PlateauButin ?) - // et ajouter les points aux joueurs - - // On donne la main à l'adversaire - changerJoueurCourant(); - Ecran::printMessage(msgTonTour()); - } + // Sélectionne la pièce + else { + plateau.modifierSelection(posCurseur.first, posCurseur.second); } break; diff --git a/src/Butin/PlateauButin.cpp b/src/Butin/PlateauButin.cpp index 728aa81..e9125ff 100644 --- a/src/Butin/PlateauButin.cpp +++ b/src/Butin/PlateauButin.cpp @@ -91,3 +91,11 @@ std::vector PlateauButin::cheminPieces(const int destX, return chemin; } + +bool PlateauButin::selectionJaune() const { + if (selection) { + return dynamic_cast(selection)->points == PieceButin::Jaune; + } + + return false; +}