在矩阵中生成数独谜题而不是绘制 GUI

Generating sudoku puzzle in matrix than drawing GUI

该程序的概念是创建一个可以通过 pygame 解决的数独谜题。我卡住的地方是这个错误:

Traceback (most recent call last):
  File "C:\Users\Lenovo\Desktop\Sudoku Solver\GUI.py", line 307, in <module>
    main()
  File "C:\Users\Lenovo\Desktop\Sudoku Solver\GUI.py", line 245, in main
    board = Grid(9, 9, 540, 540)
  File "C:\Users\Lenovo\Desktop\Sudoku Solver\GUI.py", line 105, in __init__
    self.cubes = [[Cube(self.board[i][j], i, j, width, height) for j in range(cols)] for i in range(rows)]
  File "C:\Users\Lenovo\Desktop\Sudoku Solver\GUI.py", line 105, in <listcomp>
    self.cubes = [[Cube(self.board[i][j], i, j, width, height) for j in range(cols)] for i in range(rows)]
  File "C:\Users\Lenovo\Desktop\Sudoku Solver\GUI.py", line 105, in <listcomp>
    self.cubes = [[Cube(self.board[i][j], i, j, width, height) for j in range(cols)] for i in range(rows)]
TypeError: 'int' object is not subscriptable
[Finished in 0.6s with exit code 1]

但有趣的是,当我传入手工制作的矩阵时,没有出现错误。我可以复制生成的矩阵并将其传递进去,它会起作用,但是制作一个像下面这样的函数来生成一个不会。

def generate_board():
    base  = 3
    side  = base*base

    def pattern(r,c): return (base*(r%base)+r//base+c)%side

    from random import sample
    def shuffle(s): return sample(s,len(s)) 
    rBase = range(base) 
    rows  = [ g*base + r for g in shuffle(rBase) for r in shuffle(rBase) ] 
    cols  = [ g*base + c for g in shuffle(rBase) for c in shuffle(rBase) ]
    nums  = shuffle(range(1,base*base+1))

    # produce board using randomized baseline pattern
    board = [ [nums[pattern(r,c)] for c in cols] for r in rows ]

    squares = side*side
    empties = squares * 3//4
    for p in sample(range(squares),empties):
        board[p//side][p%side] = 0

    numSize = len(str(side))
    for line in board: return line


generated_board = generate_board()

为了更好地了解程序,请查看问题中引发错误的部分,即为每个 self.cubes 创建一个立方体的 GRID class 的初始化对象:

class Grid:
    board = generated_board   
  

    def __init__(self, rows, cols, width, height):
        self.rows = rows
        self.cols = cols
        self.cubes = [[Cube(self.board[i][j], i, j, width, height) for j in range(cols)] for i in range(rows)]
        self.width = width
        self.height = height
        self.model = None
        self.selected = None

我认为这不是必需的,但这是在网格 class.

的初始化中创建的 9x9 的立方体 class
    class Cube:
        rows = 9
        cols = 9

    def __init__(self, value, row, col, width ,height):
        self.value = value
        self.temp = 0
        self.row = row
        self.col = col
        self.width = width
        self.height = height
        self.selected = False

    def draw(self, win):
        fnt = pygame.font.SysFont("comicsans", 40)

        gap = self.width / 9
        x = self.col * gap
        y = self.row * gap

        if self.temp != 0 and self.value == 0:
            text = fnt.render(str(self.temp), 1, (128,128,128))
            win.blit(text, (x+5, y+5))
        elif not(self.value == 0):
            text = fnt.render(str(self.value), 1, (0, 0, 0))
            win.blit(text, (x + (gap/2 - text.get_width()/2), y + (gap/2 - text.get_height()/2)))

        if self.selected:
            pygame.draw.rect(win, (255,0,0), (x,y, gap ,gap), 3)

    def set(self, val):
        self.value = val

    def set_temp(self, val):
        self.temp = val

所以再次传递一个板子就像

  board = [
        [7, 8, 0, 4, 0, 0, 1, 2, 0],
        [6, 0, 0, 0, 7, 5, 0, 0, 9],
        [0, 0, 0, 6, 0, 1, 0, 7, 8],
        [0, 0, 7, 0, 4, 0, 2, 6, 0],
        [0, 0, 1, 0, 5, 0, 9, 3, 0],
        [9, 0, 4, 0, 6, 0, 0, 0, 5],
        [0, 7, 0, 3, 0, 0, 0, 1, 2],
        [1, 2, 0, 0, 0, 7, 4, 0, 0],
        [0, 4, 9, 2, 0, 6, 0, 0, 7]
    ]

将完成工作,要在网格中传递的板 class。但是在 class 之外生成一个,然后即使生成的板采用这种确切的格式也不会将我与上面的错误联系起来。请遇到此类问题或知道如何调试的人帮助我,非常感谢

生成图板时,您只return第一行而不是整个图板。

在您的代码中进行此更改:

def generate_board():
    .........
    # for line in board: return line  # remove this line
    return board   # return full board