[Board] Refactor and implement makeMove
This commit is contained in:
74
Board.hpp
74
Board.hpp
@@ -10,7 +10,11 @@
|
||||
#include <iosfwd>
|
||||
#include <vector>
|
||||
|
||||
#define BB_NUM 12 // 6 pieces, 2 colors
|
||||
#define BB_NUM 8 // 6 pieces, 2 colors
|
||||
|
||||
enum class BoardIndex {
|
||||
|
||||
};
|
||||
|
||||
class Board {
|
||||
public:
|
||||
@@ -39,21 +43,81 @@ public:
|
||||
private:
|
||||
|
||||
BitBoard mPieceBBs[BB_NUM] = {};
|
||||
BitBoard mOccupiedBB = 0;
|
||||
|
||||
PieceColor mTurn = PieceColor::White;
|
||||
CastlingRights mCr;
|
||||
CastlingRights mCR = CastlingRights::None;
|
||||
unsigned mEPS = 64;
|
||||
|
||||
static inline void clearIndex(BitBoard &b, unsigned i) {
|
||||
enum DefinedBoards : BitBoard {
|
||||
AFile = 0x0101010101010101,
|
||||
BFile = AFile << 1,
|
||||
CFile = AFile << 2,
|
||||
DFile = AFile << 3,
|
||||
EFile = AFile << 4,
|
||||
FFile = AFile << 5,
|
||||
GFile = AFile << 6,
|
||||
HFile = AFile << 7,
|
||||
WhiteCastlingRank = (1ULL << A2) - 1,
|
||||
BlackCastlingRank = (~1ULL << H7),
|
||||
CastlingRanks = WhiteCastlingRank | BlackCastlingRank,
|
||||
CastlingSquares = (WhiteCastlingRank | BlackCastlingRank) & (CFile | GFile),
|
||||
};
|
||||
|
||||
void handleCastlingRights(const Piece &piece, const BitBoard &bb);
|
||||
// Check if the move is castling without checking the rights or validity.
|
||||
static bool isMoveCastling(const BitBoard &from, const BitBoard &to, const Piece &piece);
|
||||
|
||||
static inline void clearIndex(BitBoard &b, const unsigned i) {
|
||||
b &= ~(1ULL << i);
|
||||
}
|
||||
|
||||
static inline void setIndex(BitBoard &b, unsigned i) {
|
||||
static inline void setIndex(BitBoard &b, const unsigned i) {
|
||||
b |= 1ULL << i;
|
||||
}
|
||||
|
||||
static inline BitBoard indexToBitBoard(unsigned i) {
|
||||
static inline BitBoard indexToBitBoard(const unsigned i) {
|
||||
return (1ULL << i);
|
||||
}
|
||||
|
||||
static inline int toIndex(PieceType t) {
|
||||
return static_cast<int>(t);
|
||||
}
|
||||
static inline int toIndex(PieceColor c) {
|
||||
return static_cast<int>(c);
|
||||
}
|
||||
|
||||
inline PieceColor pieceColor(const BitBoard &mask) const {
|
||||
auto color = PieceColor::White;
|
||||
if (!(mPieceBBs[static_cast<unsigned>(color)] & mask)) {
|
||||
color = !color;
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
inline PieceType pieceType(const BitBoard &mask) const {
|
||||
for (int i = 2; i < BB_NUM; i++) {
|
||||
if (mPieceBBs[i] & mask) {
|
||||
return static_cast<PieceType>(i);
|
||||
}
|
||||
}
|
||||
|
||||
// Should not happen
|
||||
return static_cast<PieceType>(0);
|
||||
}
|
||||
|
||||
inline void applyMask(const BitBoard &mask) {
|
||||
for (auto &item : mPieceBBs) {
|
||||
item ^= mask;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the number of trailing 0-bits in b.
|
||||
// WARN: Check for 0!
|
||||
static inline int getLSB(const BitBoard b) {
|
||||
return __builtin_ctzll(b);
|
||||
}
|
||||
};
|
||||
|
||||
std::ostream &operator<<(std::ostream &os, const Board &board);
|
||||
|
Reference in New Issue
Block a user