public override bool canMove(int x1, int y1, int x2, int y2, int Player) { if (canMoveAux(x1, y1, x2, y2, Player)) { Piece eaten_piece = BOARD.getPiece(x2, y2); Board BOARD_BACKUP = BOARD.backup(); if (canMoveAux(x1, y1, x2, y2, Player)) { if ((y1 != y2) && eaten_piece.getClass2() == NullPiece.getClass() && ((ChessPiece)BOARD.getPiece(x1, y1)).get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase)) { eaten_piece = BOARD.getPiece(x1, y2); BOARD.removePiece(x1, y2); } BOARD.movePiece(x1, y1, x2, y2); if (inCheck(Player)) { BOARD = BOARD_BACKUP; return(false); } else { BOARD = BOARD_BACKUP; return(true); } } BOARD = BOARD_BACKUP; } return(false); }
public bool canMoveAux(int x1, int y1, int x2, int y2, int Player) { if (GAME_ENDED || WAITING_PLAYERS) { return(false); } if (Player != ACTUAL_PLAYER) { return(false); } if (!BOARD.validCell(x1, y1) || !BOARD.validCell(x2, y2)) { return(false); } if (BOARD.getPiece(x1, y1).getClass2() == NullPiece.getClass()) { return(false); } bool null_destination = true; if (BOARD.getPiece(x2, y2).getClass2() != NullPiece.getClass()) { null_destination = false; if (((ChessPiece)BOARD.getPiece(x2, y2)).PLAYER == Player) { return(false); } } ChessPiece P1 = (ChessPiece)BOARD.getPiece(x1, y1); if (P1.getPlayer() != Player) { Console.WriteLine("The piece belong to the other player: " + P1.getPlayer() + ", you are " + Player); return(false); } if (P1.get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase)) { if (Player == PLAYER1) { if ((x2 - x1 == -1) && (y2 == y1) && (null_destination)) { return(true); } else if ((x2 - x1 == -2) && (y2 == y1) && (x1 == 6) && (null_destination)) { return(true); } else if ((x2 - x1 == -1) && Math.Abs(y2 - y1) == 1) { if (!(null_destination)) { return(true); } else if (BOARD.getPiece(x1, y2).getClass2() != NullPiece.getClass()) { if (((ChessPiece)BOARD.getPiece(x1, y2)).PLAYER != Player && ((ChessPiece)BOARD.getPiece(x1, y2)).get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase)) { if ((LAST_ACTION.getClass2() == MoveAction.getClass())) { if (((MoveAction)LAST_ACTION).TO_X == x1 && ((MoveAction)LAST_ACTION).TO_Y == y2 && ((ChessPiece)((MoveAction)LAST_ACTION).ACTOR).get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase) && ((MoveAction)LAST_ACTION).FROM_X == x1 - 2) { return(true); } } } } } } else if (Player == PLAYER2) { if ((x2 - x1 == 1) && (y2 == y1) && (null_destination)) { return(true); } else if ((x2 - x1 == 2) && (y2 == y1) && (x1 == 1) && (null_destination)) { return(true); } else if ((x2 - x1 == 1) && Math.Abs(y2 - y1) == 1) { if (!(null_destination)) { return(true); } else if (BOARD.getPiece(x1, y2).getClass2() != NullPiece.getClass()) { if (((ChessPiece)BOARD.getPiece(x1, y2)).PLAYER != Player && ((ChessPiece)BOARD.getPiece(x1, y2)).get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase)) { if ((LAST_ACTION.getClass2() == MoveAction.getClass())) { if (((MoveAction)LAST_ACTION).TO_X == x1 && ((MoveAction)LAST_ACTION).TO_Y == y2 && ((ChessPiece)((MoveAction)LAST_ACTION).ACTOR).get_type().Equals(ChessPiece.PAWN, StringComparison.CurrentCultureIgnoreCase) && ((MoveAction)LAST_ACTION).FROM_X == x1 + 2) { return(true); } } } } } } } else if (P1.get_type().Equals(ChessPiece.KNIGHT, StringComparison.CurrentCultureIgnoreCase)) { if (((Math.Abs(x2 - x1) == 1) && (Math.Abs(y2 - y1) == 2)) || ((Math.Abs(x2 - x1) == 2) && (Math.Abs(y2 - y1) == 1))) { return(true); } } else if (P1.get_type().Equals(ChessPiece.BISHOP, StringComparison.CurrentCultureIgnoreCase)) { if (Math.Abs(x2 - x1) == Math.Abs(y2 - y1) && y2 != y1) { if (!thereIsSomeoneInTheWay(x1, y1, x2, y2)) { return(true); } } } else if (P1.get_type().Equals(ChessPiece.ROOK, StringComparison.CurrentCultureIgnoreCase)) { if ((x2 - x1 == 0 && Math.Abs(y2 - y1) > 0) || (y2 - y1 == 0 && Math.Abs(x2 - x1) > 0)) { if (!thereIsSomeoneInTheWay(x1, y1, x2, y2)) { return(true); } } } else if (P1.get_type().Equals(ChessPiece.QUEEN, StringComparison.CurrentCultureIgnoreCase)) { if ((x2 - x1 == 0 && Math.Abs(y2 - y1) > 0) || (y2 - y1 == 0 && Math.Abs(x2 - x1) > 0)) { if (!thereIsSomeoneInTheWay(x1, y1, x2, y2)) { return(true); } } else if (Math.Abs(x2 - x1) == Math.Abs(y2 - y1) && y2 != y1) { if (!thereIsSomeoneInTheWay(x1, y1, x2, y2)) { return(true); } } } else if (P1.get_type().Equals(ChessPiece.KING, StringComparison.CurrentCultureIgnoreCase)) { if ((Math.Abs(y2 - y1) <= 1) && (Math.Abs(x2 - x1) <= 1) && (Math.Abs(y2 - y1) + Math.Abs(x2 - x1) >= 1)) { return(true); } else { if (Player == PLAYER1) { if (KING_PLAYER1_MOVED == false) { if (x1 == 7 && y1 == 4 && x2 == 7 && y2 == 6) { if (RIGHT_ROOK_PLAYER1_MOVED == false && BOARD.getPiece(7, 5).getClass2() == NullPiece.getClass() && BOARD.getPiece(7, 6).getClass2() == NullPiece.getClass()) { if (BOARD.getPiece(x1, 7).getClass2().Equals(ChessPiece.getClass())) { if (((ChessPiece)BOARD.getPiece(x1, 7)).PLAYER == Player && ((ChessPiece)BOARD.getPiece(x1, 7)).get_type().Equals(ChessPiece.ROOK, StringComparison.CurrentCultureIgnoreCase)) { Board BACK_BOARD = BOARD.backup(); if (canMove(x1, y1, x2, 5, Player)) { BOARD.movePiece(x1, y1, x2, y2); BOARD.movePiece(x1, y1, x2, 5); bool CanCastling = !(inCheck(Player)); BOARD = BACK_BOARD; Console.WriteLine("Can roque!"); return(CanCastling); } } } } } else if (x1 == 7 && y1 == 4 && x2 == 7 && y2 == 2) { if (LEFT_ROOK_PLAYER1_MOVED == false && BOARD.getPiece(7, 1).getClass2() == NullPiece.getClass() && BOARD.getPiece(7, 2).getClass2() == NullPiece.getClass() && BOARD.getPiece(7, 3).getClass2() == NullPiece.getClass()) { if (BOARD.getPiece(x1, 0).getClass2().Equals(ChessPiece.getClass())) { if (((ChessPiece)BOARD.getPiece(x1, 0)).PLAYER == Player && ((ChessPiece)BOARD.getPiece(x1, 7)).get_type().Equals(ChessPiece.ROOK, StringComparison.CurrentCultureIgnoreCase)) { Board BACK_BOARD = BOARD.backup(); if (canMove(x1, y1, x2, 3, Player)) { BOARD.movePiece(x1, y1, x2, y2); BOARD.movePiece(x1, y1, x2, 3); bool CanCastling = !(inCheck(Player)); BOARD = BACK_BOARD; Console.WriteLine("Can roque!"); return(CanCastling); } } } } } } } if (Player == PLAYER2) { if (KING_PLAYER2_MOVED == false) { if (x1 == 0 && y1 == 4 && x2 == 0 && y2 == 6) { if (RIGHT_ROOK_PLAYER2_MOVED == false && BOARD.getPiece(0, 5).getClass2() == NullPiece.getClass() && BOARD.getPiece(0, 6).getClass2() == NullPiece.getClass()) { if (BOARD.getPiece(x1, 0).getClass2().Equals(ChessPiece.getClass())) { if (((ChessPiece)BOARD.getPiece(x1, 0)).PLAYER == Player && ((ChessPiece)BOARD.getPiece(x1, 0)).get_type().Equals(ChessPiece.ROOK, StringComparison.CurrentCultureIgnoreCase)) { Board BACK_BOARD = BOARD.backup(); if (canMove(x1, y1, x2, 5, Player)) { BOARD.movePiece(x1, y1, x2, y2); BOARD.movePiece(x1, y1, x2, 5); bool CanCastling = !(inCheck(Player)); BOARD = BACK_BOARD; Console.WriteLine("Can roque!"); return(CanCastling); } } } } } else if (x1 == 0 && y1 == 4 && x2 == 0 && y2 == 2) { if (LEFT_ROOK_PLAYER1_MOVED == false && BOARD.getPiece(0, 1).getClass2() == NullPiece.getClass() && BOARD.getPiece(0, 2).getClass2() == NullPiece.getClass() && BOARD.getPiece(0, 3).getClass2() == NullPiece.getClass()) { if (BOARD.getPiece(x1, 0).getClass2().Equals(ChessPiece.getClass())) { if (((ChessPiece)BOARD.getPiece(x1, 0)).PLAYER == Player && ((ChessPiece)BOARD.getPiece(x1, 0)).get_type().Equals(ChessPiece.ROOK, StringComparison.CurrentCultureIgnoreCase)) { Board BACK_BOARD = BOARD.backup(); if (canMove(x1, y1, x2, 3, Player)) { BOARD.movePiece(x1, y1, x2, y2); BOARD.movePiece(x1, y1, x2, 3); bool CanCastling = !(inCheck(Player)); BOARD = BACK_BOARD; Console.WriteLine("Can roque!"); return(CanCastling); } } } } } } } } } return(false); }