#pragma once #include "../pieces/piece.hpp" #include "../utils/coords.hpp" #include "../utils/move.hpp" #include struct Board { private: int8_t get_king_of(int8_t) const; bool _no_legal_moves_for(Colour) const; bool _is_check_for(Colour) const; bool nlm = false, check = false; public: int8_t squares[64] = {Piece::None}; bool white_to_play = true; int8_t w_castle_rights = CastleSide::NeitherSide; int8_t b_castle_rights = CastleSide::NeitherSide; int8_t en_passant_target = -1; int n_half_moves = 0; int n_full_moves = 0; static Board setup_fen_position(std::string fen); Board skip_turn() const; Board make_move(Move, bool = true) const; std::string to_fen() const; bool no_legal_moves() const; bool is_check() const; bool insufficient_material_for(Colour) const; bool insufficient_material() const { return insufficient_material_for(White) && insufficient_material_for(Black); }; std::vector all_legal_moves() const; std::vector all_capturing_moves() const; std::vector opponent_pawn_attack_map() const; bool is_checkmate() const; bool is_stalemate() const; bool is_terminal() const; inline Piece piece_at(int8_t idx) const { return (Piece) (squares[idx] & 0b00111); } inline Piece piece_at(Coords xy) const { return piece_at(xy.to_index()); } inline Colour colour_at(int8_t idx) const { return (Colour) (squares[idx] & 0b11000); } inline Colour colour_at(Coords xy) const { return colour_at(xy.to_index()); } }; inline bool operator<(const Board& m1, const Board& m2) { return m1.to_fen() < m2.to_fen( ); // TODO: make this the comparison between the hash of the board }