public static void BuildJob(object obj) { BBuildJob job = obj as BBuildJob; GameHistory game = new GameHistory(); game.ID = paxgame.GetGameID(); game.battlefield = new Battlefield(); Player myplayer = _player.SoftCopy(); myplayer.Game = game; Player myopp = _opp.SoftCopy(); myopp.Game = game; game.Players.Add(myplayer); myplayer.Game = game; game.Players.Add(myopp); myopp.Game = game; myplayer.SetString(job.PlayerBuild); myopp.SetString(job.OppBuild); myopp.MineralsCurrent = job.Minerals; OppService.BPRandom(myopp, true).GetAwaiter().GetResult(); 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]; lock (_refreshBB) { int check = CheckResult(result, oppresult); if (check == 1 || check == 2) { _refreshBB.BestBuild = myopp.GetString(); } else if (check == 3) { _refreshBB.WorstBuild = myopp.GetString(); } } for (int i = 0; i < POSITIONS; i++) { BBuildJob pjob = new BBuildJob(); pjob.PlayerBuild = job.PlayerBuild; pjob.OppBuild = myopp.GetString(); _jobs_position.Add(pjob); } Interlocked.Increment(ref _refreshBB.TOTAL_DONE); }
public static void PositionJob(object obj) { BBuildJob job = obj as BBuildJob; GameHistory game = new GameHistory(); game.ID = paxgame.GetGameID(); game.battlefield = new Battlefield(); Player myplayer = _player.SoftCopy(); myplayer.Game = game; Player myopp = _opp.SoftCopy(); myopp.Game = game; game.Players.Add(myplayer); myplayer.Game = game; game.Players.Add(myopp); myopp.Game = game; myplayer.SetString(job.PlayerBuild); myopp.SetString(job.OppBuild); OppService.PositionRandomDistmod(myopp.Units.Where(x => x.Status != UnitStatuses.Available).ToList(), myopp).GetAwaiter(); 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]; lock (_refreshBB) { int check = CheckResult(result, oppresult); if (check == 1 || check == 2) { _refreshBB.BestBuild = myopp.GetString(); } else if (check == 3) { _refreshBB.WorstBuild = myopp.GetString(); } } Interlocked.Increment(ref _refreshBB.TOTAL_DONE); }
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; }