/// <summary> /// Delete's a slot's text out of all it's row/column/box's possibleEntries. /// </summary> /// <param name="senderControl"></param> static public void RemoveNeighbors(SudokuSlot senderControl, List <SudokuSlot> slotList, SolveHistory history, Queue <SudokuSlot> queueToClean) { foreach (SudokuSlot slot in slotList) { if (slot.row == senderControl.row & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) { queueToClean.Enqueue(slot); } } else if (slot.column == senderControl.column & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) { queueToClean.Enqueue(slot); } } else if (slot.box == senderControl.box & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) { queueToClean.Enqueue(slot); } } history.AddSnapshot(slotList); } if (queueToClean.Count > 0) { RemoveNeighbors(queueToClean.Dequeue(), slotList, history, queueToClean); } }
/// <summary> /// Delete's a slot's text out of all it's row/column/box's possibleEntries. /// </summary> /// <param name="senderControl"></param> public static void RemoveNeighbors(SudokuSlot senderControl, List<SudokuSlot> slotList, SolveHistory history, Queue<SudokuSlot> queueToClean) { foreach (SudokuSlot slot in slotList) { if (slot.row == senderControl.row & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) queueToClean.Enqueue(slot); } else if (slot.column == senderControl.column & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) queueToClean.Enqueue(slot); } else if (slot.box == senderControl.box & slot != senderControl) { if (slot.RemovePossibleEntry(senderControl.Text) == true) queueToClean.Enqueue(slot); } history.AddSnapshot(slotList); } if (queueToClean.Count > 0) RemoveNeighbors(queueToClean.Dequeue(), slotList, history, queueToClean); }
// Determines whether the keystroke is contained in slot's Possible Entries. private void IsValidEntry(object sender, KeyEventArgs e) { SudokuSlot senderControl = (SudokuSlot)sender; if (e.KeyCode != Keys.Back && e.KeyCode != Keys.Delete) { // If the key is in the slot's possible entries, process it try { if (this.possibleEntries.Contains(keyValues[e.KeyValue])) { this.Text = keyValues[e.KeyValue].ToString(); } } catch { senderControl.Text = senderControl.Text; } } }
// Controls movement keys and calling individual slot's Validation method private void sudokuSlot_KeyDown(object sender, KeyEventArgs e) { SudokuSlot senderControl = (SudokuSlot)sender; //Navigation if (e.KeyCode == Keys.Down) { foreach (SudokuSlot slot in allSlots) { if (senderControl.row == 9) { if (slot.TabIndex == senderControl.TabIndex - 72) { slot.Focus(); break; } } else if (slot.TabIndex == senderControl.TabIndex + 9) { slot.Focus(); break; } } } else if (e.KeyCode == Keys.Up) { foreach (SudokuSlot slot in allSlots) { if (senderControl.row == 1) { if (slot.TabIndex == senderControl.TabIndex + 72) { slot.Focus(); break; } } else if (slot.TabIndex == senderControl.TabIndex - 9) { slot.Focus(); break; } } } else if (e.KeyCode == Keys.Right) { foreach (SudokuSlot slot in allSlots) { if (senderControl.row == 9 & senderControl.column == 9) { if (slot.TabIndex == senderControl.TabIndex - 80) { slot.Focus(); break; } } else if (slot.TabIndex == senderControl.TabIndex + 1) { slot.Focus(); break; } } } else if (e.KeyCode == Keys.Left) { foreach (SudokuSlot slot in allSlots) { if (senderControl.row == 1 & senderControl.column == 1) { if (slot.TabIndex == senderControl.TabIndex + 80) { slot.Focus(); break; } } else if (slot.TabIndex == senderControl.TabIndex - 1) { slot.Focus(); break; } } } // Send anything else to validation. else { string oldEntry = senderControl.Text; senderControl.SudokuSlot_KeyDown(sender, e); } }
// Call slot's specific KeyPress event private void sudokuSlot_KeyPress(object sender, KeyPressEventArgs e) { SudokuSlot senderControl = (SudokuSlot)sender; senderControl.SudokuSlot_KeyPress(sender, e); }