diff --git a/include/BitBoard.h b/include/BitBoard.h index 42290be..83c00d0 100644 --- a/include/BitBoard.h +++ b/include/BitBoard.h @@ -51,8 +51,8 @@ class BitBoard // 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 rotl32 (uint32_t n, unsigned int c) const; - uint32_t const rotr32 (uint32_t n, unsigned int c) const; + uint32_t rotl32 (uint32_t n, unsigned int c) const; + uint32_t rotr32 (uint32_t n, unsigned int c) const; const uint32_t playerPieces() const; @@ -73,25 +73,25 @@ class BitBoard int h9() const; int h10() const; - int const getIndex(uint32_t piece); + int getIndex(uint32_t piece) const; - 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(BitBoard &board, uint32_t piece); - void addNewMove(uint32_t start, uint32_t end, std::vector &moves); - std::string pieceToString(int piece); + void addJumps(std::vector &moves) const; + void addNormalMoves(std::vector &moves) const; + void generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves) const; + BitBoard boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) const; + std::vector generateImmediateJumps(BitBoard &board, uint32_t piece) const; + void addNewMove(uint32_t start, uint32_t end, std::vector &moves) const; + std::string pieceToString(int piece) const; public: BitBoard(); BitBoard(uint32_t black, uint32_t white, uint32_t kings); - std::string const player(); - std::vector const actions(); - BitBoard const result(Move move); - double utility(std::string player); - void const printState(); + std::string player() const; + std::vector actions() const; + BitBoard result(Move move) const; + double utility(std::string player) const; + void printState() const; }; #endif diff --git a/include/MinimaxSearch.h b/include/MinimaxSearch.h index 053d588..09087a9 100644 --- a/include/MinimaxSearch.h +++ b/include/MinimaxSearch.h @@ -8,13 +8,13 @@ class MinimaxSearch { private: - static const int maxDepth = 5; + static const int maxDepth = 9; - double minValue(BitBoard board, int currentDepth); - double maxValue(BitBoard board, int currentDepth); + double minValue(const BitBoard &board, int currentDepth) const; + double maxValue(const BitBoard &board, int currentDepth) const; public: - Move minimaxDecision(BitBoard &board); + Move minimaxDecision(const BitBoard &board) const; }; diff --git a/src/BitBoard.cpp b/src/BitBoard.cpp index 1de01ae..d061547 100644 --- a/src/BitBoard.cpp +++ b/src/BitBoard.cpp @@ -11,7 +11,7 @@ // 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 +uint32_t BitBoard::rotl32 (uint32_t n, unsigned int c) const { const unsigned int mask = (CHAR_BIT*sizeof(n)-1); @@ -19,7 +19,7 @@ uint32_t const BitBoard::rotl32 (uint32_t n, unsigned int c) const return (n<>( (-c)&mask )); } -uint32_t const BitBoard::rotr32 (uint32_t n, unsigned int c) const +uint32_t BitBoard::rotr32 (uint32_t n, unsigned int c) const { const unsigned int mask = (CHAR_BIT*sizeof(n)-1); @@ -28,12 +28,12 @@ uint32_t const BitBoard::rotr32 (uint32_t n, unsigned int c) const } // Given a piece represented by a binary value return it's index -int const BitBoard::getIndex(uint32_t piece) +int BitBoard::getIndex(uint32_t piece) const { return (int)std::log2(piece); } -void BitBoard::addJumps(std::vector &moves) +void BitBoard::addJumps(std::vector &moves) const { uint32_t notOcc = ~(m_whitePieces|m_blackPieces); for (int i = 0; i < 32; ++i) { @@ -45,7 +45,7 @@ void BitBoard::addJumps(std::vector &moves) } } -void BitBoard::addNormalMoves(std::vector &moves) +void BitBoard::addNormalMoves(std::vector &moves) const { uint32_t notOcc = ~(m_whitePieces|m_blackPieces); for (int i = 0; i < 32; ++i) { @@ -78,7 +78,7 @@ void BitBoard::addNormalMoves(std::vector &moves) } } -void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves) +void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std::vector &moves) const { if (move.isEmpty()) move.addMove(getIndex(piece)); // Add start position std::vector immediateJumps = generateImmediateJumps(board, piece); @@ -93,7 +93,7 @@ void BitBoard::generateAllJumps(BitBoard board, Move move, uint32_t piece, std:: } } -BitBoard BitBoard::boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) +BitBoard BitBoard::boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) const { // Constructor needs black, white, and kings locations so just derive those and instantiate new board object uint32_t white = board.m_whitePieces; @@ -124,7 +124,7 @@ BitBoard BitBoard::boardMove(BitBoard &board, uint32_t piece, uint32_t moveTo) return BitBoard(black, white, kings); } -std::vector BitBoard::generateImmediateJumps(BitBoard &board, uint32_t piece) +std::vector BitBoard::generateImmediateJumps(BitBoard &board, uint32_t piece) const { std::vector moves; uint32_t notOcc = ~(board.m_whitePieces|board.m_blackPieces); @@ -164,14 +164,14 @@ std::vector BitBoard::generateImmediateJumps(BitBoard &board, uint32_t return moves; } -void BitBoard::addNewMove(uint32_t start, uint32_t end, std::vector &moves) +void BitBoard::addNewMove(uint32_t start, uint32_t end, std::vector &moves) const { Move newMove(getIndex(start)); newMove.addMove(getIndex(end)); moves.push_back(newMove); } -std::string BitBoard::pieceToString(int piece) +std::string BitBoard::pieceToString(int piece) const { uint32_t pieceLoc = 1< const BitBoard::actions() +std::vector BitBoard::actions() const { std::vector moves; addJumps(moves); @@ -207,7 +207,7 @@ std::vector const BitBoard::actions() return moves; } -BitBoard const BitBoard::result(Move move) +BitBoard BitBoard::result(Move move) const { BitBoard currBoard = *this; int start{-1}; @@ -224,13 +224,13 @@ BitBoard const BitBoard::result(Move move) return currBoard; } -double BitBoard::utility(std::string player) +double BitBoard::utility(std::string player) const { // TODO: Do something useful here return 0.0; } -void const BitBoard::printState() +void BitBoard::printState() const { std::cout<<"-"< #include #include +#include #include "BitBoard.h" #include "Move.h" #include "MinimaxSearch.h" /* Private Functions */ -double MinimaxSearch::minValue(BitBoard board, int currentDepth) +double MinimaxSearch::minValue(const BitBoard &board, int currentDepth) const { if (currentDepth == maxDepth) return board.utility(board.player()); double v = std::numeric_limits::lowest(); for (Move move : board.actions()) { - v = std::min(v, maxValue(board.result(move), ++currentDepth)); + v = std::min(v, maxValue(board.result(move), currentDepth + 1)); } return v; } -double MinimaxSearch::maxValue(BitBoard board, int currentDepth) +double MinimaxSearch::maxValue(const BitBoard &board, int currentDepth) const { if (currentDepth == maxDepth) return board.utility(board.player()); double v = std::numeric_limits::max(); for (Move move : board.actions()) { - v = std::max(v, minValue(board.result(move), ++currentDepth)); + v = std::max(v, minValue(board.result(move), currentDepth + 1)); } return v; } /* Public Functions */ -Move MinimaxSearch::minimaxDecision(BitBoard &board) +Move MinimaxSearch::minimaxDecision(const BitBoard &board) const { Move bestMove; double bestMoveValue{0.0};