diff --git a/include/BitBoard.h b/include/BitBoard.h index c2625df..c7a265e 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -36,12 +36,13 @@ class BitBoard static const uint32_t whiteKingSpots = 0x00041041; static const uint32_t blackKingSpots = 0x82000820; + // Used for determing board from move + static const uint32_t topCorner = 0xC3C; + /* Class member variables */ uint32_t m_blackPieces = 0x41C71C3; uint32_t m_whitePieces = 0xE3820C38; uint32_t m_kings = 0; - - bool m_isBlacksTurn = true; // static constexpr uint32_t rowMask[8]; /* Class member functions */ @@ -76,7 +77,7 @@ class BitBoard void addNormalMoves(std::vector &moves); void generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves); BitBoard boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo); - std::vector generateImmediateJumps(uint32_t piece); + std::vector generateImmediateJumps(BitBoard &board, uint32_t piece); void addNewMove(uint32_t start, uint32_t end, std::vector &moves); std::string pieceToString(int piece); diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 06f72ce..199e3cb 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -81,7 +81,7 @@ void BitBoard::addNormalMoves(std::vector &moves) void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves) { if (move.isEmpty()) move.addMove(getIndex(piece)); // Add start position - std::vector immediateJumps = generateImmediateJumps(piece); + std::vector immediateJumps = generateImmediateJumps(board, piece); if (immediateJumps.size() == 0) { if (move.length() > 1) moves.push_back(move); // If no more jumps add move to list of moves } else { @@ -96,59 +96,67 @@ void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std:: BitBoard BitBoard::boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) { // Constructor needs black, white, and kings locations so just derive those and instantiate new board object - uint32_t white, black, kings; + uint32_t white = board.m_whitePieces; + uint32_t black = board.m_blackPieces; + uint32_t kings = board.m_kings; // First figure out if a piece has been take int pieceLoc = getIndex(piece); int moveLoc = getIndex(moveTo); + if (piece & topCorner) pieceLoc += 32; + if (moveTo & topCorner) moveLoc += 32; int diff = std::abs((double)pieceLoc - moveLoc); - int avg = (int)((pieceLoc + moveLoc) / 2); - if (m_isBlacksTurn) { - if (diff == 2 || diff == 14) white = m_whitePieces & ~(1< BitBoard::generateImmediateJumps(uint32_t piece) +std::vector BitBoard::generateImmediateJumps(BitBoard &board, uint32_t piece) { std::vector moves; - uint32_t notOcc = ~(m_whitePieces|m_blackPieces); + uint32_t notOcc = ~(board.m_whitePieces|board.m_blackPieces); uint32_t temp; - bool isKing = piece & m_kings; + bool isKing = piece & board.m_kings; if (m_isBlacksTurn) { - temp = (rotl32(piece, 7) & upLeft) & m_whitePieces; + temp = (rotl32(piece, 7) & upLeft) & board.m_whitePieces; if ((rotl32(temp, 7) & upLeft) & notOcc) moves.push_back(rotl32(temp, 7)); - temp = (rotl32(piece, 1) & upRight) & m_whitePieces; + temp = (rotl32(piece, 1) & upRight) & board.m_whitePieces; if ((rotl32(temp, 1) & upRight) & notOcc) moves.push_back(rotl32(temp, 1)); if (isKing) { - temp = (rotr32(piece, 7) & downRight) & m_whitePieces; + temp = (rotr32(piece, 7) & downRight) & board.m_whitePieces; if ((rotr32(temp, 7) & downRight) & notOcc) moves.push_back(rotr32(temp, 7)); - temp = (rotr32(piece, 1) & downLeft) & m_whitePieces; + temp = (rotr32(piece, 1) & downLeft) & board.m_whitePieces; if ((rotr32(temp, 1) & downLeft) & notOcc) moves.push_back(rotr32(temp, 1)); } } else { - temp = (rotr32(piece, 7) & downRight) & m_blackPieces; + temp = (rotr32(piece, 7) & downRight) & board.m_blackPieces; if ((rotr32(temp, 7) & downRight) & notOcc) moves.push_back(rotr32(temp, 7)); - temp = (rotr32(piece, 1) & downLeft) & m_blackPieces; + temp = (rotr32(piece, 1) & downLeft) & board.m_blackPieces; if ((rotr32(temp, 1) & downLeft) & notOcc) moves.push_back(rotr32(temp, 1)); if (isKing) { - temp = (rotl32(piece, 7) & upLeft) & m_blackPieces; + temp = (rotl32(piece, 7) & upLeft) & board.m_blackPieces; if ((rotl32(temp, 7) & upLeft) & notOcc) moves.push_back(rotl32(temp, 7)); - temp = (rotl32(piece, 1) & upRight) & m_blackPieces; + temp = (rotl32(piece, 1) & upRight) & board.m_blackPieces; if ((rotl32(temp, 1) & upRight) & notOcc) moves.push_back(rotl32(temp, 1)); } @@ -202,15 +210,17 @@ std::vector const BitBoard::actions() BitBoard const BitBoard::result(Move move) { BitBoard currBoard = *this; - int start; + int start{-1}; for (int x : move.getMoves()) { - if (!start) { + if (start == -1) { start = x; } else { currBoard = boardMove(currBoard, 1<