// © 2025 A.M. Rowsell // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is "Incompatible With Secondary Licenses", as // defined by the Mozilla Public License, v. 2.0. #ifndef PIECE_HPP #define PIECE_HPP #pragma once #include #include #include #include #include "Board.hpp" class Board; enum PieceType { PAWN, BISHOP, KNIGHT, ROOK, QUEEN, KING, EMPTY }; enum PieceColour { PIECE_WHITE, PIECE_BLACK, PIECE_EMPTY }; enum Rank { R1 = 0, R2 = 1, R3 = 2, R4 = 3, R5 = 4, R6 = 5, R7 = 6, R8 = 7 }; enum File { A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7 }; struct Square { Rank rank; File file; bool isValid() const { return rank >= 0 && rank < 8 && file >= 0 && file < 8; } }; struct Move { Square from; Square to; }; class Piece { friend class Board; protected: PieceColour colour; bool hasMoved = false; public: Piece(PieceColour pColour) : colour(pColour) { } virtual ~Piece(); virtual std::vector getLegalMoves(const Square &from, const Board &board) const; PieceColour getColour() const { return colour; } }; class King : public Piece { public: King(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; class Rook : public Piece { public: Rook(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; class Queen : public Piece { public: Queen(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; class Knight : public Piece { public: Knight(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; class Bishop : public Piece { public: Bishop(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; class Pawn : public Piece { public: Pawn(PieceColour colour) : Piece(colour) { } virtual std::vector getLegalMoves(const Square &from, const Board &board) const override; }; #endif // PIECE_HPP