@Override
  public Set<Move> getPossibleMoves(State state) {
    ArrayList<Move> temp = new ArrayList<Move>();
    Set<Move> result = new HashSet<Move>();
    temp = possibleMovePosition(state.getTurn(), state);
    if (state.getGameResult() != null) return result;

    for (int i = 0; i < temp.size(); i++) {
      result.add(temp.get(i));
    }

    return result;
  }
  private void addPossiKnightMove(
      Color knightcolor, Position position, State temp_result, ArrayList<Move> temp_position) {
    int row = position.getRow();
    int col = position.getCol();

    Position kingPosition = null;
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        if (temp_result.getPiece(i, j) != null) {
          if (temp_result.getPiece(i, j).equals(new Piece(knightcolor, KING))) {
            kingPosition = new Position(i, j);
            break;
          }
        }
      }
    }
    Position[] possiKnightPosition =
        new Position[] {
          new Position(row + 2, col + 1), new Position(row + 1, col + 2),
          new Position(row - 2, col - 1), new Position(row - 1, col - 2),
          new Position(row + 2, col - 1), new Position(row - 2, col + 1),
          new Position(row - 1, col + 2), new Position(row + 1, col - 2)
        };

    for (int l = 0; l < possiKnightPosition.length; l++) {

      int i = possiKnightPosition[l].getRow();
      int j = possiKnightPosition[l].getCol();

      if ((i < 0) || (i > 7) || (j < 0) || (j > 7)) {
        continue;
      } else {
        if ((temp_result.getPiece(possiKnightPosition[l]) == null)
            || ((temp_result.getPiece(possiKnightPosition[l]) != null)
                && (temp_result
                    .getPiece(possiKnightPosition[l])
                    .getColor()
                    .equals(knightcolor.getOpposite())))) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(possiKnightPosition[l], temp_result.getPiece(position));
          if (!isUnderCheck(knightcolor, temp, kingPosition)) {
            temp_position.add(new Move(position, possiKnightPosition[l], null));
          }
        }
      }
    }
  }
  private ArrayList<Move> possibleMovePosition(Color opposite, State temp_result) {

    ArrayList<Move> temp_position = new ArrayList<Move>();
    // for each square find piece
    for (int i = 0; i <= 7; i++) {
      for (int j = 0; j <= 7; j++) {
        Piece piece_check = temp_result.getPiece(new Position(i, j));
        if (piece_check != null) {
          if (piece_check.getColor().equals(opposite)) {
            PieceKind pk = piece_check.getKind();
            if (pk.equals(PAWN)) {
              addPossiPawnMove(opposite, new Position(i, j), temp_result, temp_position);
            }
            if (pk.equals(KNIGHT)) {
              addPossiKnightMove(opposite, new Position(i, j), temp_result, temp_position);
            }
            if (pk.equals(QUEEN)) {
              addPossiQueenMove(opposite, new Position(i, j), temp_result, temp_position);
            }
            if (pk.equals(ROOK)) {
              addPossiRookMove(opposite, new Position(i, j), temp_result, temp_position);
            }
            if (pk.equals(BISHOP)) {
              addPossiBishopMove(opposite, new Position(i, j), temp_result, temp_position);
            }
            if (pk.equals(KING)) {
              addPossiKingMove(opposite, new Position(i, j), temp_result, temp_position);
            }
          }
        }
      }
    }
    return temp_position;
  }
 @Override
 public Set<Position> getPossibleStartPositions(State state) {
   Color color = state.getTurn();
   Set<Position> result = new HashSet<Position>();
   if (state.getGameResult() != null) return result;
   for (int i = 0; i <= 7; i++) {
     for (int j = 0; j <= 7; j++) {
       Piece piece = state.getPiece(i, j);
       if ((piece != null) && (piece.getColor().equals(color))) {
         PieceKind pk = piece.getKind();
         if (pk.equals(PAWN)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiPawnMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
         if (pk.equals(KNIGHT)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiKnightMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
         if (pk.equals(QUEEN)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiQueenMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
         if (pk.equals(ROOK)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiRookMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
         if (pk.equals(BISHOP)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiBishopMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
         if (pk.equals(KING)) {
           ArrayList<Move> temp = new ArrayList<Move>();
           addPossiKingMove(color, new Position(i, j), state, temp);
           if (temp.size() > 0) result.add(new Position(i, j));
         }
       }
     }
   }
   return result;
 }
  @Override
  public Set<Move> getPossibleMovesFromPosition(State state, Position start) {
    ArrayList<Move> temp = new ArrayList<Move>();
    Set<Move> result = new HashSet<Move>();
    if (state.getGameResult() != null) return result;
    Piece piece = state.getPiece(start);
    if (piece != null) {
      PieceKind piecekind = piece.getKind();
      Color color = piece.getColor();

      switch (piecekind) {
        case PAWN:
          addPossiPawnMove(color, start, state, temp);
          break;
        case KNIGHT:
          addPossiKnightMove(color, start, state, temp);
          break;
        case QUEEN:
          addPossiQueenMove(color, start, state, temp);
          break;
        case ROOK:
          addPossiRookMove(color, start, state, temp);
          break;
        case BISHOP:
          addPossiBishopMove(color, start, state, temp);
          break;
        case KING:
          addPossiKingMove(color, start, state, temp);
          break;
      }
      for (int i = 0; i < temp.size(); i++) {
        result.add(temp.get(i));
      }

      return result;

    } else return result;
  }
  private boolean isUnderCheck(Color temp_color, State temp_result, Position kingPosition) {

    int kingRow = kingPosition.getRow();
    int kingCol = kingPosition.getCol();
    // check up
    if (kingRow < 7) {
      for (int i = kingRow + 1; i <= 7; i++) {
        Piece temp_piece = temp_result.getPiece(i, kingCol);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == ROOK)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
      }
    }
    // check down
    if (kingRow > 0) {
      for (int i = kingRow - 1; i >= 0; i--) {
        Piece temp_piece = temp_result.getPiece(i, kingCol);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == ROOK)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
      }
    }
    // check left
    if (kingCol > 0) {
      for (int j = kingCol - 1; j >= 0; j--) {
        Piece temp_piece = temp_result.getPiece(kingRow, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == ROOK)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
      }
    }
    // check right
    if (kingCol < 7) {
      for (int j = kingCol + 1; j <= 7; j++) {
        Piece temp_piece = temp_result.getPiece(kingRow, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == ROOK)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
      }
    }
    // check up-left
    if ((kingRow < 7) && (kingCol > 0)) {
      int i = kingRow + 1;
      int j = kingCol - 1;
      while ((i <= 7) && (j >= 0)) {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == BISHOP)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }

        i++;
        j--;
      }
    }
    // check up-right
    if ((kingRow < 7) && (kingCol < 7)) {
      int i = kingRow + 1;
      int j = kingCol + 1;
      while ((i <= 7) && (j <= 7)) {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == BISHOP)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
        i++;
        j++;
      }
    }
    // check down-left
    if ((kingRow > 0) && (kingCol > 0)) {
      int i = kingRow - 1;
      int j = kingCol - 1;
      while ((i >= 0) && (j >= 0)) {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == BISHOP)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }
        i--;
        j--;
      }
    }
    // check down-right
    if ((kingRow > 0) && (kingCol < 7)) {
      int i = kingRow - 1;
      int j = kingCol + 1;
      while ((i >= 0) && (j <= 7)) {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if ((temp_piece.getKind() == QUEEN) || (temp_piece.getKind() == BISHOP)) {
              return true;
            } else {
              break;
            }
          } else if (temp_piece.getColor() == temp_color) {
            break;
          }
        }

        i--;
        j++;
      }
    }

    // check knight position
    Position[] possiKnightPosition =
        new Position[] {
          new Position(kingRow + 2, kingCol + 1),
          new Position(kingRow + 1, kingCol + 2),
          new Position(kingRow - 2, kingCol - 1),
          new Position(kingRow - 1, kingCol - 2),
          new Position(kingRow + 2, kingCol - 1),
          new Position(kingRow - 2, kingCol + 1),
          new Position(kingRow - 1, kingCol + 2),
          new Position(kingRow + 1, kingCol - 2)
        };
    for (int l = 0; l < possiKnightPosition.length; l++) {
      int i = possiKnightPosition[l].getRow();
      int j = possiKnightPosition[l].getCol();
      if ((i < 0) || (i > 7) || (j < 0) || (j > 7)) {
        continue;
      } else {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if (temp_piece.getKind() == KNIGHT) {
              return true;
            } else {
              continue;
            }
          } else if (temp_piece.getColor() == temp_color) {
            continue;
          }
        }
      }
    }

    // check pawn position
    if (temp_color == WHITE) {
      if (kingRow < 7) {
        if (kingCol > 0) {
          Piece temp_piece1 = temp_result.getPiece(kingRow + 1, kingCol - 1);
          if (temp_piece1 != null) {
            if (temp_piece1.getColor() == temp_color.getOpposite()) {
              if (temp_piece1.getKind() == PAWN) {
                return true;
              }
            }
          }
        }
        if (kingCol < 7) {
          Piece temp_piece2 = temp_result.getPiece(kingRow + 1, kingCol + 1);
          if (temp_piece2 != null) {
            if (temp_piece2.getColor() == temp_color.getOpposite()) {
              if (temp_piece2.getKind() == PAWN) {
                return true;
              }
            }
          }
        }
      }
    } else if (temp_color == BLACK) {
      if (kingRow > 0) {
        if (kingCol > 0) {
          Piece temp_piece1 = temp_result.getPiece(kingRow - 1, kingCol - 1);
          if (temp_piece1 != null) {
            if (temp_piece1.getColor() == temp_color.getOpposite()) {
              if (temp_piece1.getKind() == PAWN) {
                return true;
              }
            }
          }
        }

        if (kingCol < 7) {
          Piece temp_piece2 = temp_result.getPiece(kingRow - 1, kingCol + 1);
          if (temp_piece2 != null) {
            if (temp_piece2.getColor() == temp_color.getOpposite()) {
              if (temp_piece2.getKind() == PAWN) {
                return true;
              }
            }
          }
        }
      }
    }
    // check king position
    Position[] possiKingPosition =
        new Position[] {
          new Position(kingRow + 1, kingCol),
          new Position(kingRow - 1, kingCol),
          new Position(kingRow, kingCol + 1),
          new Position(kingRow, kingCol - 1),
          new Position(kingRow + 1, kingCol + 1),
          new Position(kingRow - 1, kingCol - 1),
          new Position(kingRow - 1, kingCol + 1),
          new Position(kingRow + 1, kingCol - 1)
        };
    for (int l = 0; l < possiKingPosition.length; l++) {
      int i = possiKingPosition[l].getRow();
      int j = possiKingPosition[l].getCol();
      if ((i < 0) || (i > 7) || (j < 0) || (j > 7)) {
        continue;
      } else {
        Piece temp_piece = temp_result.getPiece(i, j);
        if (temp_piece != null) {
          if (temp_piece.getColor() == temp_color.getOpposite()) {
            if (temp_piece.getKind() == KING) {
              return true;
            } else {
              continue;
            }
          } else if (temp_piece.getColor() == temp_color) {
            continue;
          }
        }
      }
    }

    return false;
  }
  private void addPossiPawnMove(
      Color pawncolor, Position position, State temp_result, ArrayList<Move> temp_position) {
    int row = position.getRow();
    int col = position.getCol();
    Position kingPosition = null;
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        if (temp_result.getPiece(i, j) != null) {
          if (temp_result.getPiece(i, j).equals(new Piece(pawncolor, KING))) {
            kingPosition = new Position(i, j);
            break;
          }
        }
      }
    }
    if (pawncolor == WHITE) {
      if (row < 7) {
        if (row == 1) {
          if ((temp_result.getPiece(row + 2, col) == null)
              && (temp_result.getPiece(row + 1, col) == null)) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row + 2, col, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row + 2, col), null));
            }
          }
        }
        if (temp_result.getPiece(row + 1, col) == null) {
          State temp = temp_result.copy();
          temp.setPiece(row, col, null);
          temp.setPiece(row + 1, col, temp_result.getPiece(position));
          if (!isUnderCheck(pawncolor, temp, kingPosition)) {
            if ((row + 1) == 7) {
              temp_position.add(new Move(position, new Position(row + 1, col), QUEEN));
              temp_position.add(new Move(position, new Position(row + 1, col), BISHOP));
              temp_position.add(new Move(position, new Position(row + 1, col), KNIGHT));
              temp_position.add(new Move(position, new Position(row + 1, col), ROOK));
            } else temp_position.add(new Move(position, new Position(row + 1, col), null));
          }
        }

        if ((col < 7) && (temp_result.getPiece(row + 1, col + 1) != null)) {
          if (temp_result.getPiece(row + 1, col + 1).getColor().equals(pawncolor.getOpposite())) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row + 1, col + 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              if ((row + 1) == 7) {

                temp_position.add(new Move(position, new Position(row + 1, col + 1), QUEEN));
                temp_position.add(new Move(position, new Position(row + 1, col + 1), BISHOP));
                temp_position.add(new Move(position, new Position(row + 1, col + 1), KNIGHT));
                temp_position.add(new Move(position, new Position(row + 1, col + 1), ROOK));
              } else temp_position.add(new Move(position, new Position(row + 1, col + 1), null));
            }
          }
        } else if ((col < 7) && (temp_result.getPiece(row + 1, col + 1) == null)) {
          if ((temp_result.getEnpassantPosition() != null)
              && (temp_result.getEnpassantPosition().equals(new Position(row, col + 1)))) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(temp_result.getEnpassantPosition(), null);
            temp.setPiece(row + 1, col + 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row + 1, col + 1), null));
            }
          }
        }

        if ((col > 0) && (temp_result.getPiece(row + 1, col - 1) != null)) {
          if (temp_result.getPiece(row + 1, col - 1).getColor().equals(pawncolor.getOpposite())) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row + 1, col - 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              if ((row + 1) == 7) {
                temp_position.add(new Move(position, new Position(row + 1, col - 1), QUEEN));
                temp_position.add(new Move(position, new Position(row + 1, col - 1), BISHOP));
                temp_position.add(new Move(position, new Position(row + 1, col - 1), KNIGHT));
                temp_position.add(new Move(position, new Position(row + 1, col - 1), ROOK));
              } else temp_position.add(new Move(position, new Position(row + 1, col - 1), null));
            }
          }
        } else if ((col > 0) && (temp_result.getPiece(row + 1, col - 1) == null)) {
          if ((temp_result.getEnpassantPosition() != null)
              && (temp_result.getEnpassantPosition().equals(new Position(row, col - 1)))) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(temp_result.getEnpassantPosition(), null);
            temp.setPiece(row + 1, col - 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row + 1, col - 1), null));
            }
          }
        }
      }

    }
    // black
    else {
      if (row > 0) {
        if (row == 6) {
          if ((temp_result.getPiece(row - 2, col) == null)
              && (temp_result.getPiece(row - 1, col) == null)) {

            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row - 2, col, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row - 2, col), null));
            }
          }
        }
        if (temp_result.getPiece(row - 1, col) == null) {
          State temp = temp_result.copy();
          temp.setPiece(row, col, null);
          temp.setPiece(row - 1, col, temp_result.getPiece(position));
          if (!isUnderCheck(pawncolor, temp, kingPosition)) {
            if ((row - 1) == 0) {
              temp_position.add(new Move(position, new Position(row - 1, col), QUEEN));
              temp_position.add(new Move(position, new Position(row - 1, col), BISHOP));
              temp_position.add(new Move(position, new Position(row - 1, col), KNIGHT));
              temp_position.add(new Move(position, new Position(row - 1, col), ROOK));
            } else temp_position.add(new Move(position, new Position(row - 1, col), null));
          }
        }

        if ((col < 7) && (temp_result.getPiece(row - 1, col + 1) != null)) {
          if (temp_result.getPiece(row - 1, col + 1).getColor().equals(pawncolor.getOpposite())) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row - 1, col + 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              if ((row - 1) == 0) {
                temp_position.add(new Move(position, new Position(row - 1, col + 1), QUEEN));
                temp_position.add(new Move(position, new Position(row - 1, col + 1), BISHOP));
                temp_position.add(new Move(position, new Position(row - 1, col + 1), KNIGHT));
                temp_position.add(new Move(position, new Position(row - 1, col + 1), ROOK));
              } else temp_position.add(new Move(position, new Position(row - 1, col + 1), null));
            }
          }
        } else if ((col < 7) && (temp_result.getPiece(row - 1, col + 1) == null)) {
          if ((temp_result.getEnpassantPosition() != null)
              && (temp_result.getEnpassantPosition().equals(new Position(row, col + 1)))) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(temp_result.getEnpassantPosition(), null);
            temp.setPiece(row - 1, col + 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row - 1, col + 1), null));
            }
          }
        }

        if ((col > 0) && (temp_result.getPiece(row - 1, col - 1) != null)) {
          if (temp_result.getPiece(row - 1, col - 1).getColor().equals(pawncolor.getOpposite())) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(row - 1, col - 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {

              if ((row - 1) == 0) {
                temp_position.add(new Move(position, new Position(row - 1, col - 1), QUEEN));
                temp_position.add(new Move(position, new Position(row - 1, col - 1), BISHOP));
                temp_position.add(new Move(position, new Position(row - 1, col - 1), KNIGHT));
                temp_position.add(new Move(position, new Position(row - 1, col - 1), ROOK));
              } else temp_position.add(new Move(position, new Position(row - 1, col - 1), null));
            }
          }
        } else if ((col > 0) && (temp_result.getPiece(row - 1, col - 1) == null)) {
          if ((temp_result.getEnpassantPosition() != null)
              && (temp_result.getEnpassantPosition().equals(new Position(row, col - 1)))) {
            State temp = temp_result.copy();
            temp.setPiece(row, col, null);
            temp.setPiece(temp_result.getEnpassantPosition(), null);
            temp.setPiece(row - 1, col - 1, temp_result.getPiece(position));
            if (!isUnderCheck(pawncolor, temp, kingPosition)) {
              temp_position.add(new Move(position, new Position(row - 1, col - 1), null));
            }
          }
        }
      }
    }
  }
  private void addPossiQueenMove(
      Color queencolor, Position position, State temp_result, ArrayList<Move> temp_position) {
    int row = position.getRow();
    int col = position.getCol();
    Position kingPosition = null;
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        if (temp_result.getPiece(i, j) != null) {
          if (temp_result.getPiece(i, j).equals(new Piece(queencolor, KING))) {
            kingPosition = new Position(i, j);
            break;
          }
        }
      }
    }
    // check up
    int i1 = row + 1;
    while ((i1 <= 7) && (temp_result.getPiece(i1, col) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i1, col), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i1, col), null));
      }
      i1++;
    }
    if (i1 <= 7) {
      if (temp_result.getPiece(i1, col).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i1, col), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i1, col), null));
        }
      }
    }
    // check down
    int i2 = row - 1;
    while ((i2 >= 0) && (temp_result.getPiece(i2, col) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i2, col), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i2, col), null));
      }
      i2--;
    }
    if (i2 >= 0) {
      if (temp_result.getPiece(i2, col).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i2, col), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i2, col), null));
        }
      }
    }

    // check up-left
    int i3 = row + 1;
    int j3 = col - 1;
    while ((i3 <= 7) && (j3 >= 0) && (temp_result.getPiece(i3, j3) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i3, j3), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i3, j3), null));
      }
      i3++;
      j3--;
    }
    if ((i3 <= 7) && (j3 >= 0)) {
      if (temp_result.getPiece(i3, j3).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i3, j3), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i3, j3), null));
        }
      }
    }
    // check down-left
    int i4 = row - 1;
    int j4 = col - 1;
    while ((i4 >= 0) && (j4 >= 0) && (temp_result.getPiece(i4, j4) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i4, j4), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i4, j4), null));
      }
      i4--;
      j4--;
    }
    if ((i4 >= 0) && (j4 >= 0)) {
      if (temp_result.getPiece(i4, j4).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i4, j4), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i4, j4), null));
        }
      }
    }
    // check left
    int j5 = col - 1;
    while ((j5 >= 0) && (temp_result.getPiece(row, j5) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(row, j5), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(row, j5), null));
      }
      j5--;
    }
    if (j5 >= 0) {
      if (temp_result.getPiece(row, j5).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(row, j5), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(row, j5), null));
        }
      }
    }
    // check right
    int j6 = col + 1;
    while ((j6 <= 7) && (temp_result.getPiece(row, j6) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(row, j6), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(row, j6), null));
      }
      j6++;
    }
    if (j6 <= 7) {
      if (temp_result.getPiece(row, j6).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(row, j6), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(row, j6), null));
        }
      }
    }
    // check up-right
    int i7 = row + 1;
    int j7 = col + 1;
    while ((i7 <= 7) && (j7 <= 7) && (temp_result.getPiece(i7, j7) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i7, j7), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i7, j7), null));
      }
      i7++;
      j7++;
    }
    if ((i7 <= 7) && (j7 <= 7)) {
      if (temp_result.getPiece(i7, j7).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i7, j7), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i7, j7), null));
        }
      }
    }
    // check down-right
    int i8 = row - 1;
    int j8 = col + 1;
    while ((i8 >= 0) && (j8 <= 7) && (temp_result.getPiece(i8, j8) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i8, j8), temp_result.getPiece(position));
      if (!isUnderCheck(queencolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i8, j8), null));
      }
      i8--;
      j8++;
    }
    if ((i8 >= 0) && (j8 <= 7)) {
      if (temp_result.getPiece(i8, j8).getColor().equals(queencolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i8, j8), temp_result.getPiece(position));
        if (!isUnderCheck(queencolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i8, j8), null));
        }
      }
    }
  }
  private void addPossiRookMove(
      Color rookcolor, Position position, State temp_result, ArrayList<Move> temp_position) {
    int row = position.getRow();
    int col = position.getCol();
    Position kingPosition = null;
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        if (temp_result.getPiece(i, j) != null) {
          if (temp_result.getPiece(i, j).equals(new Piece(rookcolor, KING))) {
            kingPosition = new Position(i, j);
            break;
          }
        }
      }
    }
    // check up
    int i1 = row + 1;
    while ((i1 <= 7) && (temp_result.getPiece(i1, col) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i1, col), temp_result.getPiece(position));
      if (!isUnderCheck(rookcolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i1, col), null));
      }
      i1++;
    }
    if (i1 <= 7) {
      if (temp_result.getPiece(i1, col).getColor().equals(rookcolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i1, col), temp_result.getPiece(position));
        if (!isUnderCheck(rookcolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i1, col), null));
        }
      }
    }
    // check down
    int i2 = row - 1;
    while ((i2 >= 0) && (temp_result.getPiece(i2, col) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(i2, col), temp_result.getPiece(position));
      if (!isUnderCheck(rookcolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(i2, col), null));
      }
      i2--;
    }
    if (i2 >= 0) {
      if (temp_result.getPiece(i2, col).getColor().equals(rookcolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(i2, col), temp_result.getPiece(position));
        if (!isUnderCheck(rookcolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(i2, col), null));
        }
      }
    }

    // check left
    int j5 = col - 1;
    while ((j5 >= 0) && (temp_result.getPiece(row, j5) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(row, j5), temp_result.getPiece(position));
      if (!isUnderCheck(rookcolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(row, j5), null));
      }
      j5--;
    }
    if (j5 >= 0) {
      if (temp_result.getPiece(row, j5).getColor().equals(rookcolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(row, j5), temp_result.getPiece(position));
        if (!isUnderCheck(rookcolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(row, j5), null));
        }
      }
    }
    // check right
    int j6 = col + 1;
    while ((j6 <= 7) && (temp_result.getPiece(row, j6) == null)) {
      State temp = temp_result.copy();
      temp.setPiece(position, null);
      temp.setPiece(new Position(row, j6), temp_result.getPiece(position));
      if (!isUnderCheck(rookcolor, temp, kingPosition)) {
        temp_position.add(new Move(position, new Position(row, j6), null));
      }
      j6++;
    }
    if (j6 <= 7) {
      if (temp_result.getPiece(row, j6).getColor().equals(rookcolor.getOpposite())) {
        State temp = temp_result.copy();
        temp.setPiece(position, null);
        temp.setPiece(new Position(row, j6), temp_result.getPiece(position));
        if (!isUnderCheck(rookcolor, temp, kingPosition)) {
          temp_position.add(new Move(position, new Position(row, j6), null));
        }
      }
    }
  }
示例#10
0
  private void addPossiKingMove(
      Color kingcolor, Position position, State temp_result, ArrayList<Move> temp_position) {

    int row = position.getRow();
    int col = position.getCol();
    Position[] possiKingPosition =
        new Position[] {
          new Position(row + 1, col), new Position(row - 1, col),
          new Position(row, col + 1), new Position(row, col - 1),
          new Position(row + 1, col + 1), new Position(row - 1, col - 1),
          new Position(row - 1, col + 1), new Position(row + 1, col - 1)
        };

    for (int l = 0; l < possiKingPosition.length; l++) {
      int i = possiKingPosition[l].getRow();
      int j = possiKingPosition[l].getCol();

      if ((i < 0) || (i > 7) || (j < 0) || (j > 7)) {
        continue;
      } else {
        if ((temp_result.getPiece(possiKingPosition[l]) == null)
            || ((temp_result.getPiece(possiKingPosition[l]) != null)
                && (temp_result
                    .getPiece(possiKingPosition[l])
                    .getColor()
                    .equals(kingcolor.getOpposite())))) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(possiKingPosition[l], temp_result.getPiece(position));
          if (!isUnderCheck(kingcolor, temp, possiKingPosition[l])) {
            temp_position.add(new Move(position, possiKingPosition[l], null));
          }
        }
      }
    }

    if ((kingcolor.equals(WHITE)) && (temp_result.isCanCastleKingSide(kingcolor))) {
      boolean isOccupied = false;
      Position[] positionNeedCheck = new Position[] {new Position(0, 5), new Position(0, 6)};
      for (int i = 0; i < positionNeedCheck.length; i++) {
        if (temp_result.getPiece(positionNeedCheck[i]) != null) {
          isOccupied = true;
          break;
        }
      }
      boolean isChecked = false;
      if (!isOccupied) {
        Position[] positionNeedCheck1 =
            new Position[] {new Position(0, 4), new Position(0, 5), new Position(0, 6)};
        for (int i = 0; i < positionNeedCheck1.length; i++) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(positionNeedCheck1[i], new Piece(kingcolor, KING));
          isChecked = isUnderCheck(kingcolor, temp, positionNeedCheck1[i]);
          if (isChecked) {
            break;
          }
        }
      }

      if ((!isOccupied) && (!isChecked)) {
        temp_position.add(new Move(position, new Position(0, 6), null));
      }
    }

    if ((kingcolor.equals(WHITE)) && (temp_result.isCanCastleQueenSide(kingcolor))) {
      boolean isOccupied = false;
      Position[] positionNeedCheck =
          new Position[] {new Position(0, 3), new Position(0, 2), new Position(0, 1)};
      for (int i = 0; i < positionNeedCheck.length; i++) {
        if (temp_result.getPiece(positionNeedCheck[i]) != null) {
          isOccupied = true;
          break;
        }
      }
      boolean isChecked = false;
      if (!isOccupied) {
        Position[] positionNeedCheck1 =
            new Position[] {new Position(0, 4), new Position(0, 3), new Position(0, 2)};
        for (int i = 0; i < positionNeedCheck1.length; i++) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(positionNeedCheck1[i], new Piece(kingcolor, KING));
          isChecked = isUnderCheck(kingcolor, temp, positionNeedCheck1[i]);
          if (isChecked) {
            break;
          }
        }
      }

      if ((!isOccupied) && (!isChecked)) {
        temp_position.add(new Move(position, new Position(0, 2), null));
      }
    }

    if ((kingcolor.equals(BLACK)) && (temp_result.isCanCastleKingSide(kingcolor))) {
      boolean isOccupied = false;
      Position[] positionNeedCheck = new Position[] {new Position(7, 5), new Position(7, 6)};
      for (int i = 0; i < positionNeedCheck.length; i++) {
        if (temp_result.getPiece(positionNeedCheck[i]) != null) {
          isOccupied = true;
          break;
        }
      }
      boolean isChecked = false;
      if (!isOccupied) {
        Position[] positionNeedCheck1 =
            new Position[] {new Position(7, 4), new Position(7, 5), new Position(7, 6)};
        for (int i = 0; i < positionNeedCheck1.length; i++) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(positionNeedCheck1[i], new Piece(kingcolor, KING));
          isChecked = isUnderCheck(kingcolor, temp, positionNeedCheck1[i]);
          if (isChecked) {
            break;
          }
        }
      }

      if ((!isOccupied) && (!isChecked)) {
        temp_position.add(new Move(position, new Position(7, 6), null));
      }
    }
    if ((kingcolor.equals(BLACK)) && (temp_result.isCanCastleQueenSide(kingcolor))) {
      boolean isOccupied = false;
      Position[] positionNeedCheck =
          new Position[] {new Position(7, 3), new Position(7, 2), new Position(7, 1)};
      for (int i = 0; i < positionNeedCheck.length; i++) {
        if (temp_result.getPiece(positionNeedCheck[i]) != null) {
          isOccupied = true;
          break;
        }
      }
      boolean isChecked = false;
      if (!isOccupied) {
        Position[] positionNeedCheck1 =
            new Position[] {new Position(7, 4), new Position(7, 3), new Position(7, 2)};
        for (int i = 0; i < positionNeedCheck1.length; i++) {
          State temp = temp_result.copy();
          temp.setPiece(position, null);
          temp.setPiece(positionNeedCheck1[i], new Piece(kingcolor, KING));
          isChecked = isUnderCheck(kingcolor, temp, positionNeedCheck1[i]);
          if (isChecked) {
            break;
          }
        }
      }

      if ((!isOccupied) && (!isChecked)) {
        temp_position.add(new Move(position, new Position(7, 2), null));
      }
    }
  }