placement animaux

This commit is contained in:
Mylloon 2024-01-07 02:32:26 +01:00
parent 00f25cc2a3
commit c4189fb751
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
8 changed files with 90 additions and 28 deletions

View file

@ -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<const Piece *> pieces;
std::vector<Piece *> 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<const Piece *> getPieces() const;
const std::vector<Piece *> getPieces() const;
// Getter pour le nom du joueur
int getNum() const;

View file

@ -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;
};

View file

@ -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<const int, const int> 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);

View file

@ -47,7 +47,7 @@ const std::pair<const int, const int> 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<const Piece *> &pieces = joueur.getPieces();
const std::vector<Piece *> &pieces = joueur.getPieces();
int x = 1;
int y = 1;
for (uint i = 0; i < pieces.size(); i++) {

View file

@ -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<const Piece *> Joueur::getPieces() const {
const std::vector<Piece *> Joueur::getPieces() const {
return pieces;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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<const PieceSafari *>(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<PieceSafari *>(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<PieceSafari *>(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: {