bool ChessMove::IsValidCastleMove(const ChessBoard& board) const{ ChessPiece* king = board.GetPiece(startX, startY); if (king->GetMoveCount() != 0) return false; if (abs(startX-endX) != 2 || startY != endY) return false; int x = 7; int delta = 1; if (startX > endX){ x = 0; delta = -1; } ChessPiece* rook = board.GetPiece(x, startY); if (rook && rook->GetMoveCount() != 0) return false; ChessColor opposingColor = SwitchColor(king->GetColor()); for (int i = startX; GetCondition(i, startX, x); i += delta){ if ((board.GetPiece(i, startY) && i != startX) || board.UnderAttack(opposingColor,i,startY)) return false; } return true; }
bool ChessMove::IsValidEnPassantMove(const ChessBoard& board, int delta, int startingRow) const{ if (startY != startingRow+delta*3 || abs(startX-endX) != 1 || startY+delta != endY) return false; if (board.GetPiece(endX, endY)) return false; ChessPiece* potentialPawn = board.GetPiece(endX, startY); return potentialPawn && potentialPawn->GetRank()==PAWN && potentialPawn->GetMoveCount()==1; }