affichage rudimentaire de safari + choix des animaux

This commit is contained in:
Mylloon 2024-01-07 01:05:08 +01:00
parent 72f301dc81
commit 6e841bc6a6
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
6 changed files with 182 additions and 26 deletions

View file

@ -10,12 +10,17 @@ struct PieceSafari : public Piece {
Lion, Lion,
}; };
const enum Categorie _category;
PieceSafari(const enum Categorie, const int x, const int y); PieceSafari(const enum Categorie, const int x, const int y);
virtual ~PieceSafari(); virtual ~PieceSafari();
// Couleur sur l'écran // Couleur sur l'écran
const sf::Color getScreenColor() const override; const sf::Color getScreenColor() const override;
// Catégorie représentée par la pièce
enum Categorie getCategory() const;
private: private:
const std::string to_string(const enum Categorie) const; const std::string to_string(const enum Categorie) const;
}; };

View file

@ -1,8 +1,13 @@
#pragma once #pragma once
#include "../Plateau.hpp" #include "../Plateau.hpp"
#include "PieceSafari.hpp"
class PlateauSafari : public Plateau { class PlateauSafari : public Plateau {
// Barrières
std::vector<PieceSafari *> barrieres;
public: public:
PlateauSafari(); PlateauSafari();
virtual ~PlateauSafari(); virtual ~PlateauSafari();

View file

@ -11,8 +11,8 @@ class Safari : private Jeu {
PlateauSafari plateau; PlateauSafari plateau;
// Joueurs // Joueurs
const Joueur &joueur2; Joueur &joueur2;
const Joueur *joueur3; Joueur *joueur3;
// Etape du jeu, pour savoir où on en est // Etape du jeu, pour savoir où on en est
enum Etape { enum Etape {
@ -26,8 +26,8 @@ class Safari : private Jeu {
// Où l'on se trouve dans le jeu, à quelle étape nous sommes // Où l'on se trouve dans le jeu, à quelle étape nous sommes
enum Etape etape; enum Etape etape;
// Barrières // Barrières posés
std::vector<PieceSafari *> barrieres; int barrieres;
// Permet de transformer une Piece en PieceSafari // Permet de transformer une Piece en PieceSafari
const PieceSafari *getPiece(const int x, const int y) const; const PieceSafari *getPiece(const int x, const int y) const;
@ -38,8 +38,11 @@ class Safari : private Jeu {
// Change de joueur courant // Change de joueur courant
void changerJoueurCourant(); void changerJoueurCourant();
// Assignie un animal au joueur courant // Message du choix des animaux
void choixAnimal(const PieceSafari::Categorie animal); const std::string msgChoixAnimal() const;
// Auxilliaire pour le choix des pièces par le joueur
void choixJoueur(const Etape prochaineEtape);
public: public:
Safari(Joueur &joueur1, Joueur &joueur2, Safari(Joueur &joueur1, Joueur &joueur2,

View file

@ -2,7 +2,7 @@
PieceSafari::PieceSafari(const enum Categorie cat, const int posX, PieceSafari::PieceSafari(const enum Categorie cat, const int posX,
const int posY) const int posY)
: Piece(to_string(cat), posX, posY) {} : Piece(to_string(cat), posX, posY), _category(cat) {}
PieceSafari::~PieceSafari() {} PieceSafari::~PieceSafari() {}
@ -26,3 +26,7 @@ const sf::Color PieceSafari::getScreenColor() const {
// TODO // TODO
return sf::Color::White; return sf::Color::White;
} }
enum PieceSafari::Categorie PieceSafari::getCategory() const {
return _category;
}

View file

@ -7,6 +7,13 @@ PlateauSafari::~PlateauSafari() {}
void PlateauSafari::initialiserPlateau() { void PlateauSafari::initialiserPlateau() {
// Au début, le plateau est vide // 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 { 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 jaune = sf::Color(255, 200, 40);
sf::Color marron = sf::Color(155, 60, 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 i = 0; i < taille; i++) {
for (int j = 0; j < taille; j++) { 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 x = i * tailleCellule;
const float y = j * tailleCellule; const float y = j * tailleCellule;
// Position de la cellule et de la pièce // Position de la cellule et de la pièce
cell.setPosition(x, y); cell.setPosition(x, y);
rhinoceros.setPosition(x + decalagePiece, y + decalagePiece);
elephant.setPosition(x + decalagePiece, y + decalagePiece);
lion.setPosition(x + decalagePiece, y + decalagePiece);
if (d) { if (d) {
out << "(" << x << ", " << y; out << "(" << x << ", " << y;
} }
@ -33,6 +58,7 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const {
// Alternation des couleurs // Alternation des couleurs
if ((i + j) % 2 == 0) { if ((i + j) % 2 == 0) {
cell.setFillColor(jaune); cell.setFillColor(jaune);
lion.setOutlineColor(sf::Color::Black);
if (d) { if (d) {
out << ", J), "; out << ", J), ";
} }
@ -47,7 +73,31 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const {
Ecran::window.draw(cell); Ecran::window.draw(cell);
// Dessine la piece // Dessine la piece
// TODO const Piece *p = plateau[i][j];
if (p != nullptr) {
if (p->isSelectionnee()) {
lion.setOutlineColor(sf::Color::Green);
}
switch (dynamic_cast<const PieceSafari *>(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) { if (d) {
out << "\n"; out << "\n";
@ -55,7 +105,9 @@ void PlateauSafari::afficherPlateau(std::ostream &out, const bool d) const {
} }
// Dessine les mur // Dessine les mur
// TODO /* for (auto it : barrieres) {
// TODO
} */
if (d) { if (d) {
out << "---\n"; out << "---\n";

View file

@ -1,21 +1,28 @@
#include "../../includes/Safari/Safari.hpp" #include "../../includes/Safari/Safari.hpp"
#include "../../includes/Ecran.hpp"
/* Contrairement aux autres jeux ici on donne des pointeurs et pas des /* 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) * 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 */ * Je sais pas trop si c'est une bonne idée, à méditer */
Safari::Safari(Joueur &j1, Joueur &j2, Joueur *j3) Safari::Safari(Joueur &j1, Joueur &j2, Joueur *j3)
: Jeu(j1), plateau(PlateauSafari()), joueur2{j2}, joueur3{j3} { : Jeu(j1), plateau(PlateauSafari()), joueur2{j2}, joueur3{j3},
for (int i = 0; i < 50; i++) { barrieres(0) {
// 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));
}
plateau.initialiserPlateau(); plateau.initialiserPlateau();
Ecran::printMessage(msgChoixAnimal());
etape = ChoixJ1;
} }
Safari::~Safari() {} 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) { std::ostream &operator<<(std::ostream &out, const Safari &data) {
out << "j1: " << data.joueur1 << "\nj2: " << data.joueur2; out << "j1: " << data.joueur1 << "\nj2: " << data.joueur2;
if (data.joueur3 != nullptr) { if (data.joueur3 != nullptr) {
@ -29,9 +36,88 @@ std::ostream &operator<<(std::ostream &out, const Safari &data) {
void Safari::play() { void Safari::play() {
plateau.afficherPlateau(std::cout); 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<const int, const int> 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<const int, const int> Safari::getPosition() const { const std::pair<const int, const int> Safari::getPosition() const {
if (posCurseur.second > plateau.getTaille() - 1) { if (posCurseur.second > plateau.getTaille() - 1) {
@ -42,15 +128,16 @@ const std::pair<const int, const int> Safari::getPosition() const {
return posCurseur; return posCurseur;
} }
void Safari::choixAnimal(const PieceSafari::Categorie animal) { void Safari::changerJoueurCourant() {
if (animal == PieceSafari::Barriere) { if (joueurCourant->getNum() == joueur1.getNum()) {
throw std::invalid_argument("Animal non valide"); joueurCourant = &joueur2;
} } else if (joueurCourant->getNum() == joueur2.getNum()) {
if (joueur3) {
if (joueurCourant->getPieces().empty()) { joueurCourant = joueur3;
for (int i = 0; i < 3; i++) { } else {
// Position invalide en attendant d'être ajouté au plateau de jeu joueurCourant = &joueur1;
joueurCourant->ajoutPiece(new PieceSafari(animal, -1, -1));
} }
} else {
joueurCourant = &joueur1;
} }
} }