public ApplyParameters(MT19937Generator rnd) { const int size = 16; sw = Stopwatch.StartNew(); MaximumDepth = int.MaxValue; Rnd = rnd; Blocks = new Block[size][]; Blocks[2] = Block.All; Blocks[3] = Block.SubsetsOf3[Rnd.Next(Block.SubsetsOf3.Length)]; for (var i = 4; i < size; i++) { Blocks[i] = Block.SubsetsOf2[Rnd.Next(Block.SubsetsOf2.Length)]; } }
public Result Run(MT19937Generator rnd, bool logGames) { var field0 = GetInitial(rnd); var field1 = GetInitial(rnd); var out0 = Field.None; var out1 = Field.None; var current = Block.All[rnd.Next(Block.All.Length)]; var next = Block.All[rnd.Next(Block.All.Length)]; var b0 = BattleBot.Create(rnd, Bot0.DefPars, SearchDepth); var b1 = BattleBot.Create(rnd, Bot1.DefPars, SearchDepth); var s0 = true; var s1 = true; var g0 = 0; var g1 = 0; int turns = 1; var stats0 = new BotStats(); var stats1 = new BotStats(); while (s0 && s1) { out0 = b0.GetResponse(field0, field1, current, next, turns); out1 = b1.GetResponse(field1, field0, current, next, turns); stats0.Update(field0, out0, current); stats1.Update(field1, out1, current); field0 = out0; field1 = out1; var t0 = field0.Points / 3; var t1 = field1.Points / 3; if (t0 > g0) { field1 = field1.Garbage(Row.GetGarbage(t0 - g0, g0 * 3, rnd)); g0 = t0; } if (t1 > g1) { field0 = field0.Garbage(Row.GetGarbage(t1 - g1, g1 * 3, rnd)); g1 = t1; } if (turns++ % 15 == 0) { field0 = field0.LockRow(); field1 = field1.LockRow(); } s0 = !field0.IsNone; s1 = !field1.IsNone; Turns0.Add(field0); Turns1.Add(field1); current = next; next = Block.All[rnd.Next(Block.All.Length)]; } if (logGames) { var visualiser = new FieldVisualizer(16); var dir = new DirectoryInfo(Path.Combine("games", DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss_fff"))); dir.Create(); visualiser.Draw(Turns0, Turns1, dir); } var result = new Result() { Turns = Turns0.Count, Points0 = Turns0[Turns0.Count - 1].IsNone ? Turns0[Turns0.Count - 2].Points : Turns0[Turns0.Count - 1].Points, Points1 = Turns1[Turns1.Count - 1].IsNone ? Turns1[Turns1.Count - 2].Points : Turns1[Turns1.Count - 1].Points, Stats0 = stats0, Stats1 = stats1, Outcome = Outcome.Draw, }; if (s0) { result.Outcome = Outcome.Win; } else if (s1) { result.Outcome = Outcome.Loss; } return result; }
public static ushort[] GetGarbage(int count, int pointsOld, MT19937Generator rnd) { var garbage = new ushort[count]; var single = ((pointsOld / 3) & 1) == 0; for (var i = 0; i < count; i++) { garbage[i] = single ? Garbage[rnd.Next(10)] : Garbage2[rnd.Next(45)]; single = !single; } return garbage; }