public JsonResult PlayOneGame() { // have to use this.Request["data"] instead of parameters to extract data from the post because mono var data = JsonConvert.DeserializeObject <PlayOneGameRequest>(this.Request["data"]); var configuration = BlockadeConfiguration.MakeConfiguration( rows: data.Configuration.Rows, cols: data.Configuration.Cols, playersWithStartingLocation: data.Configuration.PlayersWithStartingPosition .Select(a => Tuple.Create(this._playerProvider.GetPlayer(a.Name), a.StartingLocation)) .ToList()); var game = this._blockadeGameFactory(configuration); var result = game.Run(); return(this.Json(new PlayOneGameResponse { Board = ConvertMultidimensionalArray(result.Board.To2dArray()), ResultsWithFinalTurn = result.FinalOrdering .Select(playerI => Tuple.Create(playerI, result.Board.Enumerate((_, cell) => cell) .Where(c => c.Player == playerI) .Select(c => c.Turn.Value) .Max())) .ToArray() })); }
public JsonResult PlayManyGames() { // have to use this.Request["data"] instead of parameters to extract data from the post because mono var data = JsonConvert.DeserializeObject <PlayManyGamesRequest>(this.Request["data"]); var configuration = BlockadeConfiguration.MakeConfiguration( rows: data.Configuration.Rows, cols: data.Configuration.Cols, playersWithStartingLocation: data.Configuration.PlayersWithStartingPosition .Select(a => Tuple.Create(this._playerProvider.GetPlayer(a.Name), a.StartingLocation)) .ToList()); var stopwatch = new Stopwatch(); stopwatch.Start(); this._myProfiler.ClearAllData(); var games = Enumerable.Range(0, data.NumGames) .Select(_ => this._blockadeGameFactory(configuration)) .ToList(); var results = new List <BlockadeResult>(capacity: data.NumGames); var resultLock = new Object(); ThreadPool.SetMaxThreads(workerThreads: 2, completionPortThreads: 2); Parallel.ForEach(games, game => { var result = game.Run(); lock (resultLock) { results.Add(result); } }); stopwatch.Stop(); return(this.Json(new PlayManyGamesResult { WinPercentages = Enumerable.Range(0, configuration.Players.Count) .Select(playerI => Enumerable.Range(0, configuration.Players.Count) .Select(resultI => results.Count(r => r.FinalOrdering[resultI] == playerI) * 1.0 / data.NumGames) .ToArray()) .ToArray(), NumGamesPlayed = data.NumGames, TimeTakenSeconds = stopwatch.Elapsed.TotalSeconds, ProfilerTimingData = this._myProfiler.GetAllTimingData(), ProfilerArgumentCountDistribution = this._myProfiler.GetArgumentCountDistribution() })); }