public bool Analyse() { var tree = new SearchTree(); var found = false; var last = Fields.Last(); if (!last.IsScoreRed() && !last.IsScoreYellow()) { tree.GetMove(last, Duration, Duration); } var node = tree.GetNode(last, (byte)(last.Count + 1)); if (!Scores.IsWinning(node.Score)) { return found; } var redToMove = node.Score > 0; tree.Initialize(Nodes.Values); var fields = Fields .Where(f => f.RedToMove == redToMove) .OrderByDescending(f => f.Count) .ToList(); Field target = Field.Empty; var score = 0; foreach (var field in fields) { var loop = Stopwatch.StartNew(); tree.GetMove(field, Duration, Duration); Console.WriteLine(tree.Logger); var test = tree.Root.Score; if (redToMove && test < Scores.RedWin) { break; } else if (!redToMove && test > Scores.YelWin) { break; } target = field; score = test; if (loop.Elapsed >= Duration) { break; } if (field.Count < 19) { break; } if (Scores.GetPlyToWinning(score) > field.Count + 1) { found = true; Console.WriteLine("{0} [{2}] {1}", Scores.GetFormatted(score), target, target.Count + 1); if (target.GetHashCode() > target.Flip().GetHashCode()) { target = target.Flip(); } Nodes[target] = new SearchTreeKnownNode(target, score); } } if (!found) { return false; } return true; }
public TheDaltonsBot() { Tree = new SearchTree(); }