diff --git a/BitBoard.cpp b/BitBoard.cpp index 0feb37d..8e89589 100644 --- a/BitBoard.cpp +++ b/BitBoard.cpp @@ -31,3 +31,23 @@ BitBoard BitBoard::getRank(int r) { BitBoard BitBoard::genShift(BitBoard x, const int 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(); +} diff --git a/BitBoard.h b/BitBoard.h index e69089e..a35b4e6 100644 --- a/BitBoard.h +++ b/BitBoard.h @@ -82,8 +82,18 @@ public: constexpr void clear(unsigned i); constexpr void set(unsigned i); - BitBoard left(unsigned i) const; - BitBoard right(unsigned i) const; + BitBoard north() 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); @@ -215,11 +225,30 @@ constexpr void BitBoard::clear(const unsigned i) { inline BitBoard BitBoard::fromIndex(const unsigned 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 { - return (mBoard << i); +inline BitBoard BitBoard::northEast() const { + 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 { return __builtin_ctzll(mBoard); diff --git a/Board.cpp b/Board.cpp index 6c7e129..11e4698 100644 --- a/Board.cpp +++ b/Board.cpp @@ -133,10 +133,8 @@ void Board::handlePawnDoubleAdvance(const Move &move, BitBoard bb, const Piece & auto fromR = move.from().rank(); auto toR = move.to().rank(); if (abs(static_cast(fromR) - static_cast(toR)) == 2) { - if (mPieceBBs[toIndex(PieceType::Pawn)] - & (bb.left(1) | bb.right(1)) - & BitBoard::getRank(static_cast(toR))) { - + if (mPieceBBs[toIndex(PieceType::Pawn)] & mPieceBBs[toIndex(!mTurn)] // Get all other color pawns + & (bb.west() | bb.east())) { // is pawn left or right? mEPS = Square::fromCoordinates(move.to().file(), std::max(fromR, toR) - 1); return; } @@ -151,8 +149,7 @@ void Board::pseudoLegalMoves(MoveVec &moves) const { (void) moves; } -void Board::pseudoLegalMovesFrom(const Square &from, - Board::MoveVec &moves) const { +void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) const { (void) from; (void) moves; }