private IRoverPosition Move(IRoverPosition starPosition) { IRoverPosition endPosition = new RoverPosition() { Direction = starPosition.Direction, X = starPosition.X, Y = starPosition.Y }; if (endPosition.Direction == Directions.North) { endPosition.Y += 1; } if (endPosition.Direction == Directions.South) { endPosition.Y -= 1; } if (endPosition.Direction == Directions.East) { endPosition.X += 1; } if (endPosition.Direction == Directions.West) { endPosition.X -= 1; } ValidateRover(starPosition, endPosition); starPosition = endPosition; return(starPosition); }
public IRoverPosition Move(IRoverPosition roverPosition) { IRoverPosition currentRoverPosition = roverPosition; switch (roverPosition.Direction) { case Direction.North: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.CoordinateX, roverPosition.CoordinateY + 1); break; case Direction.South: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.CoordinateX, roverPosition.CoordinateY - 1); break; case Direction.West: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.CoordinateX - 1, roverPosition.CoordinateY); break; case Direction.East: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.CoordinateX + 1, roverPosition.CoordinateY); break; } return(currentRoverPosition); }
private IRoverPosition GetRoverPosition(string roverString) { IRoverPosition roverPosition = null; var list = roverString.Trim().Split(" "); if (list.Length == 3) { roverPosition = new RoverPosition(); roverPosition.X = int.Parse(list[0]); roverPosition.Y = int.Parse(list[1]); roverPosition.Direction = EnumHelper.GetEnumValue <Directions>(list[2]); if (roverPosition.Direction == 0) { throw new Exception("(GetRoverPosition) Cannot get a direction command"); } } else { throw new Exception("(GetRoverPosition) Cannot get inputs properly"); } return(roverPosition); }
public static IRoverPosition Move(IRoverPosition roverPosition) { IRoverPosition currentRoverPosition = roverPosition; switch (roverPosition.Direction) { case RoverDirection.N: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.X, roverPosition.Y + 1); break; case RoverDirection.S: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.X, roverPosition.Y - 1); break; case RoverDirection.W: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.X - 1, roverPosition.Y); break; case RoverDirection.E: currentRoverPosition = new RoverPosition(roverPosition.Direction, roverPosition.X + 1, roverPosition.Y); break; default: throw new InvalidOperationException(); } return(currentRoverPosition); }
private IRoverPosition SetDirection(IRoverPosition rover, InstructionCommands command) { var direction = rover.Direction; var maxValue = Enum.GetValues(typeof(Directions)).Length; var minValue = 1; if (command == InstructionCommands.Right) { if ((int)direction == maxValue) { direction = (direction - (maxValue - 1)); } else { direction += 1; } } if (command == InstructionCommands.Left) { if ((int)direction == minValue) { direction = (direction + (maxValue - 1)); } else { direction -= 1; } } rover.Direction = direction; return(rover); }
public static void ExecuteCommand(string command, IRoverPosition position) { switch (command.ToUpper()) { case Constants.Movements.LEFT: position.RoverFacingPosition = position.RoverFacingPosition.Equals(RoverFacing.North) ? RoverFacing.West : (RoverFacing)((int)position.RoverFacingPosition - 1); break; case Constants.Movements.RIGHT: position.RoverFacingPosition = position.RoverFacingPosition.Equals(RoverFacing.West) ? RoverFacing.North : (RoverFacing)((int)position.RoverFacingPosition + 1); break; case Constants.Movements.FORWARD: switch (position.RoverFacingPosition) { case RoverFacing.North: if (IsValidMove(position.RoverPositionX, false)) { position.RoverPositionX--; } break; case RoverFacing.East: if (IsValidMove(position.RoverPositionY, true)) { position.RoverPositionY++; } break; case RoverFacing.South: if (IsValidMove(position.RoverPositionX, true)) { position.RoverPositionX++; } break; case RoverFacing.West: if (IsValidMove(position.RoverPositionY, false)) { position.RoverPositionY--; } break; } break; case Constants.Movements.EXIT_ROVER: Console.WriteLine(Constants.EXIT_ROVER_APP); System.Environment.Exit(0); break; default: Console.WriteLine(Constants.INVALID_COMMAND); break; } PrintRoverPosition(position.RoverPositionX, position.RoverPositionY, position.RoverFacingPosition); }
public IRoverPosition MoveForward() { IsRoverAtValidGridBoundaries(); _ = RoverPosition; IRoverPosition currentRoverPosition = RoverPosition.Direction switch { Direction.N => new RoverPosition(RoverPosition.Direction, RoverPosition.X, RoverPosition.Y + 1), Direction.S => new RoverPosition(RoverPosition.Direction, RoverPosition.X, RoverPosition.Y - 1), Direction.W => new RoverPosition(RoverPosition.Direction, RoverPosition.X - 1, RoverPosition.Y), Direction.E => new RoverPosition(RoverPosition.Direction, RoverPosition.X + 1, RoverPosition.Y), _ => throw new InvalidOperationException(), }; return(currentRoverPosition); }
private void ValidateRover(IRoverPosition startPosition, IRoverPosition endPosition) { var subject = "ValidateRover"; var isValid = true; if (UpperRightCoordinates.X < endPosition.X) { isValid = false; } if (LowerLeftCoordinates.X > endPosition.X) { isValid = false; } if (UpperRightCoordinates.Y < endPosition.Y) { isValid = false; } if (LowerLeftCoordinates.Y > endPosition.Y) { isValid = false; } var roverPosition = $"RoverPosition (Start: [{startPosition.X} {startPosition.Y} {startPosition.Direction}]), End [{endPosition.X} {endPosition.Y} {endPosition.Direction}]"; if (!isValid) { throw new Exception($"{subject}: Rover is out of boundaries. {roverPosition}"); } if (Rovers.Any(f => f.X == endPosition.X && f.Y == endPosition.Y)) { throw new Exception($"{subject}: The is another rover at the same coordinate. {roverPosition}"); } }
public IRoverPosition Process(ISurface surface, IRoverPosition roverPosition) { switch (roverPosition.Direction) { case Direction.N: roverPosition.Y = roverPosition.Y + 1 > surface.Coordinate.Y ? roverPosition.Y : roverPosition.Y + 1; return(roverPosition); case Direction.E: roverPosition.X = roverPosition.X + 1 > surface.Coordinate.X ? roverPosition.X : roverPosition.X + 1; return(roverPosition); case Direction.S: roverPosition.Y = roverPosition.Y - 1 < 0 ? roverPosition.Y : roverPosition.Y - 1; return(roverPosition); case Direction.W: roverPosition.X = roverPosition.X - 1 < 0 ? roverPosition.X : roverPosition.X - 1; return(roverPosition); } return(roverPosition); }
public IRoverPosition Process(ISurface surface, IRoverPosition roverPosition) { roverPosition.Direction = roverPosition.Direction - 1 < Direction.N ? Direction.W : roverPosition.Direction - 1; return(roverPosition); }
public Rover(IRoverPosition position) { this.Id = new Guid(); this.Position = position; }
public Rover(IRoverPosition roverPosition, IPlateauGrid plateauGrid) { this.CurrentPosition = roverPosition; this.PlateauGrid = plateauGrid; this.Commands = new List <ICommand>(); }
/// <summary> /// Constructor for the support class initialization /// </summary> /// <param name="commandSequence">commandSequence class initializer</param> /// <param name="roverPosition">roverPosition class initializer</param> /// <param name="calculatePosition">calculatePosition class initializer</param> public RobotSpecification(ICommandSequence commandSequence, IRoverPosition roverPosition, ICalculatePosition calculatePosition) { _commandSequence = commandSequence; _roverPosition = roverPosition; _calculatePosition = calculatePosition; }
public IRoverPosition Process(ISurface surface, IRoverPosition roverPosition) { roverPosition.Direction = roverPosition.Direction + 1 > Direction.W ? Direction.N : roverPosition.Direction + 1; return(roverPosition); }
public Rover(IRoverPosition roverPosition, IPlateau plateau) { this.RoverPosition = roverPosition; this.Plateau = plateau; this.Orders = new List <IOrder>(); }
public Rover(ISurface surface, IRoverPosition position, IDirectionContextStrategy directionContextStrategy) { Surface = surface; Position = position; DirectionContextStrategy = directionContextStrategy; }