public bool IsPositionOccupied(IPosition position, int roverId) { if (position == null) { throw new ArgumentNullException(nameof(position)); } var trimmedDictionary = RoverPositionDictionary.Where(dict => dict.Key != roverId); var matches = trimmedDictionary.Where(dict => dict.Value.YAxis == position.YAxis && dict.Value.XAxis == position.XAxis); return(matches.Any()); }
public void BeginMission() { Console.WriteLine("Welcome to Mars Rover Mission Control"); while (true) { Console.WriteLine("Please provide the Exploration Area maximum X axis value"); var xAxisString = Console.ReadLine()?.Trim(); if (!int.TryParse(xAxisString, out var xAxisInt)) { Console.WriteLine( "Invalid character entered, please enter a valid number for the X Axis."); continue; } XAxisMaximum = xAxisInt; break; } while (true) { Console.WriteLine("Please provide the Exploration Area maximum Y axis value"); var yAxisString = Console.ReadLine()?.Trim(); if (!int.TryParse(yAxisString, out var yAxisInt)) { Console.WriteLine( "Invalid character entered, please enter a valid number for the Y Axis."); continue; } YAxisMaximum = yAxisInt; break; } ExplorationArea = new ExplorationArea(XAxisMaximum, YAxisMaximum); ExplorationArea.ConstructExplorationArea(); Console.WriteLine("Now please indicate how many Rovers to deploy?"); while (true) { var numberOfRovers = Console.ReadLine()?.Trim(); if (!int.TryParse(numberOfRovers, out var numberOfRoversInt)) { Console.WriteLine( "Invalid character entered, please enter a valid number of Rovers to be deployed, the maximum is 10 and minimum is 1"); continue; } if (numberOfRoversInt <= 0 || numberOfRoversInt >= 10) { Console.WriteLine( "Please enter a valid number of Rovers to be deployed, the maximum is 10 and minimum is 1"); continue; } NumberOfRovers = numberOfRoversInt; break; } CreateRovers(NumberOfRovers); var roverCounter = 0; foreach (var rover in RoverList) { IPosition tempPosition; while (true) { Console.WriteLine( $"For Rover {roverCounter} please provide starting co-ordinates and cardinal direction facing."); var roverStartPosition = Console.ReadLine()?.Trim(); if (roverStartPosition == null) { Console.WriteLine($"Input Characters cannot be null."); continue; } if (roverStartPosition == string.Empty) { Console.WriteLine($"Input Characters cannot be blank."); continue; } if (!roverStartPosition.Contains(' ')) { Console.WriteLine($"Input Characters must be separated by a space character."); continue; } var roverStartPositionStringArray = roverStartPosition.Split(' '); if (roverStartPositionStringArray.Length > 3) { Console.WriteLine( $"Too many position values provided. The expected format is '<XAxis> <YAxis> <Cardinal Direction>'"); continue; } if (roverStartPositionStringArray.Length > 3) { Console.WriteLine( "Too few values provided. The expected format is '<XAxis> <YAxis> <Cardinal Direction>'"); continue; } if (!int.TryParse(roverStartPositionStringArray[0], out var tempXAxis)) { Console.WriteLine("XAxis Value is not a valid integer"); continue; } if (!int.TryParse(roverStartPositionStringArray[1], out var tempYAxis)) { Console.WriteLine("YAxis Value is not a valid integer"); continue; } if (!Enum.TryParse(typeof(Direction), roverStartPositionStringArray[2], false, out var result)) { Console.WriteLine("Cardinal Direction provided is not valid."); continue; } tempPosition = new Position { XAxis = Convert.ToInt32(roverStartPositionStringArray[0]), YAxis = Convert.ToInt32(roverStartPositionStringArray[1]), Direction = (Direction)Enum.Parse(typeof(Direction), roverStartPositionStringArray[2].ToString()) }; if (IsPositionOccupied(tempPosition, rover.Id)) { Console.WriteLine( $"Rover {roverCounter} cannot start from here, these coordinates are already taken by another rover."); continue; } break; } rover.RoverPosition = tempPosition; RoverPositionDictionary.Add(rover.Id, tempPosition); string roverCommand; while (true) { Console.WriteLine($"For Rover {roverCounter} please provide movement instructions"); roverCommand = Console.ReadLine()?.Trim(); if (roverCommand == null) { Console.WriteLine($"Command cannot be null."); continue; } if (roverCommand == string.Empty) { Console.WriteLine($"Command cannot be empty."); continue; } var roverCommandCharArray = roverCommand.ToCharArray(); var commandValid = true; foreach (var command in roverCommandCharArray) { if (char.IsDigit(command)) { Console.WriteLine($"Command cannot be a number: {command}"); commandValid = false; continue; } if (!Enum.TryParse(typeof(Command), command.ToString(), false, out var result)) { Console.WriteLine($"Invalid command character provided: {command}"); commandValid = false; continue; } } if (!commandValid) { continue; } break; } roverCounter++; rover.CommandString = roverCommand; } Console.WriteLine($"Start rovers moving? (hit any key)"); Console.ReadKey(); var roverToMoveCounter = 0; foreach (var roverToMove in RoverList) { Console.WriteLine($"Rover {roverToMoveCounter} is moving."); var theoreticalPositionOfWhereRoverMovesTo = roverToMove.TheoreticalMovementExecution(roverToMove.CommandString); if (IsPositionOccupied(theoreticalPositionOfWhereRoverMovesTo, roverToMove.Id)) { Console.WriteLine( $"Proposed movement would put rover {roverToMoveCounter} into a final position occupied by another rover. Movement aborted."); continue; } roverToMove.ExecuteMovement(); RoverPositionDictionary[roverToMove.Id] = roverToMove.RoverPosition; Console.WriteLine($"Rover {roverToMoveCounter} final position {roverToMove.ReportPosition()}"); roverToMoveCounter++; } Console.WriteLine(ReportFinalPositions()); }