From 7298345473f4b8e965afc89ad6693918e5e78db1 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Fri, 14 Apr 2017 07:57:48 -0400 Subject: [PATCH 01/10] Working function to generate immediate jumps --- include/BitBoard.h | 10 ++++-- include/Move.h | 6 ++-- src/BitBoard.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++- src/Move.cpp | 12 +++++-- 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/include/BitBoard.h b/include/BitBoard.h index 2f55290..87e2bff 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -67,9 +67,15 @@ class BitBoard int h8() const; int h9() const; int h10() const; + int const getIndex(uint32_t piece); + + void addBlackJumps(std::vector &moves); + std::vector generateImmediateJumps(uint32_t piece); + void addNewMove(uint32_t start, uint32_t end, std::vector &moves); + +public: + BitBoard(uint32_t black, uint32_t white, uint32_t kings); - - public: std::string const player(); std::vector const actions(); BitBoard const result(Move move); diff --git a/include/Move.h b/include/Move.h index 648688d..cb8ff26 100644 --- a/include/Move.h +++ b/include/Move.h @@ -2,6 +2,7 @@ #define MOVE_H #include +#include class Move { @@ -10,8 +11,9 @@ class Move public: - Move() : moves() {}; - void printMessage(); + Move(); + Move(int start); + void addMove(int move); }; #endif diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 423eb0f..c2b7708 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -1,11 +1,15 @@ #include #include #include +#include +#include +#include "Move.h" #include "BitBoard.h" /* Private Functions */ - +// These are basic 32 bit rotation functions +// Details here: http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c uint32_t const BitBoard::rotl32 (uint32_t n, unsigned int c) const { const unsigned int mask = (CHAR_BIT*sizeof(n)-1); @@ -22,9 +26,87 @@ uint32_t const BitBoard::rotr32 (uint32_t n, unsigned int c) const return (n>>c) | (n<<( (-c)&mask )); } +// Given a piece represented by a binary value return it's index +int const BitBoard::getIndex(uint32_t piece) +{ + return (int)std::log2(piece); +} + +void BitBoard::addBlackJumps(std::vector &moves) +{ + uint32_t notOcc = ~(m_whitePieces|m_blackPieces); + for (int i = 0; i < 32; ++i) { + // grab the specific piece + uint32_t piece = m_blackPieces & 1< BitBoard::generateImmediateJumps(uint32_t piece) +{ + std::vector moves; + uint32_t notOcc = ~(m_whitePieces|m_blackPieces); + uint32_t temp; + bool isKing = piece & m_kings; + if (m_isBlacksTurn) { + temp = (rotl32(piece, 7) & upLeft) & m_whitePieces; + if ((rotl32(temp, 7) & upLeft) & notOcc) + addNewMove(piece, rotl32(piece, 14), moves); + temp = (rotl32(piece, 1) & upRight) & m_whitePieces; + if ((rotl32(temp, 1) & upRight) & notOcc) + addNewMove(piece, rotl32(piece, 2), moves); + if (isKing) { + temp = (rotr32(piece, 7) & downRight) & m_whitePieces; + if ((rotr32(temp, 7) & downRight) & notOcc) + addNewMove(piece, rotr32(piece, 14), moves); + temp = (rotr32(piece, 1) & downLeft) & m_whitePieces; + if ((rotr32(temp, 1) & downLeft) & notOcc) + addNewMove(piece, rotr32(piece, 2), moves); + } + } else { + temp = (rotr32(piece, 7) & downRight) & m_blackPieces; + if ((rotr32(temp, 7) & downRight) & notOcc) + addNewMove(piece, rotr32(piece, 14), moves); + temp = (rotr32(piece, 1) & downLeft) & m_blackPieces; + if ((rotr32(temp, 1) & downLeft) & notOcc) + addNewMove(piece, rotr32(piece, 2), moves); + if (isKing) { + temp = (rotl32(piece, 7) & upLeft) & m_blackPieces; + if ((rotl32(temp, 7) & upLeft) & notOcc) + addNewMove(piece, rotl32(piece, 14), moves); + temp = (rotl32(piece, 1) & upRight) & m_blackPieces; + if ((rotl32(temp, 1) & upRight) & notOcc) + addNewMove(piece, rotl32(piece, 2), moves); + } + } + return moves; +} + +void BitBoard::addNewMove(uint32_t start, uint32_t end, std::vector &moves) +{ + Move newMove(getIndex(start)); + newMove.addMove(getIndex(end)); + moves.push_back(newMove); +} + /* Public functions */ +BitBoard::BitBoard(uint32_t black, uint32_t white, uint32_t kings) : + m_blackPieces(black), m_whitePieces(white), m_kings(kings) +{ + m_isBlacksTurn = true; +} + std::string const BitBoard::player() { return m_isBlacksTurn ? "black" : "white"; } + +std::vector const BitBoard::actions() +{ + std::vector moves; + + return moves; +} diff --git a/src/Move.cpp b/src/Move.cpp index a91d1ba..cd24105 100644 --- a/src/Move.cpp +++ b/src/Move.cpp @@ -1,7 +1,15 @@ #include #include "Move.h" -void Move::printMessage() +Move::Move() : moves() {}; + +Move::Move(int start) { - std::cout << "Here is an example message" << std::endl; + moves = {start}; } + +void Move::addMove(int move) +{ + moves.push_back(move); +} + From 7f33fb6e93d0c7b0d7058092d3be6185021b2a45 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Fri, 14 Apr 2017 08:16:37 -0400 Subject: [PATCH 02/10] fixed immediate jump generation to just generate next board location --- src/BitBoard.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index c2b7708..6d283f4 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -32,53 +32,53 @@ int const BitBoard::getIndex(uint32_t piece) return (int)std::log2(piece); } -void BitBoard::addBlackJumps(std::vector &moves) +void BitBoard::addJumps(std::vector &moves) { uint32_t notOcc = ~(m_whitePieces|m_blackPieces); for (int i = 0; i < 32; ++i) { // grab the specific piece - uint32_t piece = m_blackPieces & 1< BitBoard::generateImmediateJumps(uint32_t piece) +std::vector BitBoard::generateImmediateJumps(uint32_t piece) { - std::vector moves; + std::vector moves; uint32_t notOcc = ~(m_whitePieces|m_blackPieces); uint32_t temp; bool isKing = piece & m_kings; if (m_isBlacksTurn) { temp = (rotl32(piece, 7) & upLeft) & m_whitePieces; if ((rotl32(temp, 7) & upLeft) & notOcc) - addNewMove(piece, rotl32(piece, 14), moves); + moves.push_back(getIndex(rotl32(temp, 7))); temp = (rotl32(piece, 1) & upRight) & m_whitePieces; if ((rotl32(temp, 1) & upRight) & notOcc) - addNewMove(piece, rotl32(piece, 2), moves); + moves.push_back(getIndex(rotl32(temp, 1))); if (isKing) { temp = (rotr32(piece, 7) & downRight) & m_whitePieces; if ((rotr32(temp, 7) & downRight) & notOcc) - addNewMove(piece, rotr32(piece, 14), moves); + moves.push_back(getIndex(rotr32(temp, 7))); temp = (rotr32(piece, 1) & downLeft) & m_whitePieces; if ((rotr32(temp, 1) & downLeft) & notOcc) - addNewMove(piece, rotr32(piece, 2), moves); + moves.push_back(getIndex(rotr32(temp, 1))); } } else { temp = (rotr32(piece, 7) & downRight) & m_blackPieces; if ((rotr32(temp, 7) & downRight) & notOcc) - addNewMove(piece, rotr32(piece, 14), moves); + moves.push_back(getIndex(rotr32(temp, 7))); temp = (rotr32(piece, 1) & downLeft) & m_blackPieces; if ((rotr32(temp, 1) & downLeft) & notOcc) - addNewMove(piece, rotr32(piece, 2), moves); + moves.push_back(getIndex(rotr32(temp, 1))); if (isKing) { temp = (rotl32(piece, 7) & upLeft) & m_blackPieces; if ((rotl32(temp, 7) & upLeft) & notOcc) - addNewMove(piece, rotl32(piece, 14), moves); + moves.push_back(getIndex(rotl32(temp, 7))); temp = (rotl32(piece, 1) & upRight) & m_blackPieces; if ((rotl32(temp, 1) & upRight) & notOcc) - addNewMove(piece, rotl32(piece, 2), moves); + moves.push_back(getIndex(rotl32(temp, 1))); } } return moves; From 828fe60b436c33d8373ae47ecdbc0fd09725cd21 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Fri, 14 Apr 2017 08:19:28 -0400 Subject: [PATCH 03/10] I'm being clumsy --- include/BitBoard.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/BitBoard.h b/include/BitBoard.h index 87e2bff..058e48b 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -69,8 +69,8 @@ class BitBoard int h10() const; int const getIndex(uint32_t piece); - void addBlackJumps(std::vector &moves); - std::vector generateImmediateJumps(uint32_t piece); + void addJumps(std::vector &moves); + std::vector generateImmediateJumps(uint32_t piece); void addNewMove(uint32_t start, uint32_t end, std::vector &moves); public: From 84d4d9e876878868b429efd0743478d5424799e1 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Mon, 17 Apr 2017 19:30:49 -0400 Subject: [PATCH 04/10] squash this later --- include/Move.h | 3 +++ src/BitBoard.cpp | 40 ++++++++++++++++++++++++++++++---------- src/Move.cpp | 13 +++++++++++++ src/main.cpp | 12 +++++++++++- 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/include/Move.h b/include/Move.h index cb8ff26..fdbeb22 100644 --- a/include/Move.h +++ b/include/Move.h @@ -14,6 +14,9 @@ class Move Move(); Move(int start); void addMove(int move); + void removeLast(); + bool isEmpty(); + int length(); }; #endif diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 6d283f4..7aee00a 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -44,41 +44,61 @@ void BitBoard::addJumps(std::vector &moves) } } -std::vector BitBoard::generateImmediateJumps(uint32_t piece) +void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves) { - std::vector moves; + if (move.isEmpty()) move.addMove(getIndex(piece)); // Add start position + std::vector immediateJumps = generateImmediateJumps(piece); + if (immediateJumps.size() == 0) { + if (move.length > 1) moves.push_back(move); // If no more jumps add move to list of moves + } else { + for (uint32_t x : immediateJumps) { + move.add(getIndex(x)); + generateAllJumps(boardMove(board, piece, x), move, x, moves); + move.removeLast(); + } + } +} + +BitBoard BitBoard::boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) +{ + +} + +std::vector BitBoard::generateImmediateJumps(uint32_t piece) +{ + std::vector moves; uint32_t notOcc = ~(m_whitePieces|m_blackPieces); uint32_t temp; bool isKing = piece & m_kings; if (m_isBlacksTurn) { temp = (rotl32(piece, 7) & upLeft) & m_whitePieces; if ((rotl32(temp, 7) & upLeft) & notOcc) - moves.push_back(getIndex(rotl32(temp, 7))); + moves.push_back(rotl32(temp, 7)); temp = (rotl32(piece, 1) & upRight) & m_whitePieces; if ((rotl32(temp, 1) & upRight) & notOcc) - moves.push_back(getIndex(rotl32(temp, 1))); + moves.push_back(rotl32(temp, 1)); if (isKing) { temp = (rotr32(piece, 7) & downRight) & m_whitePieces; if ((rotr32(temp, 7) & downRight) & notOcc) - moves.push_back(getIndex(rotr32(temp, 7))); + moves.push_back(rotr32(temp, 7)); temp = (rotr32(piece, 1) & downLeft) & m_whitePieces; if ((rotr32(temp, 1) & downLeft) & notOcc) - moves.push_back(getIndex(rotr32(temp, 1))); + moves.push_back(rotr32(temp, 1)); } } else { temp = (rotr32(piece, 7) & downRight) & m_blackPieces; if ((rotr32(temp, 7) & downRight) & notOcc) - moves.push_back(getIndex(rotr32(temp, 7))); + moves.push_back(rotr32(temp, 7)); temp = (rotr32(piece, 1) & downLeft) & m_blackPieces; if ((rotr32(temp, 1) & downLeft) & notOcc) - moves.push_back(getIndex(rotr32(temp, 1))); + moves.push_back(rotr32(temp, 1)); if (isKing) { temp = (rotl32(piece, 7) & upLeft) & m_blackPieces; if ((rotl32(temp, 7) & upLeft) & notOcc) - moves.push_back(getIndex(rotl32(temp, 7))); + moves.push_back(rotl32(temp, 7)); temp = (rotl32(piece, 1) & upRight) & m_blackPieces; if ((rotl32(temp, 1) & upRight) & notOcc) - moves.push_back(getIndex(rotl32(temp, 1))); + moves.push_back(rotl32(temp, 1)); } } return moves; diff --git a/src/Move.cpp b/src/Move.cpp index cd24105..488e0cc 100644 --- a/src/Move.cpp +++ b/src/Move.cpp @@ -13,3 +13,16 @@ void Move::addMove(int move) moves.push_back(move); } +void Move::removeLast() +{ + moves.pop_back(); +} + +bool Move::isEmpty() +{ + return moves.isEmpty(); +} + int Move::length() +{ + return moves.size(); +} diff --git a/src/main.cpp b/src/main.cpp index 2a87151..feead06 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,16 @@ #include +#include +#include +#include "BitBoard.h" +#include "Move.h" int main(int argc, const char * argv[]) { - std::cout << "Hello world!" << std::endl; + BitBoard board(16384, 2097280, 16384); + std::vector moves = board.generateImmediateJumps(16384); + for (Move move : moves) { + for (int x : move.getMoves()) { + std::cout << x << std::endl; + } + } return 0; } From 6c1c966b36297d67fe8cc1c0da3ba37d7099b71f Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Mon, 17 Apr 2017 21:36:48 -0400 Subject: [PATCH 05/10] Jump generation working --- include/BitBoard.h | 6 +++++- src/BitBoard.cpp | 25 ++++++++++++++++++++++--- src/Move.cpp | 2 +- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/BitBoard.h b/include/BitBoard.h index 058e48b..b398753 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -32,6 +32,8 @@ class BitBoard return r[index]; } + static const uint32_t whiteKingSpots = 0x00041041; + static const uint32_t blackKingSpots = 0x82000820; /* Class member variables */ const uint32_t m_blackPieces = 0x41C71C3; @@ -70,7 +72,9 @@ class BitBoard int const getIndex(uint32_t piece); void addJumps(std::vector &moves); - std::vector generateImmediateJumps(uint32_t piece); + 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); void addNewMove(uint32_t start, uint32_t end, std::vector &moves); public: diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 7aee00a..addc157 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -39,7 +39,7 @@ void BitBoard::addJumps(std::vector &moves) // grab the specific piece uint32_t piece = (m_isBlacksTurn) ? m_blackPieces & 1< immediateJumps = generateImmediateJumps(piece); if (immediateJumps.size() == 0) { - if (move.length > 1) moves.push_back(move); // If no more jumps add move to list of moves + if (move.length() > 1) moves.push_back(move); // If no more jumps add move to list of moves } else { for (uint32_t x : immediateJumps) { - move.add(getIndex(x)); + move.addMove(getIndex(x)); generateAllJumps(boardMove(board, piece, x), move, x, moves); move.removeLast(); } @@ -61,7 +61,25 @@ 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; + + // First figure out if a piece has been take + int pieceLoc = getIndex(piece); + int moveLoc = getIndex(moveTo); + 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) @@ -127,6 +145,7 @@ std::string const BitBoard::player() std::vector const BitBoard::actions() { std::vector moves; + addJumps(moves); return moves; } diff --git a/src/Move.cpp b/src/Move.cpp index 488e0cc..0751327 100644 --- a/src/Move.cpp +++ b/src/Move.cpp @@ -20,7 +20,7 @@ void Move::removeLast() bool Move::isEmpty() { - return moves.isEmpty(); + return moves.empty(); } int Move::length() { From 72a0ec8ff3367348aca0aa6675d9e6d4c76aaa69 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Tue, 18 Apr 2017 08:34:13 -0400 Subject: [PATCH 06/10] Move generation complete --- include/BitBoard.h | 2 ++ src/BitBoard.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/BitBoard.h b/include/BitBoard.h index b398753..7c632b0 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -72,12 +72,14 @@ class BitBoard int const getIndex(uint32_t piece); void addJumps(std::vector &moves); + 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); void addNewMove(uint32_t start, uint32_t end, std::vector &moves); public: + BitBoard(); BitBoard(uint32_t black, uint32_t white, uint32_t kings); std::string const player(); diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index addc157..f3cd033 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "Move.h" #include "BitBoard.h" @@ -44,6 +45,38 @@ void BitBoard::addJumps(std::vector &moves) } } +void BitBoard::addNormalMoves(std::vector &moves) { + uint32_t notOcc = ~(m_whitePieces|m_blackPieces); + for (int i = 0; i < 32; ++i) { + uint32_t piece; + if (m_isBlacksTurn) { + piece = m_blackPieces & 1< &moves) { if (move.isEmpty()) move.addMove(getIndex(piece)); // Add start position @@ -131,6 +164,8 @@ void BitBoard::addNewMove(uint32_t start, uint32_t end, std::vector &moves /* Public functions */ +BitBoard::BitBoard() {}; + BitBoard::BitBoard(uint32_t black, uint32_t white, uint32_t kings) : m_blackPieces(black), m_whitePieces(white), m_kings(kings) { @@ -146,6 +181,9 @@ std::vector const BitBoard::actions() { std::vector moves; addJumps(moves); + if (moves.empty()) { + addNormalMoves(moves); + } return moves; } From d858eb0cb2c9bc5dfbe7e2fd272747ca31975195 Mon Sep 17 00:00:00 2001 From: Mark Bluemer Date: Tue, 18 Apr 2017 08:52:52 -0400 Subject: [PATCH 07/10] wrote move result function --- include/BitBoard.h | 7 +++---- include/Move.h | 1 + src/BitBoard.cpp | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/BitBoard.h b/include/BitBoard.h index 7c632b0..4f05f20 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -36,13 +36,12 @@ class BitBoard static const uint32_t blackKingSpots = 0x82000820; /* Class member variables */ - const uint32_t m_blackPieces = 0x41C71C3; - const uint32_t m_whitePieces = 0xE3820C38; - const uint32_t m_kings = 0; + 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 */ diff --git a/include/Move.h b/include/Move.h index fdbeb22..ad8f7b6 100644 --- a/include/Move.h +++ b/include/Move.h @@ -17,6 +17,7 @@ class Move void removeLast(); bool isEmpty(); int length(); + std::vector getMoves() { return moves; } }; #endif diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index f3cd033..9f9ea33 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -187,3 +187,17 @@ std::vector const BitBoard::actions() return moves; } + +BitBoard const BitBoard::result(Move move) { + BitBoard currBoard = *this; + int start; + for (int x : move.getMoves()) { + if (!start) { + start = x; + } else { + currBoard = boardMove(currBoard, 1< Date: Tue, 18 Apr 2017 09:30:09 -0400 Subject: [PATCH 08/10] wrote printState function --- include/BitBoard.h | 3 +++ src/BitBoard.cpp | 28 ++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/BitBoard.h b/include/BitBoard.h index 4f05f20..c2625df 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "Move.h" class BitBoard @@ -68,6 +69,7 @@ class BitBoard int h8() const; int h9() const; int h10() const; + int const getIndex(uint32_t piece); void addJumps(std::vector &moves); @@ -76,6 +78,7 @@ class BitBoard BitBoard boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo); std::vector generateImmediateJumps(uint32_t piece); void addNewMove(uint32_t start, uint32_t end, std::vector &moves); + std::string pieceToString(int piece); public: BitBoard(); diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 9f9ea33..06f72ce 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -45,7 +45,8 @@ void BitBoard::addJumps(std::vector &moves) } } -void BitBoard::addNormalMoves(std::vector &moves) { +void BitBoard::addNormalMoves(std::vector &moves) +{ uint32_t notOcc = ~(m_whitePieces|m_blackPieces); for (int i = 0; i < 32; ++i) { uint32_t piece; @@ -162,6 +163,16 @@ void BitBoard::addNewMove(uint32_t start, uint32_t end, std::vector &moves moves.push_back(newMove); } +std::string BitBoard::pieceToString(int piece) +{ + uint32_t pieceLoc = 1< const BitBoard::actions() return moves; } -BitBoard const BitBoard::result(Move move) { +BitBoard const BitBoard::result(Move move) +{ BitBoard currBoard = *this; int start; for (int x : move.getMoves()) { @@ -201,3 +213,15 @@ BitBoard const BitBoard::result(Move move) { } return currBoard; } + +void const BitBoard::printState() +{ + std::cout<<"-"< Date: Tue, 18 Apr 2017 13:03:11 -0400 Subject: [PATCH 09/10] some bug fixes --- include/BitBoard.h | 7 +++--- src/BitBoard.cpp | 57 +++++++++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 26 deletions(-) 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< Date: Tue, 18 Apr 2017 14:32:29 -0400 Subject: [PATCH 10/10] fixed merge issue --- include/BitBoard.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/BitBoard.h b/include/BitBoard.h index c7a265e..f360b92 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -43,6 +43,8 @@ class BitBoard 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 */