public BlockPath GetMove(Field field, Field opponent, Block current, Block next, int round, EvaluatorParameters pars) { Pars = new ApplyParameters(Rnd) { Round = round, MaximumDuration = MaximumDuration, MaximumDepth = MaximumDepth, Evaluator = Evaluator, Generator = Generator, Current = current, Next = next, FirstFilled = field.FirstFilled, Parameters = pars, }; Root = new BlockRootNode(field); while (Pars.Depth < Pars.MaximumDepth && Pars.HasTimeLeft) { Root.Apply(++Pars.Depth, Pars); Logs.Add(new PlyLog(Pars.Round, Root.BestMove, Root.Score, Pars.Depth, Pars.Elapsed, Pars.Evaluations)); Console.WriteLine(Logs.Last()); } BestField = Root.BestField; return(Root.BestMove); }
/// <summary>Applies garbage and locks to the field.</summary> public static Field Apply(Field field, int depth, ApplyParameters pars) { // Lock a row every 15 turns. if ((pars.Round + depth) % 15 == 1) { field = field.LockRow(); } if (depth == 1) { if (pars.Opponent.Garbage1 > 0) { var garbage = Row.GetGarbage(pars.Opponent.Garbage1, pars.Opponent.Points0, pars.Rnd); return(field.Garbage(garbage)); } } else if (depth == 2 && pars.Opponent.Garbage2 > 0) { var garbage = Row.GetGarbage(pars.Opponent.Garbage2, pars.Opponent.Points1, pars.Rnd); return(field.Garbage(garbage)); } return(field); }
/// <summary>Applies garbage and locks to the field.</summary> public static Field Apply(Field field, int depth, ApplyParameters pars) { // Lock a row every 15 turns. if ((pars.Round + depth) % 15 == 1) { field = field.LockRow(); } if (depth == 1) { if (pars.Opponent.Garbage1 > 0) { var garbage = Row.GetGarbage(pars.Opponent.Garbage1, pars.Opponent.Points0, pars.Rnd); return field.Garbage(garbage); } } else if (depth == 2 && pars.Opponent.Garbage2 > 0) { var garbage = Row.GetGarbage(pars.Opponent.Garbage2, pars.Opponent.Points1, pars.Rnd); return field.Garbage(garbage); } return field; }
/// <summary> /// Применяет кастомные праметры к элементу, если таковые найдутся - соответствующие его типу /// </summary> public void ApplyCustomParameters(RuleElement element) { ApplyParameters?.ForEach(c => c.Apply(element)); }