/* * Remove castling flags that arent valid */ private static void removeInvalidCastleFlags(Position position) { int castleMask = position.getCastleMask(); int validCastle = 0; if (position.getPiece(4) == PieceType.K) { if (position.getPiece(0) == PieceType.R) validCastle |= (1 << Position.A1_CASTLE); if (position.getPiece(7) == PieceType.R) validCastle |= (1 << Position.H1_CASTLE); } if (position.getPiece(60) == PieceType.k) { if (position.getPiece(56) == PieceType.r) validCastle |= (1 << Position.A8_CASTLE); if (position.getPiece(63) == PieceType.r) validCastle |= (1 << Position.H8_CASTLE); } castleMask &= validCastle; position.setCastleMask(castleMask); }
/* * Generate and return a list of psuedo-legal moves. * Pseudo-legal moves are those that don't necessarily defend * from check threats. */ public ArrayList psuedoLegalMoves(Position position) { ArrayList moveList = getMoveListObject(); Boolean whiteToMove = position.whiteMove; for (int file = 0; file < 8; file++) { for (int rank = 0; rank < 8; rank++) { int square = Position.getSquare(file, rank); PieceType piece = position.getPiece(square); if ((piece == PieceType.Empty) || (((int)piece < 6) != whiteToMove)) { continue; } if ((piece == PieceType.R) || (piece == PieceType.r) || (piece == PieceType.Q) || (piece == PieceType.q)) { if (addDirection(moveList, position, square, 7 - file, 1)) return moveList; if (addDirection(moveList, position, square, 7 - rank, 8)) return moveList; if (addDirection(moveList, position, square, file, -1)) return moveList; if (addDirection(moveList, position, square, rank, -8)) return moveList; } if ((piece == PieceType.B) || (piece == PieceType.b) || (piece == PieceType.Q) || (piece == PieceType.q)) { if (addDirection(moveList, position, square, Math.Min(7 - file, 7 - rank), 9)) return moveList; if (addDirection(moveList, position, square, Math.Min(file, 7 - rank), 7)) return moveList; if (addDirection(moveList, position, square, Math.Min(file, rank), -9)) return moveList; if (addDirection(moveList, position, square, Math.Min(7 - file, rank), -7)) return moveList; } if ((piece == PieceType.N) || (piece == PieceType.n)) { if (file < 6 && rank < 7 && addDirection(moveList, position, square, 1, 10)) return moveList; if (file < 7 && rank < 6 && addDirection(moveList, position, square, 1, 17)) return moveList; if (file > 0 && rank < 6 && addDirection(moveList, position, square, 1, 15)) return moveList; if (file > 1 && rank < 7 && addDirection(moveList, position, square, 1, 6)) return moveList; if (file > 1 && rank > 0 && addDirection(moveList, position, square, 1, -10)) return moveList; if (file > 0 && rank > 1 && addDirection(moveList, position, square, 1, -17)) return moveList; if (file < 7 && rank > 1 && addDirection(moveList, position, square, 1, -15)) return moveList; if (file < 6 && rank > 0 && addDirection(moveList, position, square, 1, -6)) return moveList; } if ((piece == PieceType.K) || (piece == PieceType.k)) { if (file < 7 && addDirection(moveList, position, square, 1, 1)) return moveList; if (file < 7 && rank < 7 && addDirection(moveList, position, square, 1, 9)) return moveList; if (rank < 7 && addDirection(moveList, position, square, 1, 8)) return moveList; if (file > 0 && rank < 7 && addDirection(moveList, position, square, 1, 7)) return moveList; if (file > 0 && addDirection(moveList, position, square, 1, -1)) return moveList; if (file > 0 && rank > 0 && addDirection(moveList, position, square, 1, -9)) return moveList; if (rank > 0 && addDirection(moveList, position, square, 1, -8)) return moveList; if (file < 7 && rank > 0 && addDirection(moveList, position, square, 1, -7)) return moveList; int kingOrigin = whiteToMove ? Position.getSquare(4, 0) : Position.getSquare(4, 7); if (Position.getSquare(file, rank) == kingOrigin) { int aCastle = whiteToMove ? Position.A1_CASTLE : Position.A8_CASTLE; int hCastle = whiteToMove ? Position.H1_CASTLE : Position.H8_CASTLE; PieceType rook = whiteToMove ? PieceType.R : PieceType.r; if (((position.getCastleMask() & (1 << hCastle)) != 0) && (position.getPiece(kingOrigin + 1) == PieceType.Empty) && (position.getPiece(kingOrigin + 2) == PieceType.Empty) && (position.getPiece(kingOrigin + 3) == rook) && !squareAttacked(position, kingOrigin) && !squareAttacked(position, kingOrigin + 1) && !squareAttacked(position, kingOrigin + 2)) { moveList.Add(getMoveObject(kingOrigin, kingOrigin + 2, PieceType.Empty)); } if (((position.getCastleMask() & (1 << aCastle)) != 0) && (position.getPiece(kingOrigin - 1) == PieceType.Empty) && (position.getPiece(kingOrigin - 2) == PieceType.Empty) && (position.getPiece(kingOrigin - 3) == PieceType.Empty) && (position.getPiece(kingOrigin - 4) == rook) && !squareAttacked(position, kingOrigin) && !squareAttacked(position, kingOrigin - 1) && !squareAttacked(position, kingOrigin - 2)) { moveList.Add(getMoveObject(kingOrigin, kingOrigin - 2, PieceType.Empty)); } } } if ((piece == PieceType.P) || (piece == PieceType.p)) { int rankDir = whiteToMove ? 8 : -8; if (position.getPiece(square + rankDir) == PieceType.Empty) { //non capture moves addPawnMoves(moveList, square, square + rankDir); if ((rank == (whiteToMove ? 1 : 6)) && (position.getPiece(square + 2 * rankDir) == PieceType.Empty)) { //double step moves addPawnMoves(moveList, square, square + rankDir * 2); } } //Capture to the left if (file > 0) { int toSquare = square + rankDir - 1; PieceType captured = position.getPiece(toSquare); if (captured != PieceType.Empty) { if (((int)captured < 6) != whiteToMove) { if (captured == (whiteToMove ? PieceType.k : PieceType.K)) { returnMoveList(moveList); moveList = getMoveListObject(); moveList.Add(getMoveObject(square, toSquare, PieceType.Empty)); return moveList; } else { addPawnMoves(moveList, square, toSquare); } } } else if (toSquare == position.getEpSquare()) { addPawnMoves(moveList, square, toSquare); } } //Capture to the right if (file < 7) { int toSquare = square + rankDir + 1; PieceType captured = position.getPiece(toSquare); if (captured != PieceType.Empty) { if (((int)captured < 6) != whiteToMove) { if (captured == (whiteToMove ? PieceType.k : PieceType.K)) { returnMoveList(moveList); moveList = getMoveListObject(); moveList.Add(getMoveObject(square, toSquare, PieceType.Empty)); return moveList; } else { addPawnMoves(moveList, square, toSquare); } } } else if (toSquare == position.getEpSquare()) { addPawnMoves(moveList, square, toSquare); } } } } } return moveList; }