[Board] Refactor and implement makeMove

This commit is contained in:
2022-12-21 17:20:54 +01:00
parent 0084bbf994
commit 274c29eabd
5 changed files with 212 additions and 62 deletions

View File

@@ -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);