From 6e841bc6a6f7d4c0e4cce330101af18d4e742b28 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sun, 7 Jan 2024 01:05:08 +0100 Subject: [PATCH] affichage rudimentaire de safari + choix des animaux --- includes/Safari/PieceSafari.hpp | 5 ++ includes/Safari/PlateauSafari.hpp | 5 ++ includes/Safari/Safari.hpp | 15 ++-- src/Safari/PieceSafari.cpp | 6 +- src/Safari/PlateauSafari.cpp | 56 +++++++++++++- src/Safari/Safari.cpp | 121 +++++++++++++++++++++++++----- 6 files changed, 182 insertions(+), 26 deletions(-) diff --git a/includes/Safari/PieceSafari.hpp b/includes/Safari/PieceSafari.hpp index 522fbec..b14d6e4 100644 --- a/includes/Safari/PieceSafari.hpp +++ b/includes/Safari/PieceSafari.hpp @@ -10,12 +10,17 @@ struct PieceSafari : public Piece { Lion, }; + const enum Categorie _category; + PieceSafari(const enum Categorie, const int x, const int y); virtual ~PieceSafari(); // Couleur sur l'écran const sf::Color getScreenColor() const override; + // Catégorie représentée par la pièce + enum Categorie getCategory() const; + private: const std::string to_string(const enum Categorie) const; }; diff --git a/includes/Safari/PlateauSafari.hpp b/includes/Safari/PlateauSafari.hpp index 5b22ff2..e53f7d7 100644 --- a/includes/Safari/PlateauSafari.hpp +++ b/includes/Safari/PlateauSafari.hpp @@ -1,8 +1,13 @@ #pragma once #include "../Plateau.hpp" +#include "PieceSafari.hpp" class PlateauSafari : public Plateau { + + // Barrières + std::vector barrieres; + public: PlateauSafari(); virtual ~PlateauSafari(); diff --git a/includes/Safari/Safari.hpp b/includes/Safari/Safari.hpp index 9eae96c..f37353e 100644 --- a/includes/Safari/Safari.hpp +++ b/includes/Safari/Safari.hpp @@ -11,8 +11,8 @@ class Safari : private Jeu { PlateauSafari plateau; // Joueurs - const Joueur &joueur2; - const Joueur *joueur3; + Joueur &joueur2; + Joueur *joueur3; // Etape du jeu, pour savoir où on en est enum Etape { @@ -26,8 +26,8 @@ class Safari : private Jeu { // Où l'on se trouve dans le jeu, à quelle étape nous sommes enum Etape etape; - // Barrières - std::vector barrieres; + // Barrières posés + int barrieres; // Permet de transformer une Piece en PieceSafari const PieceSafari *getPiece(const int x, const int y) const; @@ -38,8 +38,11 @@ class Safari : private Jeu { // Change de joueur courant void changerJoueurCourant(); - // Assignie un animal au joueur courant - void choixAnimal(const PieceSafari::Categorie animal); + // Message du choix des animaux + const std::string msgChoixAnimal() const; + + // Auxilliaire pour le choix des pièces par le joueur + void choixJoueur(const Etape prochaineEtape); public: Safari(Joueur &joueur1, Joueur &joueur2, diff --git a/src/Safari/PieceSafari.cpp b/src/Safari/PieceSafari.cpp index addc1a0..b0bb0e7 100644 --- a/src/Safari/PieceSafari.cpp +++ b/src/Safari/PieceSafari.cpp @@ -2,7 +2,7 @@ PieceSafari::PieceSafari(const enum Categorie cat, const int posX, const int posY) - : Piece(to_string(cat), posX, posY) {} + : Piece(to_string(cat), posX, posY), _category(cat) {} PieceSafari::~PieceSafari() {} @@ -26,3 +26,7 @@ const sf::Color PieceSafari::getScreenColor() const { // TODO return sf::Color::White; } + +enum PieceSafari::Categorie PieceSafari::getCategory() const { + return _category; +} diff --git a/src/Safari/PlateauSafari.cpp b/src/Safari/PlateauSafari.cpp index 3a92272..ac7d39a 100644 --- a/src/Safari/PlateauSafari.cpp +++ b/src/Safari/PlateauSafari.cpp @@ -7,6 +7,13 @@ PlateauSafari::~PlateauSafari() {} void PlateauSafari::initialiserPlateau() { // Au début, le plateau est vide + + // Les joueurs vont choisir leur animal, on place autant d'animal différent + // que de joueur différent sur le plateau, au centre parce que les joueurs + // vont cliquer dessus pour faire leur choix + plateau[2][3] = new PieceSafari(PieceSafari::Elephant, 2, 3); + plateau[3][3] = new PieceSafari(PieceSafari::Lion, 3, 3); + plateau[4][3] = new PieceSafari(PieceSafari::Rhinoceros, 4, 3); } void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { @@ -19,13 +26,31 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { sf::Color jaune = sf::Color(255, 200, 40); sf::Color marron = sf::Color(155, 60, 40); + // Pièces + sf::CircleShape rhinoceros(tailleCellule / 3, 3); + // rhinoceros.setOutlineThickness(2.); + sf::CircleShape elephant(tailleCellule / 3, 6); + // elephant.setOutlineThickness(2.); + sf::CircleShape lion(tailleCellule / 3); + lion.setOutlineThickness(2.); + + const float decalagePiece = tailleCellule / 6; + for (int i = 0; i < taille; i++) { for (int j = 0; j < taille; j++) { + // Remet la couleur de l'outline par défaut + rhinoceros.setOutlineColor(sf::Color::Transparent); + elephant.setOutlineColor(sf::Color::Transparent); + lion.setOutlineColor(sf::Color::Transparent); + const float x = i * tailleCellule; const float y = j * tailleCellule; // Position de la cellule et de la pièce cell.setPosition(x, y); + rhinoceros.setPosition(x + decalagePiece, y + decalagePiece); + elephant.setPosition(x + decalagePiece, y + decalagePiece); + lion.setPosition(x + decalagePiece, y + decalagePiece); if (d) { out << "(" << x << ", " << y; } @@ -33,6 +58,7 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { // Alternation des couleurs if ((i + j) % 2 == 0) { cell.setFillColor(jaune); + lion.setOutlineColor(sf::Color::Black); if (d) { out << ", J), "; } @@ -47,7 +73,31 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { Ecran::window.draw(cell); // Dessine la piece - // TODO + const Piece *p = plateau[i][j]; + if (p != nullptr) { + if (p->isSelectionnee()) { + lion.setOutlineColor(sf::Color::Green); + } + switch (dynamic_cast(p)->getCategory()) { + case PieceSafari::Elephant: { + elephant.setFillColor(sf::Color::White); + Ecran::window.draw(elephant); + break; + } + case PieceSafari::Rhinoceros: { + rhinoceros.setFillColor(sf::Color::Red); + Ecran::window.draw(rhinoceros); + break; + } + case PieceSafari::Lion: { + lion.setFillColor(sf::Color::Yellow); + Ecran::window.draw(lion); + break; + } + default: + break; + } + } } if (d) { out << "\n"; @@ -55,7 +105,9 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const { } // Dessine les mur - // TODO + /* for (auto it : barrieres) { + // TODO + } */ if (d) { out << "---\n"; diff --git a/src/Safari/Safari.cpp b/src/Safari/Safari.cpp index cc817cc..3fad96e 100644 --- a/src/Safari/Safari.cpp +++ b/src/Safari/Safari.cpp @@ -1,21 +1,28 @@ #include "../../includes/Safari/Safari.hpp" +#include "../../includes/Ecran.hpp" /* Contrairement aux autres jeux ici on donne des pointeurs et pas des * références vu que j3 peut ne pas exister (default to nullptr) * Je sais pas trop si c'est une bonne idée, à méditer */ Safari::Safari(Joueur &j1, Joueur &j2, Joueur *j3) - : Jeu(j1), plateau(PlateauSafari()), joueur2{j2}, joueur3{j3} { - for (int i = 0; i < 50; i++) { - // TODO: Les pièces ont des positions invalides, il faut penser à les - // définir quand on les rajoute au plateau - barrieres.push_back(new PieceSafari(PieceSafari::Barriere, -1, -1)); - } - + : Jeu(j1), plateau(PlateauSafari()), joueur2{j2}, joueur3{j3}, + barrieres(0) { plateau.initialiserPlateau(); + Ecran::printMessage(msgChoixAnimal()); + etape = ChoixJ1; } 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) { @@ -29,9 +36,88 @@ std::ostream &operator<<(std::ostream &out, const Safari &data) { void Safari::play() { plateau.afficherPlateau(std::cout); + + // Demander à J1 de choisir un animal + if (etape <= Etape::ChoixJ1) { + return; + } + + // Demander à J2 de choisir un animal + if (etape <= Etape::ChoixJ2) { + return; + } + + // Demander à J3 de choisir un animal + if (etape <= Etape::ChoixJ3) { + if (joueur3 == nullptr) { + // Pas de joueur 3 + // On retire le dernier choix d'animal + const Piece *p = plateau.getPieces().at(0); + std::pair pos = p->getPos(); + plateau.modifierPlateau(pos.first, pos.second, nullptr); + delete p; + + // On passe à l'étape suivante + etape = Etape::EnJeu; + } + return; + } } -void Safari::event(const int, const int) {} +void Safari::choixJoueur(const Etape next) { + const PieceSafari *p = getPiece(posCurseur.first, posCurseur.second); + // Vérifie qu'une pièce à été cliquée + if (p == nullptr) { + return; + } + + // Donne la pièce au joueur, il est maintenant lié à cette animal + joueurCourant->ajoutPiece(p); + + // Retire la pièce du plateau + plateau.modifierPlateau(posCurseur.first, posCurseur.second, nullptr); + + // On passe à l'étape suivante + etape = next; + changerJoueurCourant(); + Ecran::printMessage(msgChoixAnimal()); +} + +void Safari::event(const int x, const int y) { + // Update position + posCurseur = plateau.trouveCoordonnees(x, y); + posCurseur = getPosition(); + if (posCurseur.first == -1) { + // Mauvaise position + return; + } + + // Texte de debug + std::cout << "Clic souris @ (" << x << ", " << y << ") aka (" + << posCurseur.first << ", " << posCurseur.second << ")\n"; + + switch (etape) { + // Clic du J1 + case ChoixJ1: { + choixJoueur(ChoixJ2); + break; + } + case ChoixJ2: { + choixJoueur(ChoixJ3); + break; + } + case ChoixJ3: { + choixJoueur(EnJeu); + break; + } + case EnJeu: { + break; + } + case Fini: { + break; + } + } +} const std::pair Safari::getPosition() const { if (posCurseur.second > plateau.getTaille() - 1) { @@ -42,15 +128,16 @@ const std::pair Safari::getPosition() const { return posCurseur; } -void Safari::choixAnimal(const PieceSafari::Categorie animal) { - if (animal == PieceSafari::Barriere) { - throw std::invalid_argument("Animal non valide"); - } - - if (joueurCourant->getPieces().empty()) { - for (int i = 0; i < 3; i++) { - // Position invalide en attendant d'être ajouté au plateau de jeu - joueurCourant->ajoutPiece(new PieceSafari(animal, -1, -1)); +void Safari::changerJoueurCourant() { + if (joueurCourant->getNum() == joueur1.getNum()) { + joueurCourant = &joueur2; + } else if (joueurCourant->getNum() == joueur2.getNum()) { + if (joueur3) { + joueurCourant = joueur3; + } else { + joueurCourant = &joueur1; } + } else { + joueurCourant = &joueur1; } }