diff --git a/Board.cpp b/Board.cpp index 780b465..77cbd8e 100644 --- a/Board.cpp +++ b/Board.cpp @@ -7,6 +7,7 @@ // defined by the Mozilla Public License, v. 2.0. #include "Board.hpp" +#include "inc/strFuncs.hpp" /* * This is how the chessboard is organized in memory @@ -85,6 +86,21 @@ void Board::setupInitialPosition() { return; } +int setupFromFEN(std::string strFEN) { + std::string field1, field2, field3, field4, field5, field6; + std::vector splitFEN = split(strFEN, ' '); + if(splitFEN.size() != 6) { // a valid FEN *must* contain 6 fields + return -1; + } + field1 = splitFEN[0]; + field2 = splitFEN[1]; + field3 = splitFEN[2]; + field4 = splitFEN[3]; + field5 = splitFEN[4]; + field6 = splitFEN[5]; + return 0; +} + void Board::movePiece(Square from, Square to) { return; } diff --git a/Board.hpp b/Board.hpp index 4b9f818..4076b32 100644 --- a/Board.hpp +++ b/Board.hpp @@ -35,6 +35,7 @@ class Board { void setupInitialPosition(); Piece *getPieceAt(Square square); void movePiece(Square from, Square to); + int setupFromFEN(std::string strFEN); bool isInBounds(Square square) const; bool isEmpty(Square square) const; uint64_t serialBoard = 0xFFFF00000000FFFF; // opening position diff --git a/Piece.cpp b/Piece.cpp index bab48ec..f15180a 100644 --- a/Piece.cpp +++ b/Piece.cpp @@ -44,7 +44,6 @@ std::vector King::getLegalMoves(const Square &from, const Board &board) co Square targetSquare = {ra, fi}; if(targetSquare.isValid()) { const auto &target = board.boardGrid[r][f]; // examine the target square - if(!target) { // if square is empty (NULL) moveList.push_back({from, targetSquare}); // then it's potentially a legal move } else if(target && target->getColour() != this->getColour()) { // if it's occupied with a piece of opposite colour @@ -68,8 +67,8 @@ std::vector King::getLegalMoves(const Square &from, const Board &board) co * _1___2__ * ___K____ * _5___6__ - * __7_8___ - * + * __7_8___ + * */ std::vector> knightAttacks = { {-1, -2}, // 1 @@ -90,7 +89,7 @@ std::vector King::getLegalMoves(const Square &from, const Board &board) co bool diagonal = (abs(dir[0]) + abs(dir[1]) == 2) ? 1 : 0; // check if diagonal bool knight = (abs(dir[0]) + abs(dir[1]) == 3) ? 1 : 0; // check if knight attack while(r >= 0 && r < 8 && f >= 0 && f < 8) { - auto &target = board.boardGrid[r][f]; // check what's at the square we're examining + auto &target = board.boardGrid[r][f]; // access the square we're examining if(!target) { // empty square, continue continue; @@ -98,14 +97,18 @@ std::vector King::getLegalMoves(const Square &from, const Board &board) co if(target && (target->getColour() != this->getColour())) { // is it occupied & an enemy? if((target->getPieceType() == QUEEN || target->getPieceType() == BISHOP) && diagonal) { // we are being attacked diagonally on this square, so remove it - //moves.to.rank = 255; moves.to.file = 255; // mark as invalid??? + moves.to.rank = INVALID_RANK; moves.to.file = INVALID_FILE; } - if(target->getPieceType() == KNIGHT && knight) { + else if(target->getPieceType() == KNIGHT && knight) { // we are being attacked by a knight, so remove it - //moves.to.rank = 255; moves.to.file = 255; + moves.to.rank = INVALID_RANK; moves.to.file = INVALID_FILE; } - if(target->getPieceType() == ROOK && (!diagonal && !knight)) { + else if(target->getPieceType() == ROOK || target->getPieceType() == QUEEN && (!diagonal && !knight)) { // again, being attacked, remove it + moves.to.rank = INVALID_RANK; moves.to.file = INVALID_FILE; + } + if(target->getPieceType() == PAWN && (abs(r - startSquare.rank) == 1 && abs(f - startSquare.file) == 1)) { + moves.to.rank = INVALID_RANK; moves.to.file = INVALID_FILE; } } if(target && (target->getColour() == this->getColour())) { @@ -115,13 +118,18 @@ std::vector King::getLegalMoves(const Square &from, const Board &board) co if(!knight) { r += dir[0]; f += dir[1]; - } else { + } else break; - } } } - } + // will this actually work? + moveList.erase( + std::remove_if(moveList.begin(), moveList.end(), + [&](const Square &x) { + return std::find(x.begin(), x.end(), !x.isValid()) != x.end(); + }), + moveList.end()); return moveList; } diff --git a/Piece.hpp b/Piece.hpp index 245b81a..8d407c8 100644 --- a/Piece.hpp +++ b/Piece.hpp @@ -27,11 +27,11 @@ enum PieceColour { }; enum Rank { - R1 = 0, R2 = 1, R3 = 2, R4 = 3, R5 = 4, R6 = 5, R7 = 6, R8 = 7 + R1 = 0, R2 = 1, R3 = 2, R4 = 3, R5 = 4, R6 = 5, R7 = 6, R8 = 7, INVALID_RANK = 255 }; enum File { - A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7 + A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7, INVALID_FILE = 255 }; struct Square {