| 
					
				 | 
			
			
				@@ -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); 
			 |