Update Dames game

Co-authored-by: Emma <emmbotti@gmail.com>
This commit is contained in:
Mylloon 2024-01-12 02:03:07 +01:00
parent 55a9b6cc47
commit 63ba6f06a1
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
3 changed files with 80 additions and 16 deletions

View file

@ -3,16 +3,22 @@
#include "../Joueur.hpp" #include "../Joueur.hpp"
#include "../Plateau.hpp" #include "../Plateau.hpp"
struct PlateauDames final : public Plateau { struct PlateauDames : public Plateau {
PlateauDames(Joueur &joueur1, Joueur &joueur2); PlateauDames(Joueur &joueur1, Joueur &joueur2);
virtual ~PlateauDames(); virtual ~PlateauDames();
Joueur *j1, *j2; Joueur *j1, *j2;
// Renvoie la pièce entre la pièce sélectionné et une position
Piece *piecePrise(const int destX, const int destY) const;
// Pareil que deplacementValide mais est utilisable avec des coordonnées // Pareil que deplacementValide mais est utilisable avec des coordonnées
bool deplacementValideCoor(const int x1, const int y1, const int x2, bool deplacementValideCoor(const int x1, const int y1, const int x2,
const int y2) const; const int y2) const;
// Vérifie que le déplacement est valide // Vérifie que le déplacement est valide
bool deplacementValide(const int destX, const int destY) const; bool deplacementValide(const int destX, const int destY) const;
// Vérifie que la prise est valide
bool priseValide(const int destX, const int destY) const;
}; };

View file

@ -67,6 +67,19 @@ void Dames::event(const int x, const int y) {
// Si une prise est possible, le joueur est obligé d'en faire une // Si une prise est possible, le joueur est obligé d'en faire une
if (prisePossible(*joueurCourant)) { if (prisePossible(*joueurCourant)) {
Ecran::printMessage("Vous devez forcément faire une prise."); Ecran::printMessage("Vous devez forcément faire une prise.");
if (plateau.priseValide(posCurseur.first, posCurseur.second)) {
if (p == nullptr) {
plateau.moveSelection(posCurseur.first, posCurseur.second);
// On efface la piece prise du plateau
Piece *pieceEffacee =
plateau.piecePrise(posCurseur.first, posCurseur.second);
plateau.modifierPlateau(pieceEffacee->getPos().first,
pieceEffacee->getPos().second, nullptr);
// Donne la main au joueur suivant
changerJoueurCourant();
Ecran::printMessage(msgTonTour());
}
}
break; break;
// Quand il ne peux pas faire de prise, il déplace une de ses pieces // Quand il ne peux pas faire de prise, il déplace une de ses pieces
} }
@ -75,7 +88,7 @@ void Dames::event(const int x, const int y) {
// Test si le déplacement est possible pour un pions : en diagonal en // Test si le déplacement est possible pour un pions : en diagonal en
// direction de l'autre joueur // direction de l'autre joueur
// Crash ici parce que p = nullptr donc p->getPos() provoque une segfault // Crash ici parce que p = nullptr donc p->getPos() provoque une segfault
if (p==nullptr) { if (p == nullptr) {
plateau.moveSelection(posCurseur.first, posCurseur.second); plateau.moveSelection(posCurseur.first, posCurseur.second);
// Donne la main au joueur suivant // Donne la main au joueur suivant
changerJoueurCourant(); changerJoueurCourant();
@ -126,56 +139,68 @@ bool Dames::prisePossible(Joueur &joueur) const {
if (pos.first > 1) { if (pos.first > 1) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second)); pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first-2, pos.second))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first - 2, pos.second)) == nullptr) {
return true; return true;
} }
} }
if (pos.first > 1 && pos.second > 1) { if (pos.first > 1 && pos.second > 1) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second - 1)); pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second - 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first-2, pos.second-2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first - 2, pos.second - 2)) ==
nullptr) {
return true; return true;
} }
} }
if (pos.first > 1 && pos.second < 8) { if (pos.first > 1 && pos.second < 8) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second + 1) ); pieceAPrendre = getPiece(plateau.getPiece(pos.first - 1, pos.second + 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first-2, pos.second+2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first - 2, pos.second + 2)) ==
nullptr) {
return true; return true;
} }
} }
if (pos.second > 1) { if (pos.second > 1) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first, pos.second - 1)); pieceAPrendre = getPiece(plateau.getPiece(pos.first, pos.second - 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first, pos.second-2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first, pos.second - 2)) == nullptr) {
return true; return true;
} }
} }
if (pos.second < 8) { if (pos.second < 8) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first, pos.second + 1)); pieceAPrendre = getPiece(plateau.getPiece(pos.first, pos.second + 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first, pos.second+2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first, pos.second + 2)) == nullptr) {
return true; return true;
} }
} }
if (pos.first < 8 && pos.second > 1) { if (pos.first < 8 && pos.second > 1) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second - 1)); pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second - 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first+2, pos.second-2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first + 2, pos.second - 2)) ==
nullptr) {
return true; return true;
} }
} }
if (pos.first < 8 && pos.second < 8) { if (pos.first < 8 && pos.second < 8) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second + 1 )); pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second + 1));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first+2, pos.second+2))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first + 2, pos.second + 2)) ==
nullptr) {
return true; return true;
} }
} }
if (pos.first < 8) { if (pos.first < 8) {
pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second)); pieceAPrendre = getPiece(plateau.getPiece(pos.first + 1, pos.second));
if (pieceAPrendre != nullptr && if (pieceAPrendre != nullptr &&
pieceAPrendre->getCategory() != p->getCategory() && getPiece(plateau.getPiece(pos.first+2, pos.second))==nullptr) { pieceAPrendre->getCategory() != p->getCategory() &&
getPiece(plateau.getPiece(pos.first + 2, pos.second)) == nullptr) {
return true; return true;
} }
} }

View file

@ -25,20 +25,53 @@ PlateauDames::PlateauDames(Joueur &joueur1, Joueur &joueur2)
PlateauDames::~PlateauDames() {} PlateauDames::~PlateauDames() {}
Piece *PlateauDames::piecePrise(const int x, const int y) const {
const Position posInitiale = selection->getPos();
if (x == posInitiale.first + 2 && y == posInitiale.second + 2) {
return plateau[x + 1][y + 1];
}
if (x == posInitiale.first - 2 && y == posInitiale.second - 2) {
return plateau[x - 1][y - 1];
}
if (x == posInitiale.first + 2 && y == posInitiale.second - 2) {
return plateau[x + 1][y - 1];
}
if (x == posInitiale.first - 2 && y == posInitiale.second + 2) {
return plateau[x - 1][y + 1];
}
return nullptr;
}
bool PlateauDames::deplacementValideCoor(const int x1, const int y1, bool PlateauDames::deplacementValideCoor(const int x1, const int y1,
const int x2, const int y2) const { const int x2, const int y2) const {
if((x2==x1+1 && y2==y1+1) || (x2==x1-1 && y2==y1-1) || (x2==x1+1 && y2==y1-1) || (x2==x1-1 && y2==y1+1)) if ((x2 == x1 + 1 && y2 == y1 + 1) || (x2 == x1 - 1 && y2 == y1 - 1) ||
return true; (x2 == x1 + 1 && y2 == y1 - 1) || (x2 == x1 - 1 && y2 == y1 + 1)) {
return true;
}
return false; return false;
} }
// Peut-etre utiliser cette fonction pour prisePossible ?
bool PlateauDames::deplacementValide(const int x, const int y) const { bool PlateauDames::deplacementValide(const int x, const int y) const {
if (!selection) { if (!selection) {
return false; return false;
} }
// TODO
Position posInitiale = selection->getPos(); Position posInitiale = selection->getPos();
return deplacementValideCoor(posInitiale.first, posInitiale.second, x, y); return deplacementValideCoor(posInitiale.first, posInitiale.second, x, y);
} }
bool PlateauDames::priseValide(const int x, const int y) const {
if (!selection) {
return false;
}
Position posInitiale = selection->getPos();
if ((x == posInitiale.first + 2 && y == posInitiale.second + 2) ||
(x == posInitiale.first - 2 && y == posInitiale.second - 2) ||
(x == posInitiale.first + 2 && y == posInitiale.second - 2) ||
(x == posInitiale.first - 2 && y == posInitiale.second + 2)) {
return true;
}
return false;
}