问题描述
该程序的概念是创建一个数独谜题,然后可以通过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