public static async Task GetRandomFights([NotNull] Player player, [NotNull] Player opp, [NotNull] RefreshBB refresh, int builds = 100, int positions = 200, int cores = 8) { if (Running == true) { return; } Running = true; _refreshBB = refresh; _refreshBB.Bplayer = player.GetString(); _refreshBB.Bopp = opp.GetString(); source = new CancellationTokenSource(); token = source.Token; _empty = new ManualResetEvent(false); CORES = cores; MaxValue = 0; BUILDS = builds; POSITIONS = positions; _refreshBB.TOTAL_DONE = 0; _refreshBB.TOTAL = positions; START = DateTime.UtcNow; END = DateTime.MinValue; _jobs_random = new BlockingCollection <int>(); for (int i = 0; i < 40000; i++) { _jobs_random.Add(i); } for (int i = 0; i < 8; i++) { Thread thread = new Thread(OnHandlerStartRandom) { IsBackground = true }; //Mark 'false' if you want to prevent program exit until jobs finish thread.Start(); } while (!_empty.WaitOne(1000)) { Console.WriteLine(_jobs_random.Count()); _refreshBB.Update = !_refreshBB.Update; if (!_jobs_random.Any()) { break; } } END = DateTime.UtcNow; Running = false; _refreshBB.Update = !_refreshBB.Update; }
public static async Task GetBestBuild([NotNull] Player player, [NotNull] Player opp, [NotNull] RefreshBB refreshBB, int builds = 100, int positions = 200, int cores = 8) { if (Running == true) { return; } _refreshBB = refreshBB; _refreshBB.Init(); Running = true; opp.SoftReset(); opp.Units = UnitPool.Units.Where(x => x.Race == opp.Race && x.Cost > 0).ToList(); _refreshBB.Bopp = opp.GetString(); _refreshBB.Bplayer = player.GetString(); _refreshBB.BestBuild = _refreshBB.Bplayer; _refreshBB.WorstBuild = _refreshBB.Bplayer; _player = player; _opp = opp; source = new CancellationTokenSource(); token = source.Token; _empty = new ManualResetEvent(false); CORES = cores; MaxValue = 0; BUILDS = builds; POSITIONS = positions; _refreshBB.TOTAL_DONE = 0; _refreshBB.TOTAL = builds * positions + builds; START = DateTime.UtcNow; END = DateTime.MinValue; _jobs_build = new BlockingCollection <BBuildJob>(); _jobs_position = new BlockingCollection <BBuildJob>(); foreach (Unit unit in player.Units.Where(y => y.Status != UnitStatuses.Available)) { MaxValue += unit.Cost; } GameHistory game = new GameHistory(); game.ID = paxgame.GetGameID(); game.battlefield = new Battlefield(); Player myplayer = player.SoftCopy(); Player myopp = opp.SoftCopy(); game.Players.Add(myplayer); myplayer.Game = game; game.Players.Add(myopp); myopp.Game = game; myplayer.SetString(_refreshBB.Bplayer); _refreshBB.MineralsCurrent = myplayer.MineralsCurrent; myopp.SetString(_refreshBB.Bopp); GameService.GenFight(game).GetAwaiter().GetResult(); StatsService.GenRoundStats(game, false).GetAwaiter().GetResult(); Stats result = new Stats(); Stats oppresult = new Stats(); result.DamageDone = game.Stats.Last().Damage[1]; result.MineralValueKilled = game.Stats.Last().Killed[1]; oppresult.DamageDone = game.Stats.Last().Damage[0]; oppresult.MineralValueKilled = game.Stats.Last().Killed[0]; _refreshBB.BestStats = result; _refreshBB.BestStatsOpp = oppresult; for (int i = 0; i < BUILDS; i++) { BBuildJob job = new BBuildJob(); job.PlayerBuild = _refreshBB.Bplayer; job.OppBuild = _refreshBB.Bopp; job.Minerals = _refreshBB.MineralsCurrent; _jobs_build.Add(job); } for (int i = 0; i < 1; i++) { Thread thread = new Thread(OnHandlerStartBuild) { IsBackground = true }; //Mark 'false' if you want to prevent program exit until jobs finish thread.Start(); } for (int i = 0; i < 8; i++) { Thread thread = new Thread(OnHandlerStartPosition) { IsBackground = true }; //Mark 'false' if you want to prevent program exit until jobs finish thread.Start(); } while (!_empty.WaitOne(1000)) { Console.WriteLine(_jobs_position.Count + _jobs_build.Count); _refreshBB.Update = !_refreshBB.Update; if (!_jobs_position.Any()) { break; } } END = DateTime.UtcNow; Running = false; _refreshBB.Update = !_refreshBB.Update; }