/// <summary> /// Run the simulations and save result to ViewState and JS script block /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnRunSimulations_OnClick(object sender, EventArgs e) { var deck = new Deck(); List<int> position = Request.Form["robotPosition"].Split(',').Select(int.Parse).ToList(); var cards = Request.Form["cards"].Split(',').Select(x => GetCardPriority(deck, x)); var robot = new Robot { Position = new Coordinate {X = position[0], Y = position[1]}, Facing = (Orientation)Enum.Parse(typeof(Orientation), Request.Form["robotOrientation"]) }; foreach (var priority in cards) { robot.DealCard(priority); } var map = MapParser.JsonToMap(LoadMapJson("~/Maps/ScottRallyMap.rrdl")); var game = new Game(new Map {Squares = map}, new List<Robot> {robot}); game.Initialize(); List<List<CardExecutionResult>> results = Simulator.Simulate(robot); List<List<CardExecutionResult>> productiveResults = results.Where(result => result.Last().Position.X != -1).ToList(); ViewState["PosX"] = position[0]; ViewState["PosY"] = position[1]; ViewState["Facing"] = Request.Form["robotOrientation"]; ViewState["Cards"] = Request.Form["cards"]; ClientScript.RegisterClientScriptBlock(GetType(), "results", "results = " + JsonConvert.SerializeObject(productiveResults, Formatting.Indented), true); }
public static string RunSimulations(string body) { JToken json = JToken.Parse(body); var deck = new Deck(); IEnumerable<int> cards = json["cards"].ToString().Split(',').Select(x => GetCardPriority(deck, x)); List<int> robotPosition = json["robotPosition"].ToString().Split(',').Select(int.Parse).ToList(); string robotOrientation = json["robotOrientation"].ToString(); var robot = new Robot { Position = new Coordinate { X = robotPosition[0], Y = robotPosition[1] }, Facing = (Orientation)Enum.Parse(typeof(Orientation), robotOrientation) }; foreach (var priority in cards) { robot.DealCard(priority); } var map = MapParser.JsonToMap(LoadMapJson(ActiveMap)); var game = new Game(new Map { Squares = map }, new List<Robot> { robot }); game.Initialize(); List<List<CardExecutionResult>> results = Simulator.Simulate(robot); List<List<CardExecutionResult>> productiveResults = results.Where(result => result.Last().Position.X != -1).ToList(); return JsonConvert.SerializeObject(productiveResults, Formatting.Indented); }
public Game(Map map, IEnumerable<Robot> robots) { if (map == null) throw new ArgumentNullException("map"); if (robots == null) throw new ArgumentNullException("robots"); Cards = new Deck(); Board = map; Robots = robots; }
/// <summary> /// Runs simulations on moves based on the cards the robot currently has assigned. /// Robot is expected to be initialized and part of an existing Game. /// The robot will not be in the same state after simulation is executed. /// </summary> /// <param name="robot">Robot to run simulations for</param> /// <returns>List of results</returns> public static List<List<CardExecutionResult>> Simulate(Robot robot) { var results = new List<List<CardExecutionResult>>(); List<List<ProgramCardType>> permutations = CalculateMovePermutations(robot); Coordinate position = robot.Position; Orientation facing = robot.Facing; foreach (var permutation in permutations) { robot.Position = position; robot.Facing = facing; robot.Damage = 0; robot.PickUpCards(); var deck = new Deck(); var permutationResult = new List<CardExecutionResult>(); for (int i = 0 ; i < permutation.Count; ++i) { var card = deck.GetCard(permutation[i]); robot.DealCard(card.Priority, i + 1); } robot.Game.StartTurn(false /* Deal Cards */); int previousDamage = 0; while (true) { int registersLeft = robot.Game.ExecuteNextRegister(); permutationResult.Add(new CardExecutionResult { Card = permutation[permutationResult.Count], Position = robot.Position, Facing = robot.Facing, Damage = robot.Damage - previousDamage }); previousDamage = robot.Damage; if (registersLeft == 0) break; } robot.Game.EndTurn(); results.Add(permutationResult); } return results; }
/// <summary> /// Get card priority from user input /// </summary> /// <param name="deck">Deck to retrieve card from</param> /// <param name="card">Card from user input. A priority number or card move abbreviation: U, L, R, B, 1, 2, 3</param> /// <returns></returns> private int GetCardPriority(Deck deck, string card) { if (card.Equals("U", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.UTurn).Priority; if (card.Equals("L", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.RotateLeft).Priority; if (card.Equals("R", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.RotateRight).Priority; if (card.Equals("B", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.BackUp).Priority; if (card.Equals("1", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.Move1).Priority; if (card.Equals("2", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.Move2).Priority; if (card.Equals("3", StringComparison.InvariantCultureIgnoreCase)) return deck.GetCard(ProgramCardType.Move3).Priority; return new ProgramCard(int.Parse(card)).Priority; }
public Game() { Cards = new Deck(); Robots = new List<Robot>(); Board = new Map(); }