getPossibleMovesFromSquareOnBoard method

  1. @override
List<Move> getPossibleMovesFromSquareOnBoard(
  1. Square square,
  2. Board board
)
override

Returns the list of possible moves with this piece from square, including moves that are illegal in current position.

Implementation

@override
List<Move> getPossibleMovesFromSquareOnBoard(
  Square square,
  Board board,
) {
  final List<Move> possibleMoves = <Move>[];

  if (isWhite) {
    int offset = 1;

    // N
    while (square.row + offset < Board.size &&
        board.at(square.row + offset, square.col) == null) {
      possibleMoves
          .add(Move(square, Square(square.row + offset, square.col)));
      offset++;
    }
    if (square.row + offset < Board.size &&
        (board.at(square.row + offset, square.col)?.isBlack ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row + offset, square.col)));
    }

    // E
    offset = 1;
    while (square.col + offset < Board.size &&
        board.at(square.row, square.col + offset) == null) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col + offset)));
      offset++;
    }
    if (square.col + offset < Board.size &&
        (board.at(square.row, square.col + offset)?.isBlack ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col + offset)));
    }

    // S
    offset = 1;
    while (square.row - offset >= 0 &&
        board.at(square.row - offset, square.col) == null) {
      possibleMoves
          .add(Move(square, Square(square.row - offset, square.col)));
      offset++;
    }
    if (square.row - offset >= 0 &&
        (board.at(square.row - offset, square.col)?.isBlack ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row - offset, square.col)));
    }

    // W
    offset = 1;
    while (square.col - offset >= 0 &&
        board.at(square.row, square.col - offset) == null) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col - offset)));
      offset++;
    }
    if (square.col - offset >= 0 &&
        (board.at(square.row, square.col - offset)?.isBlack ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col - offset)));
    }
  } else {
    int offset = 1;

    // N
    while (square.row + offset < Board.size &&
        board.at(square.row + offset, square.col) == null) {
      possibleMoves
          .add(Move(square, Square(square.row + offset, square.col)));
      offset++;
    }
    if (square.row + offset < Board.size &&
        (board.at(square.row + offset, square.col)?.isWhite ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row + offset, square.col)));
    }

    // E
    offset = 1;
    while (square.col + offset < Board.size &&
        board.at(square.row, square.col + offset) == null) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col + offset)));
      offset++;
    }
    if (square.col + offset < Board.size &&
        (board.at(square.row, square.col + offset)?.isWhite ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col + offset)));
    }

    // S
    offset = 1;
    while (square.row - offset >= 0 &&
        board.at(square.row - offset, square.col) == null) {
      possibleMoves
          .add(Move(square, Square(square.row - offset, square.col)));
      offset++;
    }
    if (square.row - offset >= 0 &&
        (board.at(square.row - offset, square.col)?.isWhite ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row - offset, square.col)));
    }

    // W
    offset = 1;
    while (square.col - offset >= 0 &&
        board.at(square.row, square.col - offset) == null) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col - offset)));
      offset++;
    }
    if (square.col - offset >= 0 &&
        (board.at(square.row, square.col - offset)?.isWhite ?? false)) {
      possibleMoves
          .add(Move(square, Square(square.row, square.col - offset)));
    }
  }

  return possibleMoves;
}