private void calculate() { bool foundAnswer = false; //verticals foreach (List<TextBox> row in verticals) { List<int> prefilleds = new List<int>(); List<int> leftovers = new List<int>(); foreach (TextBox box in row) { if (box.Text != "") { prefilleds.Add(Convert.ToInt32(box.Text)); } } for (int i = 1; i <= 9; i++) { bool canFill = true; foreach (int prefilled in prefilleds) { if (i == prefilled) canFill = false; } if (canFill) leftovers.Add(i); } List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>(); foreach (TextBox box in row) { List<int> Leftovers = leftovers; if (box.Text == "") { for (int i = 0; i <= Leftovers.Count - 1; i++) { int leftover = Leftovers[i]; bool canPlace = true; bool _CanPlace = true; bool _canPlace = true; int xValue = getTextBoxXY(box).Item1; int zValue = getTextBoxXY(box).Item3; foreach (TextBox checkBox in horizontals[xValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _canPlace = false; } foreach (TextBox checkBox in squares[zValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _CanPlace = false; } if (_CanPlace == false || _canPlace == false) canPlace = false; if (canPlace) { boxOver.Add(new Tuple<TextBox, int>(box, leftover)); } } } } List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>(); foreach (Tuple<TextBox, int> tuple in boxOver) { if (tuple.Item2 == 1) { s1.Add(tuple); } if (tuple.Item2 == 2) s2.Add(tuple); if (tuple.Item2 == 3) s3.Add(tuple); if (tuple.Item2 == 4) s4.Add(tuple); if (tuple.Item2 == 5) s5.Add(tuple); if (tuple.Item2 == 6) s6.Add(tuple); if (tuple.Item2 == 7) s7.Add(tuple); if (tuple.Item2 == 8) s8.Add(tuple); if (tuple.Item2 == 9) s9.Add(tuple); } List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>(); tupList.Add(s1); tupList.Add(s2); tupList.Add(s3); tupList.Add(s4); tupList.Add(s5); tupList.Add(s6); tupList.Add(s7); tupList.Add(s8); tupList.Add(s9); foreach (List<Tuple<TextBox, int>> tups in tupList) { if (tups.Count == 1) { tups[0].Item1.Text = tups[0].Item2.ToString(); foundAnswer = true; } } } //horizontals foreach (List<TextBox> row in horizontals) { List<int> prefilleds = new List<int>(); List<int> leftovers = new List<int>(); foreach (TextBox box in row) { if (box.Text != "") { prefilleds.Add(Convert.ToInt32(box.Text)); } } for (int i = 1; i <= 9; i++) { bool canFill = true; foreach (int prefilled in prefilleds) { if (i == prefilled) canFill = false; } if (canFill) leftovers.Add(i); } List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>(); foreach (TextBox box in row) { List<int> Leftovers = leftovers; if (box.Text == "") { for (int i = 0; i <= Leftovers.Count - 1; i++) { int leftover = Leftovers[i]; bool canPlace = true; bool _canPlace = true; bool _CanPlace = true; int xValue = getTextBoxXY(box).Item2; int zValue = getTextBoxXY(box).Item3; foreach (TextBox checkBox in verticals[xValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _canPlace = false; } foreach (TextBox checkBox in squares[zValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _CanPlace = false; } if (_CanPlace == false || _canPlace == false) canPlace = false; if (canPlace) { boxOver.Add(new Tuple<TextBox, int>(box, leftover)); } } } } List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>(); foreach (Tuple<TextBox, int> tuple in boxOver) { if (tuple.Item2 == 1) { s1.Add(tuple); } if (tuple.Item2 == 2) s2.Add(tuple); if (tuple.Item2 == 3) s3.Add(tuple); if (tuple.Item2 == 4) s4.Add(tuple); if (tuple.Item2 == 5) s5.Add(tuple); if (tuple.Item2 == 6) s6.Add(tuple); if (tuple.Item2 == 7) s7.Add(tuple); if (tuple.Item2 == 8) s8.Add(tuple); if (tuple.Item2 == 9) s9.Add(tuple); } List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>(); tupList.Add(s1); tupList.Add(s2); tupList.Add(s3); tupList.Add(s4); tupList.Add(s5); tupList.Add(s6); tupList.Add(s7); tupList.Add(s8); tupList.Add(s9); foreach (List<Tuple<TextBox, int>> tups in tupList) { if (tups.Count == 1) { tups[0].Item1.Text = tups[0].Item2.ToString(); foundAnswer = true; } } } //boxes foreach (List<TextBox> square in squares) { List<int> prefilleds = new List<int>(); List<int> leftovers = new List<int>(); foreach (TextBox box in square) { if (box.Text != "") { prefilleds.Add(Convert.ToInt32(box.Text)); } } for (int i = 1; i <= 9; i++) { bool canFill = true; foreach (int prefilled in prefilleds) { if (i == prefilled) canFill = false; } if (canFill) leftovers.Add(i); } List<Tuple<TextBox, int>> boxOver = new List<Tuple<TextBox, int>>(); foreach (TextBox box in square) { List<int> Leftovers = leftovers; if (box.Text == "") { for (int i = 0; i <= Leftovers.Count - 1; i++) { int leftover = Leftovers[i]; bool _canPlace = true; bool _CanPlace = true; bool _Canplace = true; bool canPlace = true; int xValue = getTextBoxXY(box).Item1; int yValue = getTextBoxXY(box).Item2; foreach (TextBox checkBox in horizontals[xValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _canPlace = false; } foreach (TextBox checkBox in verticals[yValue - 1]) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _CanPlace = false; } foreach (TextBox checkBox in square) { if (checkBox.Name != box.Name) if (checkBox.Text == leftover.ToString()) _Canplace = false; } if (_CanPlace == false || _canPlace == false || _Canplace == false) canPlace = false; if (canPlace) { boxOver.Add(new Tuple<TextBox, int>(box, leftover)); } } } } List<Tuple<TextBox, int>> s1 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s2 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s3 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s4 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s5 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s6 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s7 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s8 = new List<Tuple<TextBox, int>>(); List<Tuple<TextBox, int>> s9 = new List<Tuple<TextBox, int>>(); foreach (Tuple<TextBox, int> tuple in boxOver) { if (tuple.Item2 == 1) { s1.Add(tuple); } if (tuple.Item2 == 2) s2.Add(tuple); if (tuple.Item2 == 3) s3.Add(tuple); if (tuple.Item2 == 4) s4.Add(tuple); if (tuple.Item2 == 5) s5.Add(tuple); if (tuple.Item2 == 6) s6.Add(tuple); if (tuple.Item2 == 7) s7.Add(tuple); if (tuple.Item2 == 8) s8.Add(tuple); if (tuple.Item2 == 9) s9.Add(tuple); } List<List<Tuple<TextBox, int>>> tupList = new List<List<Tuple<TextBox, int>>>(); tupList.Add(s1); tupList.Add(s2); tupList.Add(s3); tupList.Add(s4); tupList.Add(s5); tupList.Add(s6); tupList.Add(s7); tupList.Add(s8); tupList.Add(s9); foreach (List<Tuple<TextBox, int>> tups in tupList) { poss.Add(tups); if (tups.Count == 1) { tups[0].Item1.Text = tups[0].Item2.ToString(); foundAnswer = true; } } } if (foundAnswer == false) { if(resetAfter) { foreach(Tuple<TextBox, string> tup in save.Boxes) { tup.Item1.Text = tup.Item2; } } save = CreateSaveState(); bool found = false; foreach (List<TextBox> lbox in verticals) { foreach (TextBox box in lbox) { if (box.Text == "" && found == false) { bool canAnswer = true; for (int i = 1; i <= 9 && found == false; i++) { canAnswer = true; bool keepChecking = true; foreach (Tuple<TextBox, int> tup in guesses) { if (tup.Item1.Name == box.Name) { if (i == tup.Item2) { canAnswer = false; } } } if (canAnswer) { foreach (List<Tuple<TextBox, int>> tups in poss) { if (keepChecking) { foreach (Tuple<TextBox, int> tup in tups) { if (tup.Item1.Name == box.Name) { if (i != tup.Item2) { canAnswer = false; } else { canAnswer = true; keepChecking = false; } } } } } } if (canAnswer) { box.Text = i.ToString(); resetAfter = true; guesses.Add(new Tuple<TextBox, int>(box, i)); found = true; } } } } } } }
private SaveState CreateSaveState() { SaveState savestate = new SaveState(); savestate.Boxes = new List<Tuple<TextBox, string>>(); foreach(List<TextBox> list1 in verticals) { foreach (TextBox box in list1) { savestate.Boxes.Add(new Tuple<TextBox, string>(box, box.Text)); } } return savestate; }