package dev.kske.chess.board; import java.util.ArrayList; import java.util.List; /** * Project: Chess
* File: Queen.java
* Created: 01.07.2019
* * @since Chess v0.1-alpha * @author Kai S. K. Engelbart */ public class Queen extends Piece { public Queen(Color color, Board board) { super(color, board); } @Override public boolean isValidMove(Move move) { return ((move.isHorizontal() || move.isVertical()) || move.isDiagonal()) && isFreePath(move); } @Override protected List getPseudolegalMoves(Position pos) { List moves = new ArrayList<>(); // Horizontal moves to the right for (int i = pos.x + 1; i < 8; i++) { Move move = new Move(pos, new Position(i, pos.y)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Horizontal moves to the left for (int i = pos.x - 1; i >= 0; i--) { Move move = new Move(pos, new Position(i, pos.y)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Vertical moves to the top for (int i = pos.y - 1; i >= 0; i--) { Move move = new Move(pos, new Position(pos.x, i)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Vertical moves to the bottom for (int i = pos.y + 1; i < 8; i++) { Move move = new Move(pos, new Position(pos.x, i)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the lower right for (int i = pos.x + 1, j = pos.y + 1; i < 8 && j < 8; i++, j++) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the lower left for (int i = pos.x - 1, j = pos.y + 1; i >= 0 && j < 8; i--, j++) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the upper right for (int i = pos.x + 1, j = pos.y - 1; i < 8 && j >= 0; i++, j--) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the upper left for (int i = pos.x - 1, j = pos.y - 1; i >= 0 && j >= 0; i--, j--) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } return moves; } @Override public Type getType() { return Type.QUEEN; } }