diff --git a/ExtraWidgits.py b/ExtraWidgits.py new file mode 100644 index 0000000..6536bcf --- /dev/null +++ b/ExtraWidgits.py @@ -0,0 +1,172 @@ +import pygame +import time +from threading import * +import SUDOKU +import N_Queen +import Knight_Tour + + +class Clock(Thread): + def __init__(self,screen,CordinateX,CordinateY,font,*args): + Thread.__init__(self) + self.screen = screen + self.CordinateX=CordinateX + self.CordinateY=CordinateY + self.ClockComplete=False + self.font=font + self.running=True + self.Clock=[0,0] + self.printTime= "00:00" + + def run(self): + try: + while(N_Queen.RunClock and Knight_Tour.RunClock and SUDOKU.RunClock): + pygame.font.init() + + myfont = pygame.font.SysFont('Comic Sans MS', self.font) + self.textsurface = myfont.render(self.printTime, False, (255, 255, 255)) + self.screen.blit(self.textsurface, (self.CordinateX-50, self.CordinateY)) + + myfont = pygame.font.SysFont('Comic Sans MS', self.font) + self.textsurface = myfont.render(" Time Escaped:", False, (255, 255, 255)) + self.screen.blit(self.textsurface, (self.CordinateX-120, self.CordinateY-30)) + + + time.sleep(1) + if not N_Queen.RunClock or not Knight_Tour.RunClock or not SUDOKU.RunClock: + break + textsurface = myfont.render(self.printTime, False, (0, 0, 0)) + self.screen.blit(textsurface, (self.CordinateX-50, self.CordinateY)) + + + if not self.ClockComplete: + + if self.Clock[1]==59: + + self.Clock[0]+=1 + self.Clock[1]=0 + if len(str(self.Clock[0])) == 1: + self.printTime = '0' + str(self.Clock[0]) + else: + self.printTime = str(self.Clock[0]) + self.printTime=str(self.Clock[0])+':'+ '0' + str(self.Clock[1]) + + else: + + self.Clock[1]+=1 + if len(str(self.Clock[0])) == 1 and len(str(self.Clock[1]))==1: + self.printTime='0'+str(self.Clock[0])+':' +'0' + str(self.Clock[1]) + elif len(str(self.Clock[1]))==1: + self.printTime=str(self.Clock[0])+':'+ '0' + str(self.Clock[1]) + elif len(str(self.Clock[0])) == 1: + self.printTime = '0'+str(self.Clock[0]) + ':' + str(self.Clock[1]) + else: + self.printTime = str(self.Clock[0])+ ':' + str(self.Clock[1]) + + myfont = pygame.font.SysFont('Comic Sans MS', self.font) + textsurface = myfont.render(self.printTime, False, (255, 255, 255)) + self.screen.blit(textsurface, (self.CordinateX-50, self.CordinateY)) + except: + pass + + + + +class MainMenuButton(Thread): + def __init__(self,screen,CordinateX,CordinateY,*args): + Thread.__init__(self) + self.X=CordinateX + self.Y=CordinateY + self.screen = screen + self.CordinateX=CordinateX + self.CordinateY=CordinateY + self.ClockComplete=False + + def run(self): + try: + while(True): + self.pos=pygame.mouse.get_pos() + + self.OnMainMenuButton=False + if self.pos[0] > self.X and self.pos[0] < self.X + 240 and self.pos[1] > self.Y and self.pos[1] < self.Y + 35: + self.OnMainMenuButton=True + + pygame.font.init() + + if self.OnMainMenuButton == False: + pygame.draw.rect(self.screen,(255,255,255),(self.X,self.Y,240,35)) + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render("Go Back to Main Menu", False, (0, 0, 0)) + self.screen.blit(textsurface, (self.X+17, self.Y)) + else: + pygame.draw.rect(self.screen,(0,0,0),(self.X,self.Y,240,35)) + pygame.draw.rect(self.screen,(255,255,255),(self.X,self.Y,240,35),3) + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render("Go Back to Main Menu", False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X+17, self.Y)) + pygame.event.get() + pygame.display.update() + except: + pass + + + +class ExitText(Thread): + def __init__(self,screen,CordinateX,CordinateY,*args): + Thread.__init__(self) + self.X=CordinateX + self.Y=CordinateY + self.screen = screen + self.CordinateX=CordinateX + self.CordinateY=CordinateY + self.ClockComplete=False + + def run(self): + try: + while(True): + pygame.font.init() + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render("Press Esc to Exit.", False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X+17, self.Y)) + except: + pass + + + +class OperationsDone: + def __init__(self,NoOfOperations,screen,X,Y,String): + try: + self.NoOfOperations=NoOfOperations + self.screen=screen + self.X=X + self.Y=Y + pygame.font.init() + + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render(String, False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X + 50, self.Y)) + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render("Operations Performed: "+str(self.NoOfOperations), False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X, self.Y+40)) + except: + pass + + +class OperationsDoneKnight: + def __init__(self,NoOfOperations,screen,X,Y,String): + try: + self.NoOfOperations=NoOfOperations + self.screen=screen + self.X=X + self.Y=Y + + pygame.font.init() + + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render(String, False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X+10, self.Y)) + myfont = pygame.font.SysFont('Comic Sans MS', 20) + textsurface = myfont.render("Operations Performed: "+str(self.NoOfOperations), False, (255, 255, 255)) + self.screen.blit(textsurface, (self.X, self.Y+40)) + except: + pass diff --git a/hnet.com-image.ico b/Images/hnet.com-image.ico similarity index 100% rename from hnet.com-image.ico rename to Images/hnet.com-image.ico diff --git a/Images/knight2.png b/Images/knight2.png new file mode 100644 index 0000000..76ec544 Binary files /dev/null and b/Images/knight2.png differ diff --git a/Images/queen.png b/Images/queen.png new file mode 100644 index 0000000..dd3ce19 Binary files /dev/null and b/Images/queen.png differ diff --git a/Knight_Tour.py b/Knight_Tour.py new file mode 100644 index 0000000..aac7b99 --- /dev/null +++ b/Knight_Tour.py @@ -0,0 +1,161 @@ +import pygame +from heapq import * +import random +import time +import ExtraWidgits +from threading import * +import StartProcess +import Knight_Tour + +RunClock=True + +class Knight(): + def __init__(self, v, speed): + self.n = v + self.cb = [[0 for x in range(v)] for y in range(v)] + self.ans = [] + self.speed = speed + self.WaitForEndProcess=True + self.operations=0 + self.running=True + + pygame.init() + self.SIDE = 600 + self.block = self.SIDE // self.n + self.win = pygame.display.set_mode((self.SIDE+450, self.SIDE)) + self.K_SIDE = (self.block * 3) // 4 + self.knight_img = pygame.image.load('Images/knight2.png') + self.knight_img = pygame.transform.scale(self.knight_img, (self.K_SIDE, self.K_SIDE)) + self.WHITE = (255, 255, 255) + self.BLACK = (0, 0, 0) + self.RED = (255, 0, 0) + pygame.display.set_caption("KNIGHT'S TOUR") + self.x = self.block // 2 + self.y = self.block // 2 + self.x1 = (self.block - self.K_SIDE) // 2 + self.line_w = -int(-70 // self.n) + + self.StartVisualization() + + + + def StartVisualization(self): + self.grid() + AddClock = ExtraWidgits.Clock(self.win, 850, 100, 25) + AddClock.start() + AddMainMenuButton = ExtraWidgits.MainMenuButton(self.win,700,300) + AddMainMenuButton.start() + AddExitText = ExtraWidgits.ExitText(self.win,725,250) + AddExitText.start() + StartSolving=Thread(target=self.solve) + StartSolving.start() + self.CheckActions() + + + + def CheckActions(self): + self.X = 700 + self.Y = 300 + while (self.running): + try: + self.pos = pygame.mouse.get_pos() + except: + pass + for event in pygame.event.get(): + if event.type==pygame.QUIT: + self.running=False + pygame.quit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + self.running = False + pygame.quit() + if self.pos[0] > self.X and self.pos[0] < self.X + 240 and self.pos[1] > self.Y and self.pos[ + 1] < self.Y + 35: + if event.type == pygame.MOUSEBUTTONDOWN: + try: + self.running=False + pygame.quit() + while(self.WaitForEndProcess): + pass + Process = StartProcess.START() + Process.start() + Knight_Tour.RunClock=True + except: + pass + + + def grid(self): + for i in range(self.n): + for j in range(self.n): + if not self.running: + break + if ((i + j) % 2 == 0): + color = self.WHITE + else: + color = self.BLACK + pygame.draw.rect(self.win, color, (i * self.block, j * self.block, self.block, self.block)) + if ([i, j] in self.ans): + color = (0, 180, 0) + pygame.draw.rect(self.win, (120, 255, 0), + (self.x1 + i * self.block, self.x1 + j * self.block, self.K_SIDE, self.K_SIDE)) + + + def show(self): + self.grid() + xx, yy = self.ans[0] + for i in range(1, len(self.ans)): + if not self.running: + break + tx, ty = self.ans[i] + pygame.draw.line(self.win, (255, 0, 0), (self.x + xx * self.block, self.x + yy * self.block), + (self.x + tx * self.block, self.x + ty * self.block), self.line_w) + xx, yy = self.ans[i] + self.win.blit(self.knight_img, (self.x1 + xx * self.block, self.x1 + yy * self.block)) + + + + def solve(self): + kx = random.randint(0, self.n - 1) + ky = random.randint(0, self.n - 1) + dx = [-2, -1, 1, 2, -2, -1, 1, 2] + dy = [1, 2, 2, 1, -1, -2, -2, -1] + for k in range(self.n ** 2): + if not self.running: + break + self.operations+=1 + self.cb[ky][kx] = k + 1 + self.ans.append([kx, ky]) + self.show() + if not self.running: + break + time.sleep(1/self.speed) + pq = [] + for i in range(8): + self.operations+=1 + if not self.running: + break + nx = kx + dx[i] + ny = ky + dy[i] + if 0 <= nx < self.n and 0 <= ny < self.n: + if self.cb[ny][nx] == 0: + ctr = 0 + for j in range(8): + self.operations+=1 + if not self.running: + break + ex = nx + dx[j] + ey = ny + dy[j] + if 0 <= ex < self.n and 0 <= ey < self.n: + if self.cb[ey][ex] == 0: ctr += 1 + heappush(pq, (ctr, i)) + if len(pq) > 0: + (p, m) = heappop(pq) + kx += dx[m] + ky += dy[m] + else: + break + if self.running: + ExtraWidgits.OperationsDoneKnight(self.operations, self.win, 700, 400, "Knight's Tour Completed.") + Knight_Tour.RunClock=False + self.WaitForEndProcess=False + return True diff --git a/MainMenu.py b/MainMenu.py index 311a616..b1ae68f 100644 --- a/MainMenu.py +++ b/MainMenu.py @@ -1,59 +1,39 @@ from tkinter import * from tkinter import messagebox from SortingAlgorithm import * - -class front: +import StartProcess +import N_Queen +from Knight_Tour import * +from SUDOKU import * +class Window: def __init__(self,root): self.root = root - self.root.geometry("650x300") + self.root.geometry("300x150") self.root.resizable(False, False) self.root.title("Algorithm Visualizer") - self.root.iconbitmap("hnet.com-image.ico") + self.root.iconbitmap("Images/hnet.com-image.ico") - self.AlgoTypeLabel = Label(self.root, text=' Select Algorithm Type:-', font=("Courier", 10)) - self.AlgoTypeLabel.grid(row=0, column=0 ,pady=15) + self.AlgoTypeLabel = Label(self.root, text='Select Algorithm Type:-', font=("Courier", 10)) + self.AlgoTypeLabel.pack(pady=2) self.AlgoTypeVar = StringVar() self.AlgoTypeVar.set("Select Algorithm Type") - self.AlgoTypeList = ["Select Algorithm Type", "Sorting Algorithm"] + self.AlgoTypeList = ["Select Algorithm Type", "Backtracking Algorithm","Sorting Algorithm"] self.AlgoTypeDrop = OptionMenu(self.root, self.AlgoTypeVar, *self.AlgoTypeList) - self.AlgoTypeDrop.grid(row=1, column=0) - - self.AlgoNameLabel = Label(self.root, text=' Select Algorithm Name:-', font=("Courier", 10)) - self.AlgoNameLabel.grid(row=0, column=2) - - self.AlgoNameVar = StringVar() - self.AlgoNameVar.set("Select Algorithm Name") - self.AlgoNameList = ["Select Algorithm Name", "Bubble Sort","Heap Sort","Insertion Sort","Selection Sort"] - self.AlgoNameDrop = OptionMenu(self.root,self.AlgoNameVar,*self.AlgoNameList) - self.AlgoNameDrop.grid(row=1, column=2) - - self.fill6 = Label(self.root, text="") - self.fill6.grid(row=2, column=0) + self.AlgoTypeDrop.pack(pady=10) - self.NoOfElementsLabel1 = Label(self.root, text=" Select Number of Elements:-", font=("Courier", 10)) - self.NoOfElementsLabel1.grid(row=3, column=0) - self.NoOfElementsLabel2 = Label(self.root, text="(from 5 to 160)") - self.NoOfElementsLabel2.grid(row=4, column=0) + self.NextButton = Button(self.root, text="Next>", command=self.SecondWindow) + self.NextButton.pack() - self.NoOfElementsSlider = Scale(self.root, from_= 5, to = 160, orient=HORIZONTAL, sliderlength=20, width=10) - self.NoOfElementsSlider.grid(row=5, column=0) - self.SpeedLabel1 = Label(self.root, text="Select Speed of Visualization:-", font=("Courier", 10)) - self.SpeedLabel1.grid(row=3, column=2) - self.SpeedLabel2 = Label(self.root, text="(in Operations per sec.)") - self.SpeedLabel2.grid(row=4,column=2) + def Exit(self): + self.root.destroy() - self.SpeedSlider = Scale(self.root, from_ = 1, to = 400, orient=HORIZONTAL, sliderlength=20, width=10) - self.SpeedSlider.grid(row=5, column=2) + def Back(self): + self.root.destroy() + Process = StartProcess.START() - self.fill1 = Label(self.root, text="") - self.fill1.grid(row=6,column=0) - self.fill2 = Label(self.root, text="") - self.fill2.grid(row=7,column=0) - - self.StartButton = Button(self.root, text="Start Visualization", padx=5,command=self.run) - self.StartButton.grid(row=8,column=1) + Process.start() def run(self): if self.AlgoNameVar.get() == "Select Algorithm Name" or self.AlgoTypeVar.get() == "Select Algorithm Type": @@ -63,4 +43,117 @@ def run(self): self.temp1=self.NoOfElementsSlider.get() self.temp2=self.SpeedSlider.get() self.root.destroy() - Sorting(self.temp1, self.temp2,self.AlgoNameVar.get()) \ No newline at end of file + Sorting(self.temp1, self.temp2,self.AlgoNameVar.get()) + + if self.AlgoNameVar.get() == "N-Queen": + self.temp1 = self.DimensionOfBoard.get() + self.temp2 = self.SpeedSlider.get() + self.root.destroy() + N_Queen.N_queen(self.temp1, self.temp2) + + if self.AlgoNameVar.get() == "Knight Tour": + self.temp1 = self.DimensionOfBoard.get() + self.temp2 = self.SpeedSlider.get() + self.root.destroy() + Knight(self.temp1, self.temp2) + if self.AlgoNameVar.get() == "SUDOKU": + self.temp1 = self.DimensionOfBoard.get() + self.temp2 = self.SpeedSlider.get() + self.root.destroy() + Sudoku(9, self.temp2) + + def SecondWindow(self): + if self.AlgoTypeVar.get()=="Select Algorithm Type": + messagebox.showerror("Incomplete Data!", "Please select Algorithm Type.") + elif self.AlgoTypeVar.get() == "Sorting Algorithm": + self.root.destroy() + self.root=Tk() + self.root.geometry("725x300") + self.root.resizable(False, False) + self.root.title(self.AlgoTypeVar.get()) + self.root.iconbitmap("Images/hnet.com-image.ico") + + self.AlgoNameLabel = Label(self.root, text=' Select Algorithm Name:-', pady=5, font=("Courier", 10)) + self.AlgoNameLabel.grid(row=0, column=1) + + self.AlgoNameVar = StringVar() + self.AlgoNameVar.set("Select Algorithm Name") + self.AlgoNameList = ["Select Algorithm Name", "Bubble Sort", "Heap Sort", "Insertion Sort", "Selection Sort"] + self.AlgoNameDrop = OptionMenu(self.root, self.AlgoNameVar, *self.AlgoNameList) + self.AlgoNameDrop.grid(row=1, column=1) + + self.fill6 = Label(self.root, text="") + self.fill6.grid(row=2, column=0) + + self.NoOfElementsLabel1 = Label(self.root, text=" Select Number of Elements:-", font=("Courier", 10)) + self.NoOfElementsLabel1.grid(row=3, column=0) + self.NoOfElementsLabel2 = Label(self.root, text="(from 5 to 160)") + self.NoOfElementsLabel2.grid(row=4, column=0) + + self.NoOfElementsSlider = Scale(self.root, from_=5, to=160, orient=HORIZONTAL, sliderlength=20, width=10) + self.NoOfElementsSlider.grid(row=5, column=0) + + self.SpeedLabel1 = Label(self.root, text="Select Speed of Visualization:-", font=("Courier", 10)) + self.SpeedLabel1.grid(row=3, column=2) + self.SpeedLabel2 = Label(self.root, text="(in Operations per sec.)") + self.SpeedLabel2.grid(row=4, column=2) + + self.SpeedSlider = Scale(self.root, from_=1, to=400, orient=HORIZONTAL, sliderlength=20, width=10) + self.SpeedSlider.grid(row=5, column=2) + + self.fill1 = Label(self.root, text="") + self.fill1.grid(row=6, column=0) + self.StartButton = Button(self.root, text="Start Visualization>", padx=5, command=self.run) + self.StartButton.grid(row=7, column=1) + self.fill2 = Label(self.root, text="") + self.fill2.grid(row=8, column=0) + + + self.BackButton = Button(self.root, text=" self.X and self.pos[0] < self.X + 240 and self.pos[1] > self.Y and self.pos[ + 1] < self.Y + 35: + if event.type == pygame.MOUSEBUTTONDOWN: + try: + self.running=False + pygame.quit() + while(self.WaitForEndProcess): + pass + Process = StartProcess.START() + Process.start() + N_Queen.RunClock=True + except: + pass + + + def grid(self): + for i in range(self.n): + for j in range(self.n): + if not self.running: + break + if ((i + j) % 2 == 0): + color = self.WHITE + else: + color = self.BLACK + pygame.draw.rect(self.win, color, (i * self.block, j * self.block, self.block, self.block)) + + def show(self): + self.grid() + for i in range(len(self.a)): + if not self.running: + break + self.win.blit(self.queen, (self.x + (self.a[i] - 1) * self.block, self.y + i * self.block)) + + + def attack_col(self, co): + + pygame.draw.rect(self.win, (255, 0, 0), + (self.block // 2 + (co - 1) * self.block, self.block // 2, 5, self.SIDE - self.block)) + + def attack_diagonal1(self, aa): + yy1 = aa - 1 + xx1 = 1 + if (aa > self.n): + yy1 = self.n + xx1 = aa - self.n + xx1 = self.block // 2 + self.block * (xx1 - 1) + yy1 = self.block // 2 + self.block * (yy1 - 1) + pygame.draw.line(self.win, (255, 0, 0), (xx1, yy1), (yy1, xx1), 7) + + def attack_diagonal2(self, aa): + yy1 = aa + xx1 = 0 + if (aa < 0): + yy1, xx1 = xx1, -yy1 + pygame.draw.line(self.win, (255, 0, 0), + (self.block // 2 + xx1 * self.block, self.block // 2 + yy1 * self.block), ( + self.block // 2 + (self.n - yy1 - 1) * self.block, + self.block // 2 + (self.n - xx1 - 1) * self.block), 7) + + def solve(self, i): + if (i == self.n): + boo = True + return 1 + r = i + 1 + for c in range(1, self.n + 1): + if not self.running: + break + self.operations+=1 + self.a.append(c) + self.show() + if not self.running: + break + time.sleep(1/self.speed) + if ((c in self.col) or (r + c in self.diagonal1) or (r - c in self.diagonal2)): + + if (c in self.col): + self.attack_col(c) + self.operations += 1 + if (r + c in self.diagonal1): + self.attack_diagonal1(r + c) + self.operations += 1 + if (r - c in self.diagonal2): + self.attack_diagonal2(r - c) + self.operations += 1 + if not self.running: + break + time.sleep(1/self.speed) + self.a.pop() + self.operations += 1 + continue + if not self.running: + break + self.col[c] = r + self.diagonal1[r + c] = r + self.diagonal2[r - c] = r + self.operations += 1 + if (self.solve(i + 1)): + OperationsDone(self.operations, self.win,700,400,"Queens Placed.") + N_Queen.RunClock=False + self.WaitForEndProcess=False + return 1 + self.a.pop() + self.operations += 1 + del self.diagonal1[r + c] + del self.col[c] + del self.diagonal2[r - c] + self.WaitForEndProcess=False + return 0 +''' +run=True +while(run): + + k=N_queen(9,17) + run=False +''' diff --git a/SUDOKU.py b/SUDOKU.py new file mode 100644 index 0000000..77b6697 --- /dev/null +++ b/SUDOKU.py @@ -0,0 +1,238 @@ +import pygame +import time +from threading import * +import ExtraWidgits +from random import randint +import StartProcess +import SUDOKU + +RunClock=True + +class Sudoku(): + def __init__(self,N,speed): + self.n=N + self.speed=speed + pygame.init() + self.SIDE=554;self.block=60 + self.win=pygame.display.set_mode((self.SIDE+450,self.SIDE)) + pygame.display.set_caption("SUDOKU") + self.WHITE=(250,250,250);self.BLACK=(135,206,250) + self.font=pygame.font.Font('freesansbold.ttf',45) + #Solved SUDOKU + self.solve_set=[ + [[9,5,1,7,6,8,3,2,4],[6,4,8,9,2,3,5,7,1],[3,2,7,1,4,5,8,9,6],[2,6,4,5,8,7,9,1,3], + [7,9,5,3,1,4,2,6,8],[1,8,3,6,9,2,7,4,5],[8,1,6,2,5,9,4,3,7],[4,7,2,8,3,1,6,5,9],[5,3,9,4,7,6,1,8,2]], + [[1,2,3,4,5,6,7,8,9],[4,5,6,7,8,9,1,2,3],[7,8,9,1,2,3,4,5,6],[2,1,4,3,6,5,8,9,7], + [3,6,5,8,9,7,2,1,4],[8,9,7,2,1,4,3,6,5],[5,3,1,6,4,2,9,7,8],[6,4,2,9,7,8,5,3,1],[9,7,8,5,3,1,6,4,2]], + [[1,2,3,7,8,9,6,5,4],[9,6,5,4,1,3,8,7,2],[4,8,7,2,6,5,9,3,1],[2,3,8,6,7,4,1,9,5], + [7,9,4,1,5,2,3,6,8],[6,5,1,9,3,8,4,2,7],[3,7,9,5,4,1,2,8,6],[5,1,2,8,9,6,7,4,3],[8,4,6,3,2,7,5,1,9]], + [[1,9,4,2,7,6,3,5,8],[2,6,8,3,9,5,7,1,4],[3,5,7,8,4,1,9,2,6],[7,4,2,6,1,9,5,8,3], + [8,1,6,7,5,3,4,9,2],[9,3,5,4,2,8,1,6,7],[6,8,9,1,3,4,2,7,5],[5,7,3,9,6,2,8,4,1],[4,2,1,5,8,7,6,3,9]]] + + self.solved=self.solve_set[randint(0,len(self.solve_set)-1)] + self.shift=7 + self.initial=[[0]*self.n for i in range(self.n)] + self.to_solve=[[0]*self.n for i in range(self.n)] + self.text_Pading_x=18;self.text_Pading_y=12 + self.running = True + self.operations=0 + self.WaitForEndProcess=True + self.StartVisualization() + + def StartVisualization(self): + + self.board() + self.initial_state(randint(40,60)) + + AddClock =ExtraWidgits.Clock(self.win, 800, 100, 25) + AddClock.start() + AddMainMenuButton =ExtraWidgits.MainMenuButton(self.win,650,300) + AddMainMenuButton.start() + AddExitText = ExtraWidgits.ExitText(self.win,675,250) + AddExitText.start() + StartSolving=Thread(target=self.solve) + StartSolving.start() + #self.solve() + self.CheckActions() + + + def CheckActions(self): + self.X = 700 + self.Y = 300 + while (self.running): + try: + self.pos = pygame.mouse.get_pos() + except: + pass + for event in pygame.event.get(): + if event.type==pygame.QUIT: + self.running=False + pygame.quit() + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + self.running = False + pygame.quit() + + if self.pos[0] > self.X and self.pos[0] < self.X + 240 and self.pos[1] > self.Y and self.pos[ + 1] < self.Y + 35: + if event.type == pygame.MOUSEBUTTONDOWN: + try: + self.running=False + pygame.quit() + while(self.WaitForEndProcess): + pass + Process = StartProcess.START() + Process.start() + SUDOKU.RunClock=True + except: + pass + + def print_Board(self): + for i in range(self.n): + for j in range(self.n): + if(self.to_solve[i][j]!=0): + self.print_Number(j,i,str(self.to_solve[i][j]),(0,0,0)) + + def print_Number(self,x,y,number,color,bgcolor=()): + x_shift=x//3*self.shift + y_shift=y//3*self.shift + if(len(bgcolor)==0): + if((x//3+y//3)%2==0): + bgcolor=self.BLACK + else: + bgcolor=self.WHITE + try: + self.win.blit(self.font.render(number, True,color,bgcolor),(self.text_Pading_x+x_shift+x*self.block,self.text_Pading_y+y_shift+y*self.block)) + except: + pass + def initial_state(self,NoOfElements): + AlreadyPresent={} + while(len(AlreadyPresent)