在矩阵中生成数独难题,而不是绘制图形用户界面

问题描述

该程序的概念是创建一个数独谜题,然后可以通过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",in <listcomp>
    self.cubes = [[Cube(self.board[i][j],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创建的GRID类的初始化。多维数据集对象:

class Grid:
    board = generated_board   
  

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

我认为这不是必需的,但这是在Grid类的初始化中9x9创建的Cube类。

    class Cube:
        rows = 9
        cols = 9

    def __init__(self,value,row,col,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),(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),(x,y,gap,gap),3)

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

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

所以再次通过了像这样的木板

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

将做的工作是将板子传递到网格类中。但是在类之外生成一个,然后甚至将生成的板以这种精确的格式拔出,也不会让我陷入上面的错误中。请任何有这种问题或知道如何调试它的人来帮助我,

解决方法

生成木板时,您只返回第一行而不是整个木板。

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

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