Files
cpl_cpp-project/BitBoard.cpp

85 lines
2.3 KiB
C++

#include "BitBoard.hpp"
BitBoard::BitBoard(uint64_t v) {
mBoard = v;
}
std::ostream &operator<<(std::ostream &os, const BitBoard &board) {
// For debugging only, performance isn't important
for (int i = 7; i >= 0; i--) {
int rank = i * 8;
for (int j = 0; j < 8; j++) {
// Get the piece for this index. Assume it exists.
// Print piece, otherwise '.';
if (board.mBoard & (1ULL << (rank + j))) {
os << 1;
} else {
os << '.';
}
os << ' ';
}
os << '\n';
}
return os;
}
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();
}
BitBoard BitBoard::kingAttacks(const BitBoard bb) {
BitBoard result = bb.east() | bb.west() | bb;
result |= (result.north() | result.south());
result ^= bb;
return result;
}
BitBoard BitBoard::bishopAttacks(BitBoard bishops, BitBoard empty) {
BitBoard result = 0;
BitBoard diag1 = bishops;
BitBoard diag2 = bishops;
empty ^= bishops;
for (int i = 0; i < 7; i++) {
result |= (diag1 | diag2);
diag1 = (diag1.northWest() | diag1.southEast()) & empty;
diag2 = (diag2.northEast() | diag2.southWest()) & empty;
}
return (result | diag1.northWest() | diag1.southEast() | diag2.northEast() | diag2.southWest()) & ~bishops;
}
BitBoard BitBoard::pawnNorthAttacks(BitBoard pawns, BitBoard targets) {
return (pawns.northEast() | pawns.northWest()) & targets;
}
BitBoard BitBoard::pawnNorthMoves(BitBoard pawns, BitBoard empty) {
pawns = pawns.north() & empty;
return (pawns | (pawns.north() & Rank4)) & empty;
}
BitBoard BitBoard::pawnSouthAttacks(BitBoard pawns, BitBoard targets) {
return (pawns.southEast() | pawns.southWest()) & targets;
}
BitBoard BitBoard::pawnSouthMoves(BitBoard pawns, BitBoard empty) {
pawns = pawns.south() & empty;
return (pawns | (pawns.south() & Rank5)) & empty;
}