Untitled

 avatar
unknown
python
3 years ago
18 kB
5
Indexable
import pygame
from settings import *
import threading
import time

threadLock = threading.Lock()
Matrix = [[-1 for x in range(21)] for y in range(21)] 
for yidx, row in enumerate(board):
            for xidx, num in enumerate(row):
                if num == '*':
                  Matrix[yidx][xidx] = 0
                else:
                    if num == '1':
                        Matrix[yidx][xidx] = 1
                    if num == '2':
                        Matrix[yidx][xidx] = 2
                    if num == '3':
                        Matrix[yidx][xidx] = 3
                    if num == '4':
                        Matrix[yidx][xidx] = 4
                    if num == '5':
                        Matrix[yidx][xidx] = 5
                    if num == '6':
                        Matrix[yidx][xidx] = 6
                    if num == '7':
                        Matrix[yidx][xidx] = 7
                    if num == '8':
                        Matrix[yidx][xidx] = 8
                    if num == '9':
                        Matrix[yidx][xidx] = 9


class App:
    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((800, 800))
        self.running = True
        self.grid = board
        self.selected = None
        self.mousePos = None
        self.font = pygame.font.SysFont("arial", cellSize//2)

    def run(self):
        while self.running:
            self.events()
            self.update()
            self.draw()

        pygame.quit()
        SystemExit()

    def events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                selected = self.mouseOnGrid()
                if selected:
                    print(self.mouseOnGrid())
                    self.selected = selected
                else:
                    print("not on board")
                    self.selected = None

    def update(self):
        self.mousePos = pygame.mouse.get_pos()

    def draw(self):
        self.window.fill(WHITE)
        if self.selected:
            self.drawSelection(self.window, self.selected)
        self.drawNumbers(self.window)

        self.drawGrid(self.window)
        pygame.display.update()

    def drawNumbers(self, window):
        for yidx, row in enumerate(self.grid):
            for xidx, num in enumerate(row):
                if yidx <= 8 and xidx <= 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0],
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if xidx >= 9 and yidx >= 6 and yidx <= 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0],
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if xidx >= 9 and xidx <= 11 and yidx >= 12 and yidx <= 14:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0],
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if yidx >= 9 and yidx <= 11 and xidx <= 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0]+180,
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if yidx <= 5 and xidx > 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0]+90,
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if yidx >= 12 and yidx <= 14 and xidx > 11:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0],
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if yidx > 14 and xidx > 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0]+90,
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)
                if yidx >= 12 and xidx <= 8:
                    if num != "*":
                        pos = [(xidx*cellSize)+gridPos[0],
                               (yidx*cellSize)+gridPos[1]]
                        self.textToScreen(window, str(num), pos)

    def drawSelection(self, window, pos):
        pygame.draw.rect(window, LightBlue, ((
            pos[0]*cellSize)+gridPos[0], (pos[1]*cellSize)+gridPos[1], cellSize, cellSize))

    def drawGrid(self, window):
        pygame.draw.rect(window, Black, (gridPos[0], gridPos[1], 630, 630), 2)
        for x in range(10):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[1]), (gridPos[0]+(
                x*cellSize), gridPos[1]+270), 2 if x % 3 == 0 else 1)
            pygame.draw.line(window, Black, (gridPos[0], gridPos[1]+(
                x*cellSize)), (gridPos[0]+270, gridPos[1]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(12, 22):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[1]), (gridPos[0]+(
                x*cellSize), gridPos[1]+270), 2 if x % 3 == 0 else 1)
        for x in range(10):
            pygame.draw.line(window, Black, (gridPos[2], gridPos[1]+(
                x*cellSize)), (gridPos[2]+270, gridPos[1]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(10):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[3]), (gridPos[0]+(
                x*cellSize), gridPos[3]+270), 2 if x % 3 == 0 else 1)
            pygame.draw.line(window, Black, (gridPos[0], gridPos[3]+(
                x*cellSize)), (gridPos[0]+270, gridPos[3]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(12, 22):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[3]), (gridPos[0]+(
                x*cellSize), gridPos[3]+270), 2 if x % 3 == 0 else 1)
        for x in range(10):
            pygame.draw.line(window, Black, (gridPos[2], gridPos[3]+(
                x*cellSize)), (gridPos[2]+270, gridPos[3]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(6, 16):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[5]), (gridPos[0]+(
                x*cellSize), gridPos[5]+90), 2 if x % 3 == 0 else 1)
        for x in range(4):
            pygame.draw.line(window, Black, (gridPos[4], gridPos[5]+(
                x*cellSize)), (gridPos[4]+270, gridPos[5]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(9, 12):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[6]), (gridPos[0]+(
                x*cellSize), gridPos[6]+90), 2 if x % 3 == 0 else 1)
        for x in range(3):
            pygame.draw.line(window, Black, (gridPos[7], gridPos[6]+(
                x*cellSize)), (gridPos[7]+90, gridPos[6]+(x*cellSize)), 2 if x % 3 == 0 else 1)
        for x in range(9, 12):
            pygame.draw.line(window, Black, (gridPos[0]+(x*cellSize), gridPos[3]), (gridPos[0]+(
                x*cellSize), gridPos[3]+90), 2 if x % 3 == 0 else 1)
        for x in range(4):
            pygame.draw.line(window, Black, (gridPos[7], gridPos[3]+(
                x*cellSize)), (gridPos[7]+90, gridPos[3]+(x*cellSize)), 2 if x % 3 == 0 else 1)

    def mouseOnGrid(self):
        if self.mousePos[0] < gridPos[0] or self.mousePos[1] < gridPos[1]:
            return False
        if self.mousePos[0] > gridPos[0]+gridSize or self.mousePos[1] > gridPos[1]+gridSize:
            return False
        return((self.mousePos[0]-gridPos[0])//cellSize, (self.mousePos[1]-gridPos[1])//cellSize)

    def textToScreen(self, window, text, pos):
        font = self.font.render(text, False, Black)
        fontWidth = font.get_width()
        fontHeight = font.get_height()
        pos[0] += (cellSize-fontWidth)//2
        pos[1] += (cellSize-fontHeight)//2
        window.blit(font, pos)


def checkNumber(x, y, n):
    global Matrix
  # up-left sudoku
    if(x < 9 and y < 9):
        # joint square
        if (x > 5 and y > 5):
            for i in range(0, 15):
                #print(board[y][i])
                if Matrix[y][i] == n:
                    return False

            for i in range(0, 15):
                #print(board[i][x])
                if Matrix[i][x] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3
            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
        else:
            for i in range(0, 9):
                #print(board[y][i])
                if Matrix[y][i] == n:
                    return False

            for i in range(0, 9):

                #print(board[i][x])
                if Matrix[i][x] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3

            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
    # up-right sudoku
    if(x > 8 and y < 9):
        if (y > 5 and x > 14):
            for i in range(12, 21):
                if Matrix[y][i] == n:
                    return False
            for i in range(0, 6):
                if Matrix[i][x-3] or Matrix[6][x] or Matrix[7][x] or Matrix[8][x] == n:
                    return False
            x0 = (x//3)*3
            y0 = (y//3)*3

            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
                return True
        # joint square
        elif (x > 11 and x < 15 and y > 5):
            for i in range(6, 21):

                if Matrix[y][i] == n:
                    return False

            for i in range(0, 6):
                if Matrix[i][x-3] or Matrix[9][x-6] or Matrix[10][x-6] or Matrix[11][x-6] or Matrix[12][x] or Matrix[13][x] or Matrix[14][x] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3
            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
        else:
            for i in range(9, 18):
                if Matrix[y][i] == n:
                    return False
            for i in range(0, 6):
                print(Matrix[i][x])
                if Matrix[i][x] or Matrix[6][x+3] or Matrix[7][x+3] or Matrix[8][x+3] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3

            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
    # down-right sudoku
    if(x > 8 and y > 11):
        if y < 15 and x > 14:
            for i in range(12, 21):
                print(Matrix[y][i])
                if Matrix[y][i] == n:
                    return False
            for i in range(15, 21):

                print(Matrix[i][x])
                if Matrix[i][x-3] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3

            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
            # joint square
        elif (x > 11 and x < 15 and y < 15):
            for i in range(6, 21):

                if Matrix[y][i] == n:
                    return False

            for i in range(15, 21):
                if Matrix[i][x-3] or Matrix[6][x] or Matrix[7][x] or Matrix[8][x] or Matrix[9][x-6] or Matrix[10][x-6] or Matrix[11][x-6] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3
            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
        else:
            for i in range(9, 18):
                print(Matrix[y][i])
                if Matrix[y][i] == n:
                    return False
        for i in range(15, 21):

            print(Matrix[i][x])
            if Matrix[i][x] or Matrix[12][x+3] or Matrix[13][x+3] or Matrix[14][x+3] == n:
                return False

        x0 = (x//3)*3
        y0 = (y//3)*3

        for i in range(0, 3):
            for j in range(0, 3):
                #  print(board[y0+i][x0+j])
                if Matrix[y0+i][x0+j] == n:
                    return False
        return True
    # down-left sudoku
    if(x < 9 and y > 11):
        # joint square
        if (x > 5 and y < 15):
            for i in range(0, 15):
                print(Matrix[y][i])
                if Matrix[y][i] == n:
                    return False

            for i in range(12, 21):
                print(Matrix[i][x])
                if Matrix[i][x] or Matrix[9][x-6] or Matrix[10][x-6] or Matrix[11][x-6] or Matrix[16][x] or Matrix[7][x] or Matrix[8][x] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3
            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
        else:
            for i in range(0, 9):
                print(Matrix[y][i])
                if Matrix[y][i] == n:
                    return False

            for i in range(0, 9):

                print(Matrix[i][x])
                if Matrix[i][x] == n:
                    return False

            x0 = (x//3)*3
            y0 = (y//3)*3

            for i in range(0, 3):
                for j in range(0, 3):
                    #  print(board[y0+i][x0+j])
                    if Matrix[y0+i][x0+j] == n:
                        return False
            return True
      # up-middle 3*3 square
    if(x > 8 and x < 12) and (y > 5 and y < 9):
        for i in range(6, 15):
            print(Matrix[y][i])
            if Matrix[y][i] == n:
                return False

        for i in range(9, 12):
            print(Matrix[i][x])
            if Matrix[i][x-3] or Matrix[12][x] or Matrix[13][x] or Matrix[14][x] == n:
                return False

        x0 = (x//3)*3
        y0 = (y//3)*3
        for i in range(0, 3):
            for j in range(0, 3):
                #  print(board[y0+i][x0+j])
                if Matrix[y0+i][x0+j] == n:
                    return False
        return True
  # down-middle 3*3 square
    if(x > 8 and x < 12) and (y > 5 and y < 9):
        for i in range(6, 15):
            print(Matrix[y][i])
            if Matrix[y][i] == n:
                return False

        for i in range(9, 12):
            print(Matrix[i][x])
            if Matrix[i][x-3] or Matrix[12][x] or Matrix[13][x] or Matrix[14][x] == n:
                return False

        x0 = (x//3)*3
        y0 = (y//3)*3
        for i in range(0, 3):
            for j in range(0, 3):
                if Matrix[y0+i][x0+j] == n:
                    return False
        return True
  # middle 6*3
    if(x < 9 and y > 8 and y < 12):
        for i in range(0, 9):
            print(Matrix[y][i])
            if Matrix[y][i] == n:
                return False

        for i in range(6, 9):
            print(Matrix[i][x])
            if Matrix[i][x+6] or Matrix[12][x] or Matrix[13][x] or Matrix[14][x] == n:
                return False

        x0 = (x//3)*3
        y0 = (y//3)*3
        for i in range(0, 3):
            for j in range(0, 3):
                #  print(board[y0+i][x0+j])
                if Matrix[y0+i][x0+j] == n:
                    return False
        return True
    #print(checkNumber(8, 10, str(8)))
    # up left sudoku

def solve1():
    global Matrix
    for y in range(9):
        for x in range(9):
            if Matrix[y][x] == 0:
              for n in range(1, 10):
                    if checkNumber(y,x,n):
                      Matrix[y][x] = n
                      print(Matrix[y][x])
                      solve1()
                      Matrix[y][x] = 0
              return
  


def solve2():
    for i in range(10, 20):
        print(i)

t1 = threading.Thread(target=solve1)
#t2 = threading.Thread(target=solve2)
t1.start()
#t2.start()
#t1.join()
time.sleep(15)
#solve1()
print(Matrix)
print("b")
Editor is loading...