示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
文件: Rover.cs 项目: snes20/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);
        }
示例#7
0
        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);
        }
示例#8
0
        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}");
            }
        }
示例#9
0
        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);
        }
示例#10
0
 public IRoverPosition Process(ISurface surface, IRoverPosition roverPosition)
 {
     roverPosition.Direction = roverPosition.Direction - 1 < Direction.N ? Direction.W : roverPosition.Direction - 1;
     return(roverPosition);
 }
示例#11
0
 public Rover(IRoverPosition position)
 {
     this.Id       = new Guid();
     this.Position = position;
 }
示例#12
0
 public Rover(IRoverPosition roverPosition, IPlateauGrid plateauGrid)
 {
     this.CurrentPosition = roverPosition;
     this.PlateauGrid     = plateauGrid;
     this.Commands        = new List <ICommand>();
 }
示例#13
0
 /// <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);
 }
示例#15
0
 public Rover(IRoverPosition roverPosition, IPlateau plateau)
 {
     this.RoverPosition = roverPosition;
     this.Plateau       = plateau;
     this.Orders        = new List <IOrder>();
 }
示例#16
0
 public Rover(ISurface surface, IRoverPosition position, IDirectionContextStrategy directionContextStrategy)
 {
     Surface  = surface;
     Position = position;
     DirectionContextStrategy = directionContextStrategy;
 }