public void DirectRover(int roverId, RoverOperationType operationType) { Rover rover; if (!Rovers.TryGetValue(roverId, out rover)) { throw new InvalidOperationException("Rover does not exist"); } if (operationType == RoverOperationType.RotateLeft || operationType == RoverOperationType.RotateRight) { rover.Heading = GetNewHeading(rover.Heading, operationType); } else if (operationType == RoverOperationType.Move) { var newPosition = Vector.Add(rover.Position, rover.Heading); if (newPosition.X < 0 || newPosition.X > PlateauLength || newPosition.Z < 0 || newPosition.Z > PlateauWidth) { throw new InvalidOperationException("Rover has driven off the plateau"); } foreach (var roverEntry in Rovers.Values) { if (Vector.AreEqual(roverEntry.Position, newPosition)) { throw new InvalidOperationException("Collision! Curiousity got the best of this Martian rover"); } } rover.Position = newPosition; } }
public void LandRover(Rover rover) { if (Rovers.ContainsKey(rover.Id)) { throw new InvalidOperationException("Rover already exists."); } if (rover.Position.X < 0 || rover.Position.X > PlateauLength || rover.Position.Z < 0 || rover.Position.Z > PlateauWidth) { throw new InvalidOperationException("Rover has landed off the plateau."); } foreach (var roverEntry in Rovers.Values) { if (Vector.AreEqual(roverEntry.Position, rover.Position)) { throw new InvalidOperationException("Rover has crash-landed on another rover."); } } Rovers.Add(rover.Id, rover); }