Exemplo n.º 1
0
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))
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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)        
Exemplo n.º 5
0
    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']))