在矩阵中生成数独谜题比绘制GUI要好



程序的概念是创建一个数独谜题,然后可以通过pygame解决。我陷入困境的地方是这个错误:

Traceback (most recent call last):
File "C:UsersLenovoDesktopSudoku SolverGUI.py", line 307, in <module>
main()
File "C:UsersLenovoDesktopSudoku SolverGUI.py", line 245, in main
board = Grid(9, 9, 540, 540)
File "C:UsersLenovoDesktopSudoku SolverGUI.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:UsersLenovoDesktopSudoku SolverGUI.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:UsersLenovoDesktopSudoku SolverGUI.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.cube创建立方体对象的GRID类的初始化:

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

我认为这是不需要的,但这是Cube类,它是在Grid类的init中创建的9x9。

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]
]

将完成这项工作,董事会将在网格类中通过。但是在类外生成一个,然后即使生成的板是这种格式也将其插入,这不会让我陷入上述错误。请任何有这种问题或知道如何调试的人帮助我,非常感谢

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

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

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

最新更新