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