|
@@ -9,51 +9,39 @@ using namespace chessy;
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
-Bitboard& Board::operator[] (int index)
|
|
|
-{
|
|
|
- return (&whitePawns)[index];
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-const Bitboard& Board::operator[] (int index) const
|
|
|
-{
|
|
|
- return (&whitePawns)[index];
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
void Board::resetBoard(void)
|
|
|
{
|
|
|
- whitePawns = 0x000000000000FF00;
|
|
|
- whiteRooks = 0x0000000000000081;
|
|
|
- whiteKnights = 0x0000000000000042;
|
|
|
- whiteBishops = 0x0000000000000024;
|
|
|
- whiteQueens = 0x0000000000000010;
|
|
|
- whiteKing = 0x0000000000000008;
|
|
|
-
|
|
|
- blackPawns = 0x00FF000000000000;
|
|
|
- blackRooks = 0x8100000000000000;
|
|
|
- blackKnights = 0x4200000000000000;
|
|
|
- blackBishops = 0x2400000000000000;
|
|
|
- blackQueens = 0x1000000000000000;
|
|
|
- blackKing = 0x0800000000000000;
|
|
|
+ whites[PieceType::PAWN] = 0x0000000000000081;
|
|
|
+ whites[PieceType::KNIGHT] = 0x0000000000000042;
|
|
|
+ whites[PieceType::BISHOP] = 0x0000000000000024;
|
|
|
+ whites[PieceType::ROOK] = 0x0000000000000010;
|
|
|
+ whites[PieceType::QUEEN] = 0x0000000000000008;
|
|
|
+ whites[PieceType::KING] = 0x000000000000FF00;
|
|
|
+
|
|
|
+ blacks[PieceType::PAWN] = 0x00FF000000000000;
|
|
|
+ blacks[PieceType::KNIGHT] = 0x8100000000000000;
|
|
|
+ blacks[PieceType::BISHOP] = 0x4200000000000000;
|
|
|
+ blacks[PieceType::ROOK] = 0x2400000000000000;
|
|
|
+ blacks[PieceType::QUEEN] = 0x1000000000000000;
|
|
|
+ blacks[PieceType::KING] = 0x0800000000000000;
|
|
|
}
|
|
|
|
|
|
|
|
|
void Board::setEmpty(void)
|
|
|
{
|
|
|
- whitePawns = 0;
|
|
|
- whiteRooks = 0;
|
|
|
- whiteKnights = 0;
|
|
|
- whiteBishops = 0;
|
|
|
- whiteQueens = 0;
|
|
|
- whiteKing = 0;
|
|
|
-
|
|
|
- blackPawns = 0;
|
|
|
- blackRooks = 0;
|
|
|
- blackKnights = 0;
|
|
|
- blackBishops = 0;
|
|
|
- blackQueens = 0;
|
|
|
- blackKing = 0;
|
|
|
+ whites[PieceType::PAWN] = 0;
|
|
|
+ whites[PieceType::KNIGHT] = 0;
|
|
|
+ whites[PieceType::BISHOP] = 0;
|
|
|
+ whites[PieceType::ROOK] = 0;
|
|
|
+ whites[PieceType::QUEEN] = 0;
|
|
|
+ whites[PieceType::KING] = 0;
|
|
|
+
|
|
|
+ blacks[PieceType::PAWN] = 0;
|
|
|
+ blacks[PieceType::KNIGHT] = 0;
|
|
|
+ blacks[PieceType::BISHOP] = 0;
|
|
|
+ blacks[PieceType::ROOK] = 0;
|
|
|
+ blacks[PieceType::QUEEN] = 0;
|
|
|
+ blacks[PieceType::KING] = 0;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -61,6 +49,7 @@ bool Board::tryToMove(Bitboard start, Bitboard end, Bitboard& b)
|
|
|
{
|
|
|
if (start & b)
|
|
|
b = b ^ start ^ end;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -68,18 +57,18 @@ void Board::setBoard(const std::string& fenPosition)
|
|
|
{
|
|
|
int row = 0, column = 0;
|
|
|
unordered_map<char, Bitboard*> boards {
|
|
|
- {'p', &whitePawns},
|
|
|
- {'n', &whiteKnights},
|
|
|
- {'b', &whiteBishops},
|
|
|
- {'r', &whiteRooks},
|
|
|
- {'q', &whiteQueens},
|
|
|
- {'k', &whiteKing},
|
|
|
- {'P', &blackPawns},
|
|
|
- {'N', &blackKnights},
|
|
|
- {'B', &blackBishops},
|
|
|
- {'R', &blackRooks},
|
|
|
- {'Q', &blackQueens},
|
|
|
- {'K', &blackKing}
|
|
|
+ { 'p', &whites[PieceType::PAWN] },
|
|
|
+ { 'n', &whites[PieceType::KNIGHT] },
|
|
|
+ { 'b', &whites[PieceType::BISHOP] },
|
|
|
+ { 'r', &whites[PieceType::ROOK] },
|
|
|
+ { 'q', &whites[PieceType::QUEEN] },
|
|
|
+ { 'k', &whites[PieceType::KING] },
|
|
|
+ { 'P', &blacks[PieceType::PAWN] },
|
|
|
+ { 'N', &blacks[PieceType::KNIGHT] },
|
|
|
+ { 'B', &blacks[PieceType::BISHOP] },
|
|
|
+ { 'R', &blacks[PieceType::ROOK] },
|
|
|
+ { 'Q', &blacks[PieceType::QUEEN] },
|
|
|
+ { 'K', &blacks[PieceType::KING] }
|
|
|
};
|
|
|
setEmpty();
|
|
|
for (auto character : fenPosition) {
|
|
@@ -111,8 +100,8 @@ std::string Board::getFenBoard(void) const
|
|
|
for (int row = 0; row < 8; row++) {
|
|
|
int counter = 0;
|
|
|
for (int column = 0; column < 8; column++) {
|
|
|
- PieceType black = getBlackAtPosition({row, column});
|
|
|
- PieceType white = getWhiteAtPosition({row, column});
|
|
|
+ PieceType black = getBlackAtPosition({ row, column });
|
|
|
+ PieceType white = getWhiteAtPosition({ row, column });
|
|
|
//str << " " << Bitboard::fromIndex({row, column}) << " " << " ";;
|
|
|
//str << "row,column,index: " << row << "," << column << "," <<
|
|
|
// int(Index(row, column).index) << " ";
|
|
@@ -138,6 +127,7 @@ std::string Board::getFenBoard(void) const
|
|
|
case PieceType::ROOK: str << 'r'; break;
|
|
|
case PieceType::QUEEN: str << 'q'; break;
|
|
|
case PieceType::KING: str << 'k'; break;
|
|
|
+ default:;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -153,26 +143,20 @@ std::string Board::getFenBoard(void) const
|
|
|
PieceType Board::getWhiteAtPosition(Index i) const
|
|
|
{
|
|
|
Bitboard mask = Bitboard::fromIndex(i);
|
|
|
- if (whitePawns & mask) return PieceType::PAWN;
|
|
|
- if (whiteKnights & mask) return PieceType::KNIGHT;
|
|
|
- if (whiteBishops & mask) return PieceType::BISHOP;
|
|
|
- if (whiteRooks & mask) return PieceType::ROOK;
|
|
|
- if (whiteQueens & mask) return PieceType::QUEEN;
|
|
|
- if (whiteKing & mask) return PieceType::KING;
|
|
|
- return PieceType::EMPTY;
|
|
|
+ for (int i = 0; i < 6; i++)
|
|
|
+ if (whites[i] & mask)
|
|
|
+ return (PieceType) i;
|
|
|
+ return PieceType::EMPTY;
|
|
|
}
|
|
|
|
|
|
|
|
|
PieceType Board::getBlackAtPosition(Index i) const
|
|
|
{
|
|
|
Bitboard mask = Bitboard::fromIndex(i);
|
|
|
- if (blackPawns & mask) return PieceType::PAWN;
|
|
|
- if (blackKnights & mask) return PieceType::KNIGHT;
|
|
|
- if (blackBishops & mask) return PieceType::BISHOP;
|
|
|
- if (blackRooks & mask) return PieceType::ROOK;
|
|
|
- if (blackQueens & mask) return PieceType::QUEEN;
|
|
|
- if (blackKing & mask) return PieceType::KING;
|
|
|
- return PieceType::EMPTY;
|
|
|
+ for (int i = 0; i < 6; i++)
|
|
|
+ if (blacks[i] & mask)
|
|
|
+ return (PieceType) i;
|
|
|
+ return PieceType::EMPTY;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -180,35 +164,18 @@ void Board::applyMove(const Move& move)
|
|
|
{
|
|
|
Bitboard start = Bitboard::fromIndex(move.origin);
|
|
|
Bitboard end = Bitboard::fromIndex(move.destination);
|
|
|
-
|
|
|
- tryToMove(start, end, whitePawns);
|
|
|
- tryToMove(start, end, whiteRooks);
|
|
|
- tryToMove(start, end, whiteKnights);
|
|
|
- tryToMove(start, end, whiteBishops);
|
|
|
}
|
|
|
|
|
|
|
|
|
Bitboard Board::getWhites(void) const
|
|
|
{
|
|
|
- return
|
|
|
- whitePawns |
|
|
|
- whiteRooks |
|
|
|
- whiteKnights |
|
|
|
- whiteBishops |
|
|
|
- whiteQueens |
|
|
|
- whiteKing;
|
|
|
+ return whites[0] | whites[1] | whites[2] | whites[3] | whites[4] | whites[5];
|
|
|
}
|
|
|
|
|
|
|
|
|
Bitboard Board::getBlacks(void) const
|
|
|
{
|
|
|
- return
|
|
|
- blackPawns |
|
|
|
- blackRooks |
|
|
|
- blackKnights |
|
|
|
- blackBishops |
|
|
|
- blackQueens |
|
|
|
- blackKing;
|
|
|
+ return blacks[0] | blacks[1] | blacks[2] | blacks[3] | blacks[4] | blacks[5];
|
|
|
}
|
|
|
|
|
|
|