private static (Logic Logic, ITurtle Turtle) Init() { // | | // | M | 2,2 // ___ | ___| ___ // | | // | S | E // ___ | ___| ___ // | | // 0,0 | | 2,0 // | | string json = @"{ 'board': { 'width': 3, 'height': 3, 'mines':[ { 'x':1, 'y':2} ] }, 'startTile':{'x':1,'y':1}, 'exitTile':{'x':2, 'y':1}, 'direction':'North' }"; var settings = JsonConvert.DeserializeObject <Settings>(json); var turtleFactory = new TurtleFactory(settings); var turtle = turtleFactory.CreateTurtle(); var logic = new Logic(settings, turtle); return(logic, turtle); }
private void ProcessMoves(TurtleFactory turtleFactory, Settings settings, string[] movesText) { var sequenceCounter = 1; foreach (var line in movesText) { var turtle = turtleFactory.CreateTurtle(); var logic = new Logic(settings, turtle); var moves = line.Split(','); foreach (var move in moves.Select(m => m.Trim().ToLowerInvariant())) { switch (move) { case "m": turtle.MoveForward(); break; case "r": turtle.RotateRight(); break; default: Debug.WriteLine("Turtle movement command not recognized"); break; } if (logic.Status < 0) { break; } } switch (logic.Status) { case Status.StillInDanger: Console.WriteLine($"Sequence {sequenceCounter}: Still in danger!"); break; case Status.OnAMine: Console.WriteLine($"Sequence {sequenceCounter}: BOOM! The turtle exploded."); break; case Status.Exit: Console.WriteLine($"Sequence {sequenceCounter}: The turtle found the exit and is safe!"); break; case Status.OutOfBounds: Console.WriteLine($"Sequence {sequenceCounter}: Uh oh, you took a wrong turn."); break; } sequenceCounter++; } Console.WriteLine("Press any key to exit."); Console.ReadKey(); }
private void OnExecute() { if (!File.Exists(SettingsFile)) { Console.WriteLine($"Can't find file {SettingsFile}"); return; } if (!File.Exists(MovesFile)) { Console.WriteLine($"Can't find file {MovesFile}"); return; } var settingsText = File.ReadAllText(SettingsFile); var movesText = File.ReadAllLines(MovesFile); Settings settings = null; FluentValidation.Results.ValidationResult settingsValidationResult = null; try { var settingsValidator = new SettingsValidator(); settings = JsonConvert.DeserializeObject <Settings>(settingsText); settingsValidationResult = settingsValidator.Validate(settings); if (!settingsValidationResult.IsValid) { foreach (var error in settingsValidationResult.Errors) { Console.WriteLine(error.ErrorMessage); } } } catch (JsonException ex) { Console.WriteLine("The settings file contains an invalid configuration."); Console.WriteLine(ex.Message); } if (settingsValidationResult?.IsValid != true) { return; } var turtleFactory = new TurtleFactory(settings); ProcessMoves(turtleFactory, settings, movesText); }
static int Main(string[] args) { if (args.Length != 2 || args.Contains("?")) { Console.WriteLine("Wrong Number of arguments. Usage: TurtleChallenge <game-settings> <moves>"); return(1); } string settingsFileName = args[0]; //"game-settings.txt" string movesFileName = args[1]; //"moves.txt" var settings = SettingsReader.ReadSettingsFromFile(settingsFileName); var movements = MovementReader.ReadMovementsFromFile(movesFileName); var turtle = TurtleFactory.InitiateTurtleOnBoard(boardSize: settings.BoardSize, startingPoint: settings.StartingPoint, exit: settings.ExitPoint, mines: settings.Mines, boardMode: TurtleWorld.BusinesLogic.Enums.BoardModes.BouncingWalls, direction: settings.InitialOrientation); int sequence = 1; //turtle.TurtleStateChanged += (obj, events) => //{ // Console.WriteLine($"Sequence {sequence++} : {obj}"); //}; if (null != movements) { foreach (var m in movements) { DoAction(turtle, m); Console.WriteLine($"Sequence {sequence++}: {m} : {turtle}"); } } // TODO : Should we check if turtle is still on the board after all movements are done? Should we break the loop above if the creature is dead already? return(0); }