|
@@ -1,7 +1,24 @@
|
|
|
#include "Board.h"
|
|
|
#include <string>
|
|
|
+#include <unordered_map>
|
|
|
+#include <ctype.h>
|
|
|
+#include <stdexcept>
|
|
|
+#include <sstream>
|
|
|
|
|
|
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)
|
|
@@ -29,6 +46,86 @@ bool Board::tryToMove(Bitboard start, Bitboard end, Bitboard& b)
|
|
|
}
|
|
|
|
|
|
|
|
|
+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}
|
|
|
+ };
|
|
|
+
|
|
|
+ for (auto character : fenPosition) {
|
|
|
+ if (character >= '0' && character <= '9') {
|
|
|
+ column += character - '0';
|
|
|
+ }
|
|
|
+ else if (character == '/') {
|
|
|
+ ++ row;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ auto board = boards.find(character);
|
|
|
+ if (board != boards.end()) {
|
|
|
+ *(board->second) |= Bitboard::fromIndex({row, column});
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ throw runtime_error("invalid piece type "s + character);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+std::string Board::getFenBoard(void) const
|
|
|
+{
|
|
|
+ using namespace std;
|
|
|
+ stringstream str;
|
|
|
+ for (int row = 0; row < 8; row++) {
|
|
|
+ int counter = 0;
|
|
|
+ for (int column; column < 8; column++) {
|
|
|
+
|
|
|
+ }
|
|
|
+ if (row != 7)
|
|
|
+ str << "/";
|
|
|
+ }
|
|
|
+ return str.str();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+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;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+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;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void Board::applyMove(const Move& move)
|
|
|
{
|
|
|
Bitboard start = Bitboard::fromIndex(move.origin);
|