コード例 #1
0
        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()
            }));
        }
コード例 #2
0
        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()
            }));
        }