class TestValidate(unittest.TestCase): def testValidate(self): self.grid = numpy.array([['_', '_', '_', '4', '5', '1'], ['_', '2', '3', '4', '5', '2'], ['_', '2', '3', '4', '5', '3'], ['_', '2', '3', '4', '5', '4'], ['_', '2', '3', '4', '5', '5'], ['_', '_', '_', '_', '5', '6']]) self.grid2 = numpy.array([['1', '_', '_', '4'], ['_', '2', '3', '4'], ['1', '2', '3', '4'], ['_', '_', '_', '_']]) print(self.grid) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 6 self.solver2.puzzleSize = 6 self.solver1.puzzle = self.grid self.solver2.puzzle = self.grid self.assertTrue(self.solver2.validate(5,5)) self.assertTrue(self.solver1.validate(5,5)) self.assertFalse(self.solver2.validate(4,4)) self.assertFalse(self.solver1.validate(4,4)) self.assertTrue(self.solver2.validate(0,0)) self.assertTrue(self.solver1.validate(0,0)) self.assertFalse(self.solver2.validate(1,1)) self.assertFalse(self.solver1.validate(1,1))
class TestFindEmptyCells(unittest.TestCase): def testFindEmptyCells(self): self.grid2 = numpy.array([['1', '1', '_', '4', '5', '6'], ['_', '2', '_', '4', '5', '6'], ['_', '2', '3', '4', '5', '6'], ['_', '2', '3', '4', '5', '6'], ['1', '2', '3', '4', '5', '6'], ['_', '_', '_', '_', '5', '6']]) self.grid = numpy.array([['4', '2', '_', '1'], ['_', '_', '_', '2'], ['3', '_', '2', '_'], ['_', '4', '_', '3']]) print(self.grid) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid self.solver2.puzzle = self.grid result2 = self.solver2.getEmptyCells() result1 = self.solver1.getEmptyCells() print(result1) print(result2) self.assertEqual(result1, result2) print(self.grid2) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 6 self.solver2.puzzleSize = 6 self.solver1.puzzle = self.grid2 self.solver2.puzzle = self.grid2 result2 = self.solver2.getEmptyCells() result1 = self.solver1.getEmptyCells() print(result1) print(result2) self.assertEqual(result1, result2) self.grid = numpy.array([['4', '2', '5', '1'], ['6', 'q', '5', '2'], ['3', '5', '2', '0'], ['_', '4', '%', '3']]) print(self.grid) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid self.solver2.puzzle = self.grid result2 = self.solver2.getEmptyCells() result1 = self.solver1.getEmptyCells() self.assertEqual(result1, result2) print(result1) print(result2)
def onPuzzleClick(self, index): ''' Happens when a puzzle is selected from the list. ''' print(index.data()) if str(self.combo.currentText()) == "SudokuSolverOne": self.solver = SudokuSolverOne() else: self.solver = SudokuSolverTwo() fileObject = self.fileFactory.getFile(index.data()) tup = fileObject.load(index.data()) self.solver.setData(tup) self.graphicsView.scene.clear() self.graphicsView.setPuzzle(self.solver.puzzle) self.btnSolve.setEnabled(True) self.btnSave.setEnabled(False)
class MainWindow(QtWidgets.QWidget): def __init__(self): super(MainWindow, self).__init__() self.fileFactory = FileFactory() self.setWindowTitle("Sudoku Hero") self.resize(1000,700) self.initUI() def initUI(self): ''' Set up the controls for the window. ''' layout = QtWidgets.QVBoxLayout() hbox = QtWidgets.QHBoxLayout() vbox2 = QtWidgets.QVBoxLayout() vbox3 = QtWidgets.QVBoxLayout() vbox = QtWidgets.QVBoxLayout() self.btnLoad = QtWidgets.QPushButton("Load Puzzles", self) self.btnSolve = QtWidgets.QPushButton("Solve", self) self.btnSave = QtWidgets.QPushButton("Save Result", self) self.btnSolve.setEnabled(False) self.btnSave.setEnabled(False) self.puzzleList = QtWidgets.QListWidget(self) self.puzzleList.setViewMode(Qt.QListView.IconMode) self.graphicsView = PuzzleWidget(self) self.combo = QtWidgets.QComboBox(self) self.combo.addItem("SudokuSolverOne") self.combo.addItem("SudokuSolverTwo") self.comboSave = QtWidgets.QComboBox(self) self.comboSave.addItem("Joins & Maps") self.comboSave.addItem("Row-based") label = QtWidgets.QLabel("Select <i>solving</i> method:", self) lblSave = QtWidgets.QLabel("Select <i>saving</i> method:", self) self.puzzleList.setFixedHeight(80) self.puzzleList.setMinimumWidth(700) hbox.addWidget(self.puzzleList) vbox2.addWidget(self.btnLoad) vbox3.addWidget(label) vbox3.addWidget(self.combo) vbox3.addWidget(lblSave) vbox3.addWidget(self.comboSave) hbox.addStretch(1) hbox.addLayout(vbox3) vbox2.addWidget(self.btnSolve) vbox2.addWidget(self.btnSave) vbox.addWidget(self.graphicsView) vbox.addLayout(hbox) hbox.addLayout(vbox2) layout.addLayout(vbox) self.setLayout(layout) # Event handlers self.btnLoad.clicked.connect(self.onClick) self.btnSolve.clicked.connect(self.onSolve) self.btnSave.clicked.connect(self.onSave) self.puzzleList.clicked.connect(self.onPuzzleClick) def onSolve(self): ''' Happens when the "Solve" button is clicked. ''' self.solver.trigger.connect(self.graphicsView.updateCell) self.solver.finished.connect(self.graphicsView.finished) self.solver.finished.connect(self.finished) self.solver.start() def onSave(self): ''' Happens when the "Save" button is clicked. ''' #if str(self.comboSave.currentText()) == "Joins & Maps": # self.saver = SimpleSaver() #else: # self.saver = ComplicatedSaver() filename = QtWidgets.QFileDialog.getSaveFileName( \ self, 'Save puzzle as...', '', 'Text Files (*.txt)') #self.saver.savePuzzle(self.solver.puzzle, filename[0]) saveObject = self.fileFactory.saveFile(\ str(self.comboSave.currentText())) saveObject.savePuzzle(self.solver.puzzle, filename[0]) def onClick(self): ''' Happens when the "Load Puzzles" button is clicked. ''' filenames = QtWidgets.QFileDialog.getOpenFileNames( \ self, 'Select puzzles', '', 'Text Files (*.txt)') print(type(filenames)) for _file in filenames[0]: listItem = QtWidgets.QListWidgetItem(_file) self.puzzleList.addItem(listItem) def onPuzzleClick(self, index): ''' Happens when a puzzle is selected from the list. ''' print(index.data()) if str(self.combo.currentText()) == "SudokuSolverOne": self.solver = SudokuSolverOne() else: self.solver = SudokuSolverTwo() fileObject = self.fileFactory.getFile(index.data()) tup = fileObject.load(index.data()) self.solver.setData(tup) self.graphicsView.scene.clear() self.graphicsView.setPuzzle(self.solver.puzzle) self.btnSolve.setEnabled(True) self.btnSave.setEnabled(False) def finished(self, msg): ''' Happens when a puzzle is finished being solved. ''' if msg == "SOLVED": self.btnSave.setEnabled(True)
def testGetBox(self): self.grid = numpy.array([['1', '_', '_', '4', '5', '6'], ['_', '2', '3', '4', '5', '6'], ['_', '2', '3', '4', '5', '6'], ['_', '2', '3', '4', '5', '6'], ['1', '2', '3', '4', '5', '6'], ['_', '_', '_', '_', '5', '6']]) self.grid2 = numpy.array([['1', '_', '_', '4'], ['_', '2', '3', '4'], ['1', '2', '3', '4'], ['_', '_', '_', '_']]) print(self.grid) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 6 self.solver2.puzzleSize = 6 self.solver1.puzzle = self.grid self.solver2.puzzle = self.grid result2 = self.solver2.getBox(5,5) result1 = self.solver1.getBox(5,5) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, result2) print(self.grid2) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid2 self.solver2.puzzle = self.grid2 result2 = self.solver2.getBox(2,3) result1 = self.solver1.getBox(2,3) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, result2) print(self.grid2) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid2 self.solver2.puzzle = self.grid2 result2 = self.solver2.getBox(3,3) result1 = self.solver1.getBox(3,3) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, result2) print(self.grid2) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid2 self.solver2.puzzle = self.grid2 result2 = self.solver2.getBox(0,0) result1 = self.solver1.getBox(0,0) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, result2) self.grid3 = numpy.array([['_', '_', '_', '_'], ['_', '_', '_', '_'], ['_', '_', '_', '_'], ['_', '_', '_', '_']]) print(self.grid3) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid3 self.solver2.puzzle = self.grid3 result2 = self.solver2.getBox(1,1) result1 = self.solver1.getBox(3,3) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, set()) self.assertEqual(result2, set()) self.grid4 = numpy.array([['X', '_', '_', '_'], ['_', '_', '_', '_'], ['Y', 'J', '_', 'T'], ['_', '_', '_', '_']]) print(self.grid4) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid4 self.solver2.puzzle = self.grid4 result2 = self.solver2.getBox(1,1) result1 = self.solver1.getBox(0,3) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result1, set(['Y','J'])) self.assertEqual(result2, set(['X'])) self.grid4 = numpy.array([['X', '_', '_', '_'], ['_', '_', '_', '_'], ['Y', 'J', '_', 'T'], ['_', '_', '_', '_']]) print(self.grid4) self.solver2 = SudokuSolverTwo() self.solver1 = SudokuSolverOne() self.solver1.puzzleSize = 4 self.solver2.puzzleSize = 4 self.solver1.puzzle = self.grid4 self.solver2.puzzle = self.grid4 result2 = self.solver1.getBox(0,3) result1 = self.solver2.getBox(1,1) print("Solver1 =>",result1) print("Solver2 =>",result2) self.assertEqual(result2, set(['Y','J'])) self.assertEqual(result1, set(['X']))