コード例 #1
0
ファイル: Robot.cs プロジェクト: CarlosVV/amcro
        private void ExecuteCommand()
        {
            if (Battery.Status - Battery.Consumption(CurrentRobotAction) < 0)
            {
                return;
            }

            Battery.Status = Battery.Status - Battery.Consumption(CurrentRobotAction);

            if (CurrentRobotAction == RobotAction.A || CurrentRobotAction == RobotAction.B)
            {
                PreviousCoordinate = CurrentCoordinate;
                CurrentCoordinate  = GetResultCoordinate(CurrentFacing, CurrentRobotAction, CurrentCoordinate);
            }
            else if (CurrentRobotAction == RobotAction.TL || CurrentRobotAction == RobotAction.TR)
            {
                CurrentFacing = (Facing)Enum.Parse(typeof(Facing), FacingActionResult[(int)CurrentFacing][(int)CurrentRobotAction]);
            }

            if (!IsObstacle())
            {
                if ((CurrentRobotAction == RobotAction.A || CurrentRobotAction == RobotAction.B) && (!Visited.Any(m => m.X == CurrentCoordinate.X && m.Y == CurrentCoordinate.Y)))
                {
                    Visited.Add(CurrentCoordinate);
                }
                else if ((CurrentRobotAction == RobotAction.C) && (!Cleaned.Any(m => m.X == CurrentCoordinate.X && m.Y == CurrentCoordinate.Y)))
                {
                    Cleaned.Add(CurrentCoordinate);
                }
            }
        }
コード例 #2
0
ファイル: Robot.cs プロジェクト: CarlosVV/amcro
        /// <summary>
        ///  Main Method to be used by passing the complete structure request with instructions
        /// </summary>
        /// <param name="request">Request class containing the Map, Start, Commands and Battery Status</param>
        /// <returns></returns>
        public CleaningResult Run(CleaningRequest request)
        {
            if (IsValidRequest(request))
            {
                return(null);
            }

            var result = new CleaningResult();

            Map     = request.Map;
            Battery = new Battery {
                Status = request.Battery
            };
            CurrentCoordinate  = request.Start;
            PreviousCoordinate = CurrentCoordinate;
            CurrentFacing      = (Facing)Enum.Parse(typeof(Facing), request.Start.Facing);
            Visited.Add(new Coordinate {
                X = CurrentCoordinate.X, Y = CurrentCoordinate.Y
            });

            foreach (var command in request.Commands)
            {
                CurrentRobotAction = (RobotAction)Enum.Parse(typeof(RobotAction), command);
                ExecuteCommand();

                if (IsObstacle())
                {
                    CurrentCoordinate = PreviousCoordinate;
                    IsRunningObstacleBackOffStrategy = true;
                    var alternativeIndex = 0;
                    do
                    {
                        var altCommands = AlternativeActions[alternativeIndex];
                        foreach (var altCommand in altCommands)
                        {
                            CurrentRobotAction = (RobotAction)Enum.Parse(typeof(RobotAction), altCommand);
                            ExecuteCommand();
                        }

                        if (!IsObstacle())
                        {
                            break;
                        }
                        else
                        {
                            CurrentCoordinate = PreviousCoordinate;
                            IsRunningObstacleBackOffStrategy = true;
                        }

                        alternativeIndex++;
                    }while (IsRunningObstacleBackOffStrategy && alternativeIndex < AlternativeActions.GetLength(0));

                    IsRunningObstacleBackOffStrategy = false;
                }
            }

            result.Visited = Visited.OrderBy(m => m.X).ThenBy(m => m.Y).ToList();
            result.Cleaned = Cleaned.OrderBy(m => m.X).ThenBy(m => m.Y).ToList();
            result.Final   = new Position {
                X = CurrentCoordinate.X, Y = CurrentCoordinate.Y, Facing = CurrentFacing.ToString()
            };
            result.Battery = Battery.Status;

            return(result);
        }
コード例 #3
0
        public Result Run(Request request)
        {
            if (IsValidRequest(request))
            {
                return(null);
            }

            Init();
            var result = new Result();

            Map     = request.Map;
            Battery = new Battery {
                Status = request.Battery
            };
            CurrentCoordinate  = request.Start;
            PreviousCoordinate = CurrentCoordinate;
            CurrentFacing      = (Facing)Enum.Parse(typeof(Facing), request.Start.Facing);
            Visited.Add(new Coordinate {
                X = CurrentCoordinate.X, Y = CurrentCoordinate.Y
            });

            for (int i = 0; i < request.Commands.Length; i++)
            {
                CurrentAction = (Action)Enum.Parse(typeof(Action), request.Commands[i]);
                ExecCommand();

                if (IsObstacle())
                {
                    CurrentCoordinate        = PreviousCoordinate;
                    IsRunningBackOffStrategy = true;
                    for (int j = 0; j < AlternativeActions.Path.Length; j++)
                    {
                        if (IsRunningBackOffStrategy)
                        {
                            for (int k = 0; k < AlternativeActions.Path[j].Length; k++)
                            {
                                CurrentAction = (Action)Enum.Parse(typeof(Action), AlternativeActions.Path[j][k]);
                                ExecCommand();
                            }

                            if (!IsObstacle())
                            {
                                IsRunningBackOffStrategy = false;
                                break;
                            }
                            else
                            {
                                CurrentCoordinate        = PreviousCoordinate;
                                IsRunningBackOffStrategy = true;
                            }
                        }
                    }
                }
            }

            result.Visited = Visited.OrderBy(m => m.X).ThenBy(m => m.Y).ToList();
            result.Cleaned = Cleaned.OrderBy(m => m.X).ThenBy(m => m.Y).ToList();
            result.Final   = new Position {
                X = CurrentCoordinate.X, Y = CurrentCoordinate.Y, Facing = CurrentFacing.ToString()
            };
            result.Battery = Battery.Status;

            return(result);
        }