public SymmetryEnvironment(MoveNode.GradeNode lowestNode) { this.lowestNode = lowestNode; config = lowestNode.MoveNode.config; colorFalse = new bool[config.colors]; colorUsed = new bool[config.colors]; init(); }
public virtual MoveNode runOneStepAheadAnalysis(Type assessor) { AssessmentManager manager = new AssessmentManager(config, assessor, currentPos.PossibilitySize); SymmetryEnvironment symmetryEnvironment = new SymmetryEnvironment(currentPos); ResultSet resultSet = new ResultSet(symmetryEnvironment, config); Parallel.For(short.MinValue, short.MinValue + config.combinations, m => { MoveNode testMove = currentPos.addTemporarySubMove((short)m); PossibilityDivisionAssessor assess = manager.getSetAssessor(); if (!resultSet.symmetryEnvironment.checkSymmetry(testMove)) { return; } for (int i = 0; i < resultSet.config.grades; i++) { MoveNode.GradeNode tempGrade = testMove.addSubGrade(i); if (tempGrade.PossibilitySize == 0) { tempGrade.unregister(); continue; } assess.updateNextIndividual(tempGrade.PossibilitySize); if (!assess.check(resultSet.config.grades - i - 1)) { return; } } lock (resultSet) { if (!assess.check(0)) { return; } assess.updateBestValue(); testMove.AssessmentValue = assess.CurrentSetValue; resultSet.BestMove = testMove; } }); currentPos.addSubNode(resultSet.BestMove); return(resultSet.BestMove); }
public virtual void addGradedMove(int[] pegs, int whites, int blacks) { MoveNode tmpMove = currentPos.addSubMove(config.makePegSet(pegs)); currentPos = tmpMove.addSubGrade(config.array2id[blacks][whites]); }
/* Functionality Methods */ public virtual void selectGrade(int blacks, int whites) { currentPos = currentPos.followingMoves.GetEnumerator().Current.pruneSubGrades(config.array2id[blacks][whites]); }
public MasterMind(int pegs, int colors) { config = new Config(pegs, colors); root = new RootNode.RootGrade((new RootNode(config))); currentPos = root; }