This repository has been archived on 2024-01-18. You can view files and clone it, but cannot push or open issues or pull requests.
DamesEtCo/src/Plateau.cpp

182 lines
4.4 KiB
C++
Raw Normal View History

#include "../includes/Plateau.hpp"
2023-12-01 16:36:50 +01:00
#include "../includes/Ecran.hpp"
2023-11-26 17:53:37 +01:00
2024-01-08 22:54:18 +01:00
Plateau::Plateau(const int t, const sf::Color b, const sf::Color n)
: blanc(b), noir(n), plateau(new Piece **[t]), taille(t) {
2023-11-24 20:34:22 +01:00
// Création du plateau vide
2023-11-21 18:07:13 +01:00
for (int i = 0; i < t; i++) {
plateau[i] = new Piece *[t];
for (int j = 0; j < t; j++) {
plateau[i][j] = nullptr;
}
}
selection = nullptr;
}
2023-11-24 20:34:22 +01:00
Plateau::~Plateau() {
for (int i = 0; i < taille; i++) {
delete[] plateau[i];
}
delete[] plateau;
}
std::ostream &operator<<(std::ostream &out, const Plateau &data) {
data.afficherPlateau(out, false);
return out;
}
void Plateau::afficherPlateau(std::ostream &out, const bool d) const {
const float tailleCellule = static_cast<float>(Ecran::largeur()) / taille;
2023-12-01 16:36:50 +01:00
2023-12-28 22:05:00 +01:00
const float decalagePiece = tailleCellule / 6;
2023-12-01 20:21:54 +01:00
// Cellule
sf::RectangleShape cell(sf::Vector2f(tailleCellule, tailleCellule));
2023-12-28 22:05:00 +01:00
// Pièce
sf::CircleShape piece(tailleCellule / 3);
piece.setOutlineThickness(2.);
2023-12-01 16:36:50 +01:00
for (int i = 0; i < taille; i++) {
for (int j = 0; j < taille; j++) {
2023-12-01 20:22:56 +01:00
const float x = i * tailleCellule;
const float y = j * tailleCellule;
2023-12-01 16:36:50 +01:00
2023-12-28 22:05:00 +01:00
// Position de la cellule et de la pièce
2023-12-01 16:36:50 +01:00
cell.setPosition(x, y);
2023-12-28 22:05:00 +01:00
piece.setPosition(x + decalagePiece, y + decalagePiece);
2023-12-01 16:36:50 +01:00
if (d) {
out << "(" << x << ", " << y;
2023-12-01 16:36:50 +01:00
}
// Alternation des couleurs
if ((i + j) % 2 == 0) {
2024-01-08 22:54:18 +01:00
cell.setFillColor(blanc);
2023-12-28 22:05:00 +01:00
piece.setOutlineColor(sf::Color::Black);
2023-12-01 16:36:50 +01:00
if (d) {
out << ", B), ";
2023-12-01 16:36:50 +01:00
}
} else {
2024-01-08 22:54:18 +01:00
cell.setFillColor(noir);
2023-12-28 22:05:00 +01:00
piece.setOutlineColor(sf::Color::White);
2023-12-01 16:36:50 +01:00
if (d) {
out << ", N), ";
2023-12-01 16:36:50 +01:00
}
}
// Dessine la cellule
Ecran::window.draw(cell);
2023-12-28 22:05:00 +01:00
// Dessine la pièce
2023-12-31 04:59:45 +01:00
const Piece *p = plateau[i][j];
2023-12-28 22:05:00 +01:00
if (p != nullptr) {
if (p->isSelectionnee()) {
piece.setOutlineColor(sf::Color::Green);
}
2023-12-28 22:05:00 +01:00
piece.setFillColor(p->getScreenColor());
Ecran::window.draw(piece);
}
2023-12-01 16:36:50 +01:00
}
if (d) {
out << "\n";
2023-12-01 16:36:50 +01:00
}
}
if (d) {
out << "---\n";
2023-12-01 16:36:50 +01:00
}
}
2023-11-24 20:14:05 +01:00
void Plateau::modifierPlateau(const int x, const int y, Piece *piece) const {
2023-11-24 20:14:05 +01:00
if (x >= 0 && x < taille && y >= 0 && y < taille) {
if (plateau[x][y]) {
plateau[x][y]->moveTo(-1, -1);
}
2023-11-24 20:14:05 +01:00
plateau[x][y] = piece;
if (piece) {
piece->moveTo(x, y);
}
2023-11-24 20:14:05 +01:00
} else {
throw std::invalid_argument("Coordonnées invalides");
}
}
Piece *Plateau::getPiece(const int x, const int y) const {
if (x >= 0 && x < taille && y >= 0 && y < taille) {
return plateau[x][y];
} else {
throw std::invalid_argument("Coordonnées invalides");
}
}
2024-01-07 12:44:33 +01:00
const Position Plateau::trouveCoordonnees(const int x, const int y) const {
2024-01-06 19:41:44 +01:00
const float tailleCelluleX = static_cast<float>(Ecran::largeur()) / taille;
const float tailleCelluleY = static_cast<float>(Ecran::hauteur()) / taille;
2024-01-11 19:37:39 +01:00
return {x / tailleCelluleX, y / tailleCelluleY};
}
int Plateau::getTaille() const {
return taille;
}
void Plateau::modifierSelection(const int x, const int y) {
2023-12-29 01:39:08 +01:00
Piece *p = getPiece(x, y);
if (p == nullptr) {
// Si rien est selectionné on ne fait rien
return;
}
if (selection) {
// Déselectionne l'ancienne sélection
selection->changeSelection();
}
2023-12-29 01:39:08 +01:00
if (p != selection) {
// Si la sélection à changer alors changer l'état de la nouvelle pièce
p->changeSelection();
selection = p;
} else {
// Si c'était la même alors on ne sélectionne plus rien
selection = nullptr;
}
}
2024-01-07 12:44:33 +01:00
const Position Plateau::moveSelection(const int x, const int y) {
if (selection == nullptr) {
// Ne fais rien si on a rien a bouger
2024-01-07 12:56:41 +01:00
return emptyPosition();
}
2023-12-29 02:19:06 +01:00
// Récupère les coordonnées
2024-01-11 19:37:39 +01:00
const Position ancienneCoordonnees = {selection->x, selection->y};
2023-12-29 02:19:06 +01:00
// Retire la pièce de là où elle est pour le plateau
2023-12-29 02:19:06 +01:00
plateau[ancienneCoordonnees.first][ancienneCoordonnees.second] = nullptr;
// Déplace la pièce sur le plateau
modifierPlateau(x, y, selection);
// Met à jour les coordonnées de la pièce
selection->moveTo(x, y);
// Déselectionne la pièce
modifierSelection(x, y);
2023-12-29 02:19:06 +01:00
return ancienneCoordonnees;
}
std::vector<const Piece *> Plateau::getPieces() const {
std::vector<const Piece *> pieces;
for (int i = 0; i < taille; i++) {
for (int j = 0; j < taille; j++) {
if (plateau[i][j]) {
pieces.push_back(plateau[i][j]);
}
}
}
return pieces;
}