placement animaux
This commit is contained in:
parent
00f25cc2a3
commit
c4189fb751
8 changed files with 90 additions and 28 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
Reference in a new issue