Example #1
0
        private bool RunAI(int x, int y, ICell cell, List <ICell> neighbors)
        {
            RulesResult aIResult = AI.Process(cell, neighbors);

            if (aIResult.Value != null)
            {
                cell.SetValue((int)aIResult.Value);
            }
            else
            {
                foreach (var item in aIResult.RemovedPossible)
                {
                    cell.RemovePossibleValue(item);
                }
            }

            if (aIResult.Value != null ||
                aIResult.RemovedPossible.Count > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #2
0
        private RulesResult FindSetsInNeigbors(ICell cell, List <ICell> neighbors, RulesResult result)
        {
            List <ICell> smallList = new List <ICell>();

            smallList.AddRange(neighbors);
            smallList.Add(cell);
            FindSetsInBigNeighbors(cell, smallList, result);

            return(result);
        }
Example #3
0
        private RulesResult RemoveOtherSetValues(ICell cell, List <ICell> neighbors, RulesResult result)
        {
            foreach (ICell item in neighbors)
            {
                if (item.Value != null)
                {
                    cell.RemovePossibleValue((int)item.Value);
                }
            }

            return(result);
        }
Example #4
0
        public RulesResult Process(ICell cell, List <ICell> neighbors)
        {
            RulesResult result = new RulesResult();

            if (cell.PossibleValues.Count > 0)
            {
                result = SetWhenOnly1ValueLeft(cell, neighbors, result);

                result = RemoveOtherSetValues(cell, neighbors, result);

                result = FindOnlyValue(cell, neighbors, result);

                result = FindSetsInNeigbors(cell, neighbors, result);
            }

            return(result);
        }
Example #5
0
        private void FindSetsInBigNeighbors(ICell cell, List <ICell> neighbors, RulesResult result)
        {
            foreach (var listSet in ListSets)
            {
                List <ICell> possibleNeigbhors = new List <ICell>(neighbors);
                List <int>   removeValues      = new List <int>()
                {
                    1, 2, 3, 4, 5, 6, 7, 8, 9
                };
                foreach (var value in listSet)
                {
                    removeValues.Remove(value);
                }

                //remove anything that has values we don't want or is already set
                foreach (var valueToRemove in removeValues)
                {
                    for (int i = possibleNeigbhors.Count - 1; i >= 0; i--)
                    {
                        if (possibleNeigbhors[i].PossibleValues.Contains(valueToRemove) || possibleNeigbhors[i].PossibleValues.Count == 0)
                        {
                            possibleNeigbhors.RemoveAt(i);
                        }
                    }
                }

                //we have enough cells that contain only the values we need to remove the values from the neighbors
                if (possibleNeigbhors.Count >= listSet.Count)
                {
                    //verify the current cell is not part of the matched set so we only remove it from a neighbor
                    if (!possibleNeigbhors.Contains(cell))
                    {
                        for (int i = 0; i < listSet.Count; i++)
                        {
                            if (cell.PossibleValues.Contains(listSet[i]))
                            {
                                result.RemovedPossible.Add(listSet[i]);
                            }
                        }
                    }
                }
            }
        }
Example #6
0
        private RulesResult FindOnlyValue(ICell cell, List <ICell> neighbors, RulesResult result)
        {
            foreach (int value in cell.PossibleValues)
            {
                bool onlyValue = true;
                foreach (ICell localCell in neighbors)
                {
                    if (localCell.PossibleValues.Contains(value))
                    {
                        onlyValue = false;
                        break;
                    }
                }

                if (onlyValue)
                {
                    result.Value = value;
                    break;
                }
            }

            return(result);
        }
Example #7
0
        private RulesResult SetWhenOnly1ValueLeft(ICell cell, List <ICell> neighbors, RulesResult result)
        {
            if (cell.PossibleValues.Count == 1)
            {
                result.Value = cell.PossibleValues[0];
            }

            return(result);
        }