[BitBoard] Add fills and direction methods

This commit is contained in:
2022-12-22 11:18:23 +01:00
parent fbc1a5589a
commit 4157c9200e
3 changed files with 58 additions and 12 deletions

View File

@@ -31,3 +31,23 @@ BitBoard BitBoard::getRank(int r) {
BitBoard BitBoard::genShift(BitBoard x, const int s) { BitBoard BitBoard::genShift(BitBoard x, const int s) {
return (s < 0) ? (x >> -s) : (s > 63) ? x : (x << s); return (s < 0) ? (x >> -s) : (s > 63) ? x : (x << s);
} }
BitBoard BitBoard::northFill() const {
BitBoard result(mBoard);
result |= (result << 8);
result |= (result << 16);
result |= (result << 32);
return (result << 8);
}
BitBoard BitBoard::southFill() const {
BitBoard result(mBoard);
result |= (result >> 8);
result |= (result >> 16);
result |= (result >> 32);
return result;
}
BitBoard BitBoard::fileFill() const {
return northFill() | southFill();
}

View File

@@ -82,8 +82,18 @@ public:
constexpr void clear(unsigned i); constexpr void clear(unsigned i);
constexpr void set(unsigned i); constexpr void set(unsigned i);
BitBoard left(unsigned i) const; BitBoard north() const;
BitBoard right(unsigned i) const; BitBoard northEast() const;
BitBoard northWest() const;
BitBoard east() const;
BitBoard south() const;
BitBoard southEast() const;
BitBoard southWest() const;
BitBoard west() const;
BitBoard northFill() const;
BitBoard southFill() const;
BitBoard fileFill() const;
static BitBoard fromIndex(unsigned i); static BitBoard fromIndex(unsigned i);
@@ -215,11 +225,30 @@ constexpr void BitBoard::clear(const unsigned i) {
inline BitBoard BitBoard::fromIndex(const unsigned i) { inline BitBoard BitBoard::fromIndex(const unsigned i) {
return 1ULL << i; return 1ULL << i;
} }
inline BitBoard BitBoard::left(const unsigned int i) const {
return (mBoard >> i); inline BitBoard BitBoard::north() const {
return (mBoard << 8);
} }
inline BitBoard BitBoard::right(const unsigned int i) const { inline BitBoard BitBoard::northEast() const {
return (mBoard << i); return (mBoard << 9) & ~AFile;
}
inline BitBoard BitBoard::northWest() const {
return (mBoard << 7) & ~HFile;
}
inline BitBoard BitBoard::west() const {
return (mBoard >> 1) & ~HFile;
}
inline BitBoard BitBoard::east() const {
return (mBoard << 1) & ~AFile;
}
inline BitBoard BitBoard::south() const {
return (mBoard >> 8);
}
inline BitBoard BitBoard::southEast() const {
return (mBoard >> 7) & ~AFile;
}
inline BitBoard BitBoard::southWest() const {
return (mBoard >> 9) & ~HFile;
} }
inline int BitBoard::lsb() const { inline int BitBoard::lsb() const {
return __builtin_ctzll(mBoard); return __builtin_ctzll(mBoard);

View File

@@ -133,10 +133,8 @@ void Board::handlePawnDoubleAdvance(const Move &move, BitBoard bb, const Piece &
auto fromR = move.from().rank(); auto fromR = move.from().rank();
auto toR = move.to().rank(); auto toR = move.to().rank();
if (abs(static_cast<int>(fromR) - static_cast<int>(toR)) == 2) { if (abs(static_cast<int>(fromR) - static_cast<int>(toR)) == 2) {
if (mPieceBBs[toIndex(PieceType::Pawn)] if (mPieceBBs[toIndex(PieceType::Pawn)] & mPieceBBs[toIndex(!mTurn)] // Get all other color pawns
& (bb.left(1) | bb.right(1)) & (bb.west() | bb.east())) { // is pawn left or right?
& BitBoard::getRank(static_cast<int>(toR))) {
mEPS = Square::fromCoordinates(move.to().file(), std::max(fromR, toR) - 1); mEPS = Square::fromCoordinates(move.to().file(), std::max(fromR, toR) - 1);
return; return;
} }
@@ -151,8 +149,7 @@ void Board::pseudoLegalMoves(MoveVec &moves) const {
(void) moves; (void) moves;
} }
void Board::pseudoLegalMovesFrom(const Square &from, void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) const {
Board::MoveVec &moves) const {
(void) from; (void) from;
(void) moves; (void) moves;
} }