public object GetResult(object setup, Operator op) { // Lo recibido es un puzle deslizante SlidingPuzzle puzzle = (SlidingPuzzle)setup; // Un puzle deslizante se puede clonar a nivel profundo SlidingPuzzle puzzleClone = puzzle.DeepClone(); if (SlidingPuzzleSolver.UP.Equals(op)) { if (puzzleClone.CanMoveUp(puzzleClone.GapPosition)) { puzzleClone.MoveUp(puzzleClone.GapPosition); } else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable { throw new InvalidOperationException("This operator is not working propertly"); } } if (SlidingPuzzleSolver.DOWN.Equals(op)) { if (puzzleClone.CanMoveDown(puzzleClone.GapPosition)) { puzzleClone.MoveDown(puzzleClone.GapPosition); } else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable { throw new InvalidOperationException("This operator is not working propertly"); } } if (SlidingPuzzleSolver.LEFT.Equals(op)) { if (puzzleClone.CanMoveLeft(puzzleClone.GapPosition)) { puzzleClone.MoveLeft(puzzleClone.GapPosition); } else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable { throw new InvalidOperationException("This operator is not working propertly"); } } if (SlidingPuzzleSolver.RIGHT.Equals(op)) { if (puzzleClone.CanMoveRight(puzzleClone.GapPosition)) { puzzleClone.MoveRight(puzzleClone.GapPosition); } else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable { throw new InvalidOperationException("This operator is not working propertly"); } } // Si el operador no se reconoce o es un NoOp, se devolverá la configuración actual (que sería idéntica a la original, no ha habido cambios) return(puzzleClone); }