private List<Square> validMovesForPawn(Square square) { List<Square> validMoves = new ArrayList<Square>(); // Regular moves, 1 or 2 up or down depending on color Piece piece = square.getPiece(); if (piece.isWhite()) { int movesUp = piece.movesUp(); if (square.containsPawnOnStartingRow()) movesUp += 1; validMoves.addAll(validMovesForSquareInDirection(square, movesUp, 1, 0, 0, 0)); } else { int movesDown = piece.movesDown(); if (square.containsPawnOnStartingRow()) movesDown += 1; validMoves.addAll(validMovesForSquareInDirection(square, movesDown, 0, 0, 1, 0)); } // Attacking move int rowColPairs[][] = {{-1, -1}, {-1, 1}}; for (int i = 0; i < rowColPairs.length; i++) { int row = square.Row + rowColPairs[i][0]; int col = square.Col + rowColPairs[i][1]; if (rowAndColAreWithinBounds(row, col)) { Square s = Board[row][col]; if (s.isOccupiedByPieceOfColor(square.getPiece().oppositeColor())) validMoves.add(s); } } return validMoves; }
private List<Square> validMovesForPieceOnSquareExCheck(Square square) { Piece piece = square.getPiece(); List<Square> validMoves = new ArrayList<Square>(); // Special moves the piece is a pawn or a knight if (piece.canMoveLikePawn()) return validMovesForPawn(square); if (piece.canMoveLikeKnight()) return validMovesForKnight(square); // Add all normal directional moves validMoves.addAll(validMovesForSquareInDirection(square, piece.movesUp(), 1, 0, 0, 0)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesSide(), 0, 1, 0, 0)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesDown(), 0, 0, 1, 0)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesSide(), 0, 0, 0, 1)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesDiagonal(), 1, 1, 0, 0)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesDiagonal(), 1, 0, 0, 1)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesDiagonal(), 0, 1, 1, 0)); validMoves.addAll(validMovesForSquareInDirection(square, piece.movesDiagonal(), 0, 0, 1, 1)); return validMoves; }