diff --git a/inc/Board.hpp b/inc/Board.hpp index c0dbaac..5e8535a 100644 --- a/inc/Board.hpp +++ b/inc/Board.hpp @@ -14,9 +14,7 @@ #include #include -#include "Piece.hpp" - -// why do I have to forward declare all these?! +// suggested to forward declare here, and put include in the .cpp class Piece; enum Players { PL_WHITE, PL_BLACK }; @@ -25,14 +23,61 @@ struct Square; class Board { private: friend class Piece; // this doesn't seem to do anything - Players playerTurn; - public: - // this should be protected, but even when Piece is declared as a friend, - // accessing it in Piece.cpp threw an error std::vector>> boardGrid; + Players playerTurn; + // let's get super object-oriented, baby + // these help the getters and setters access the boardGrid + // and also make them shorter and less duplicative + inline std::unique_ptr& at(int r, int f) { + return boardGrid[r][f]; + } + inline const std::unique_ptr& at(int r, int f) const { + return boardGrid[r][f]; + } + + inline std::unique_ptr& at(Rank rank, File file) { + return boardGrid[static_cast(rank)][static_cast(file)]; + } + inline const std::unique_ptr& at(Rank rank, File file) const { + return boardGrid[static_cast(rank)][static_cast(file)]; + } + + inline std::unique_ptr& at(const Square& sq) { + return boardGrid[static_cast(sq.rank)][static_cast(sq.file)]; + } + inline const std::unique_ptr& at(const Square& sq) const { + return boardGrid[static_cast(sq.rank)][static_cast(sq.file)]; + } + public: Board(); virtual ~Board(); + // These are to allow Piece to access Board in a controlled way + // --- GETTERS --- + Piece* getPieceAt(int r, int f) { return at(r, f).get(); } + const Piece* getPieceAt(int r, int f) const { return at(r, f).get(); } + + Piece* getPieceAt(Rank rank, File file) { return at(rank, file).get(); } + const Piece* getPieceAt(Rank rank, File file) const { return at(rank, file).get(); } + + Piece* getPieceAt(const Square& sq) { return at(sq).get(); } + const Piece* getPieceAt(const Square& sq) const { return at(sq).get(); } + + // --- SETTERS --- + void setPieceAt(int r, int f, std::unique_ptr piece) { at(r, f) = std::move(piece); } + void clearSquare(int r, int f) { at(r, f).reset(); } + + void setPieceAt(Rank rank, File file, std::unique_ptr piece) { at(rank, file) = std::move(piece); } + void clearSquare(Rank rank, File file) { at(rank, file).reset(); } + + void setPieceAt(const Square& sq, std::unique_ptr piece) { at(sq) = std::move(piece); } + void clearSquare(const Square& sq) { at(sq).reset(); } + + // --- CHECKERS --- + bool isSquareEmpty(int r, int f) const { return at(r, f) == nullptr; } + bool isSquareEmpty(Rank rank, File file) const { return at(rank, file) == nullptr; } + bool isSquareEmpty(const Square& sq) const { return at(sq) == nullptr; } + void setupInitialPosition(); void clearBoard();