[Board] Implement EnPassant handling
This commit is contained in:
20
Board.cpp
20
Board.cpp
@@ -53,11 +53,11 @@ CastlingRights Board::castlingRights() const {
|
|||||||
void Board::setEnPassantSquare(const Square::Optional &square) {
|
void Board::setEnPassantSquare(const Square::Optional &square) {
|
||||||
if (!square.has_value())
|
if (!square.has_value())
|
||||||
return;
|
return;
|
||||||
mEPS = square->index();
|
mEPS = square;
|
||||||
}
|
}
|
||||||
|
|
||||||
Square::Optional Board::enPassantSquare() const {
|
Square::Optional Board::enPassantSquare() const {
|
||||||
return Square::fromIndex(mEPS);
|
return mEPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::makeMove(const Move &move) {
|
void Board::makeMove(const Move &move) {
|
||||||
@@ -108,10 +108,26 @@ void Board::makeMove(const Move &move) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// en passant
|
||||||
|
handlePawnDoubleAdvance(move, toBB, movedPiece);
|
||||||
|
|
||||||
|
|
||||||
// change turn
|
// change turn
|
||||||
mTurn = !mTurn;
|
mTurn = !mTurn;
|
||||||
}
|
}
|
||||||
|
void Board::handlePawnDoubleAdvance(const Move &move, BitBoard bb, const Piece &movedPiece) {
|
||||||
|
if (movedPiece.type() == PieceType::Pawn) {
|
||||||
|
auto fromR = move.from().rank();
|
||||||
|
auto toR = move.to().rank();
|
||||||
|
auto diff = abs(static_cast<int>(fromR) - static_cast<int>(toR));
|
||||||
|
if (diff == 2 && (mPieceBBs[toIndex(PieceType::Pawn)] & (bb << 1 | bb >> 1) & getRankBB(static_cast<int>(toR)))) {
|
||||||
|
mEPS = Square::fromCoordinates(move.to().file(), std::max(fromR, toR) - 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mEPS = std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
void Board::pseudoLegalMoves(MoveVec &moves) const {
|
void Board::pseudoLegalMoves(MoveVec &moves) const {
|
||||||
(void) moves;
|
(void) moves;
|
||||||
|
12
Board.hpp
12
Board.hpp
@@ -47,7 +47,7 @@ private:
|
|||||||
|
|
||||||
PieceColor mTurn = PieceColor::White;
|
PieceColor mTurn = PieceColor::White;
|
||||||
CastlingRights mCR = CastlingRights::None;
|
CastlingRights mCR = CastlingRights::None;
|
||||||
unsigned mEPS = 64;
|
std::optional<Square> mEPS;
|
||||||
|
|
||||||
enum DefinedBoards : BitBoard {
|
enum DefinedBoards : BitBoard {
|
||||||
AFile = 0x0101010101010101,
|
AFile = 0x0101010101010101,
|
||||||
@@ -80,6 +80,14 @@ private:
|
|||||||
return (1ULL << i);
|
return (1ULL << i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline BitBoard genShift(BitBoard x, const int s) {
|
||||||
|
return (s < 0) ? (x >> -s) : (s > 63) ? x : (x << s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline BitBoard getRankBB(int r) {
|
||||||
|
return (genShift(1ULL, (r + 1) * 8) - 1) & genShift(~1ULL, r * 8 - 1);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int toIndex(PieceType t) {
|
static inline int toIndex(PieceType t) {
|
||||||
return static_cast<int>(t);
|
return static_cast<int>(t);
|
||||||
}
|
}
|
||||||
@@ -118,6 +126,8 @@ private:
|
|||||||
static inline int getLSB(const BitBoard b) {
|
static inline int getLSB(const BitBoard b) {
|
||||||
return __builtin_ctzll(b);
|
return __builtin_ctzll(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handlePawnDoubleAdvance(const Move &move, BitBoard bb, const Piece &movedPiece);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &os, const Board &board);
|
std::ostream &operator<<(std::ostream &os, const Board &board);
|
||||||
|
Reference in New Issue
Block a user