我正在做一个用python在终端上运行的数独游戏,我不能分配数字来填满棋盘。这是我的所有函数和主程序的代码。我想错误出在数字的检验器里。
def createBoard ():
rows = 9
columns = 9
matrix = []
for r in range(rows):
matrix.append([]) # agregar lista
for c in range(columns):
matrix[r].append("")
return matrix
def printBoard (board):
for i in range (len(board)):
print (board[i])
def defineSubMatrix (row, column):
subMatrix = -1
if row >= 0 and row <= 2:
if column >= 0 and column <= 2:
subMatrix = 0
if column >= 3 and column <= 5:
subMatrix = 1
if column >= 6 and column <= 8:
subMatrix = 2
if row >= 3 and row <= 5:
if column >= 0 and column <= 2:
subMatrix = 3
if column >= 3 and column <= 5:
subMatrix = 4
if column >= 6 and column <= 8:
subMatrix = 5
if row >= 3 and row <= 5:
if column >= 0 and column <= 2:
subMatrix = 6
if column >= 3 and column <= 5:
subMatrix = 7
if column >= 6 and column <= 8:
subMatrix = 8
return subMatrix
def createLevel (board):
for i in range (0, 8):
for j in range (0, 8):
num = random.randint (1, 9)
check = checker(board, num, i, j)
while check == False:
if check == False:
num = random.randint (1, 9)
check = checker(board, num, i, j)
board[i][j] = num
board[i][j] = num
return board
def checker (board, num, posX, posY):
### ok = True cuando check == 0
ok = False
checkT = 0
checkR = 0
checkC = 0
checkSM = 0
###Check row right
i = posX
while i + 1 <= 8:
if board[i][posY] == num:
checkR += 1
i = i + 1
###Check row left
i = posX
while i - 1 >= 0:
if board[i][posY] == num:
checkR += 1
i = i - 1
###Check column down
j = posY
while j + 1 <= 8:
if board[posX][j] == num:
checkC += 1
j = j + 1
###Check column up
j = posY
while j - 1 >= 0:
if board[posX][j] == num:
checkC += 1
j = j - 1
###Check Submatrix
subMatrix = defineSubMatrix(posX, posY)
if subMatrix == 0:
for i in range (0, 2):
for j in range (0, 2):
if board[i][j] == num:
checkSM += 1
if subMatrix == 1:
for i in range (3, 5):
for j in range (0, 2):
if board[i][j] == num:
checkSM += 1
if subMatrix == 2:
for i in range (6, 8):
for j in range (0, 2):
if board[i][j] == num:
checkSM += 1
if subMatrix == 3:
for i in range (0, 2):
for j in range (3, 5):
if board[i][j] == num:
checkSM += 1
if subMatrix == 4:
for i in range (3, 5):
for j in range (3, 5):
if board[i][j] == num:
checkSM += 1
if subMatrix == 5:
for i in range (6, 8):
for j in range (3, 5):
if board[i][j] == num:
checkSM += 1
if subMatrix == 6:
for i in range (0, 2):
for j in range (6, 8):
if board[i][j] == num:
checkSM += 1
if subMatrix == 7:
for i in range (3, 5):
for j in range (6, 8):
if board[i][j] == num:
checkSM += 1
if subMatrix == 8:
for i in range (6, 8):
for j in range (6, 8):
if board[i][j] == num:
checkSM += 1
checkT = checkR + checkSM + checkC
if checkT == 0:
ok = True
return ok
def main ():
board = createBoard()
subma = defineSubMatrix(0, 6)
print (subma)
printBoard(board)
print ("Board Created")
level = createLevel(board)
print ("Level created")
printBoard(level)
###PROGRAMA
main()发布于 2021-07-22 06:01:05
你不能仅仅通过随机选择来创建数独游戏。你很快就会遇到这样的情况:
1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .现在没有下一个细胞的可能性了。
许多数独算法使用复杂的启发式方法创建网格,与人类求解网格的方式相同。使用暴力是可能的。考虑到每个数独难题都可以通过使用(a)交换行、(b)交换列、(c)交换3行的集合、(d)交换3列的集合、(e)旋转90度和(f)跨一个轴的镜像的组合来从每个其他的数独难题导出。鉴于此,您可以从一个排序良好的矩阵开始,如下所示:
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
5 6 7 8 9 2 3 4 5
8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8然后进行随机交换、旋转和镜像,就像洗一副牌一样。请参阅本文:
https://www.algosome.com/articles/create-a-solved-sudoku.html
https://stackoverflow.com/questions/68476655
复制相似问题