Advertisement
AlfonsoPEREZ

Sudoku Solver Python

May 4th, 2020
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.21 KB | None | 0 0
  1. from tkinter import *
  2.  
  3. root = Tk()
  4. root.geometry('275x283')
  5.  
  6.  
  7. # Solve the Sudoku
  8. class SolveSudoku():
  9.    
  10.  
  11.     def __init__(self):
  12.         self.allZero()
  13.         self.startSolution()
  14.  
  15.  
  16.     def allZero(self):
  17.         for i in range(9):
  18.             for j in range(9):
  19.                 if savedNumbers[i][j].get() not in ['1','2','3','4','5','6','7','8','9']:
  20.                     savedNumbers[i][j].set(0)
  21.  
  22.  
  23.     def startSolution(self, i=0, j=0):
  24.         i,j = self.findNextCellToFill(i, j)
  25.  
  26.         if i == -1:
  27.             return True
  28.         for e in range(1,10):
  29.             if self.isValid(i,j,e):
  30.                 savedNumbers[i][j].set(e)
  31.                 if self.startSolution(i, j):
  32.                     return True
  33.                 savedNumbers[i][j].set(0)
  34.         return False
  35.  
  36.     def findNextCellToFill(self, i, j):
  37.  
  38.         for x in range(i,9):
  39.             for y in range(j,9):
  40.                 if savedNumbers[x][y].get() == '0':
  41.                     return x,y
  42.  
  43.         for x in range(0,9):
  44.             for y in range(0,9):
  45.                 if savedNumbers[x][y].get() == '0':
  46.                     return x,y
  47.  
  48.         return -1,-1
  49.  
  50.  
  51.     def isValid(self, i, j, e):
  52.  
  53.         for x in range(9):
  54.             if savedNumbers[i][x].get() == str(e):
  55.                 return False
  56.  
  57.         for x in range(9):
  58.             if savedNumbers[x][j].get() == str(e):
  59.                 return False
  60.  
  61.         secTopX, secTopY = 3 *int((i/3)), 3 *int((j/3))
  62.         for x in range(secTopX, secTopX+3):
  63.             for y in range(secTopY, secTopY+3):
  64.                 if savedNumbers[x][y].get() == str(e):
  65.                     return False
  66.        
  67.         return True
  68.        
  69.  
  70.  
  71.  
  72. class Launch():
  73.     def __init__(self, master):
  74.         self.master = master
  75.         master.title("Sudoku Solver thing majiggy")
  76.  
  77.         font = ('Arial', 18)
  78.         color = 'white'
  79.         px, py = 0, 0
  80.  
  81.         self.__table = []
  82.         for i in range(1,10):
  83.             self.__table += [[0,0,0,0,0,0,0,0,0]]
  84.  
  85.         for i in range(0,9):
  86.             for j in range(0,9):
  87.                
  88.                 if (i < 3 or i > 5) and (j < 3 or j > 5):
  89.                     color = 'gray'
  90.                 elif i in [3,4,5] and j in [3,4,5]:
  91.                     color = 'gray'
  92.                 else:
  93.                     color = 'white'
  94.  
  95.                 self.__table[i][j] = Entry(master, width = 2, font = font, bg = color, cursor = 'arrow', borderwidth = 0,
  96.                                           highlightcolor = 'yellow', highlightthickness = 1, highlightbackground = 'black',
  97.                                           textvar = savedNumbers[i][j])
  98.                 self.__table[i][j].bind('<Motion>', self.correctGrid)
  99.                 self.__table[i][j].bind('<FocusIn>', self.correctGrid)
  100.                 self.__table[i][j].bind('<Button-1>', self.correctGrid)
  101.                 self.__table[i][j].grid(row=i, column=j)
  102.  
  103.  
  104.         menu = Menu(master)
  105.         master.config(menu = menu)
  106.  
  107.         file = Menu(menu)
  108.         menu.add_cascade(label = 'File', menu = file)
  109.         file.add_command(label = 'Exit', command = master.quit)
  110.         file.add_command(label = 'Solve', command = self.solveInput)
  111.         file.add_command(label = 'Clear', command = self.clearAll)
  112.  
  113.     def correctGrid(self, event):
  114.         for i in range(9):
  115.             for j in range(9):
  116.                 if savedNumbers[i][j].get() == '':
  117.                     continue
  118.                 if len(savedNumbers[i][j].get()) > 1 or savedNumbers[i][j].get() not in ['1','2','3','4','5','6','7','8','9']:
  119.                     savedNumbers[i][j].set('')
  120.  
  121.  
  122.     def clearAll(self):
  123.         for i in range(9):
  124.             for j in range(9):
  125.                 savedNumbers[i][j].set('')
  126.  
  127.     def solveInput(self):
  128.         solution = SolveSudoku()
  129.  
  130. savedNumbers = []
  131. for i in range(1,10):
  132.     savedNumbers += [[0,0,0,0,0,0,0,0,0]]
  133. for i in range(0,9):
  134.     for j in range(0,9):
  135.         savedNumbers[i][j] = StringVar(root)
  136.  
  137.  
  138. app = Launch(root)
  139. root.mainloop()
  140. #PLEASE CHECK OUT MY YT VIDEO ABOUT THIS, https://www.youtube.com/watch?v=vJgIuACk7uE
  141. #####################################################################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement