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;

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

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

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

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

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

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

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

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

  return possibleMoves;
}