Sudoku网格生成器未使列数不同

时间:2019-04-09 08:50:44

标签: python random tkinter

我正在尝试制作Sudoku网格生成器,但是已经被这最后一点卡住了一段时间。 我已经成功地为每一行设置了不同的数字。但是现在我需要每个列号都不同,而且我不知道该怎么做。

我已经尝试过通过从列表中删除该数字来消除顶部出现相同数字的可能性。但是,对于另一行,我再次需要该数字。 (我尝试过.pop()并删除和删除)

import tkinter as tk
import random
buttonvalues = ["1","2","3","4","5","6","7","8","9"]
random.shuffle(buttonvalues)
root = tk.Tk()
root.title("Soduku")
i = 0
for x in range(9):
    for y in range(9):
        number = random.choice(buttonvalues)
        btn = tk.Button(text=number, bg="white", activebackground="black", width=2)
        btn.grid(row=y, column=x)
        i += 1
        print(number)
        if number == "1":
            buttonvalues.remove("1")  
        elif number == "2":
            buttonvalues.remove("2")
        elif number == "3":
            buttonvalues.remove("3")
        elif number == "4":
            buttonvalues.remove("4")
        elif number == "5":
            buttonvalues.remove("5")
        elif number == "6":
            buttonvalues.remove("6")
        elif number == "7":
            buttonvalues.remove("7")
        elif number == "8":
            buttonvalues.remove("8")
        elif number == "9":
            buttonvalues.remove("9")
        if not buttonvalues:
            buttonvalues = ["1","2","3","4","5","6","7","8","9"]



root.mainloop()

我确实得到了预期的结果a(每行的数字不同),但是现在我需要每个列号都不同,包括行中的列号。有人可以帮忙吗?image

1 个答案:

答案 0 :(得分:0)

我会以不同的方式处理这个问题。从有效的Sudoko网格开始:

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 1 | 2 3 4
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

然后重新整理网格,以便始终遵循规则。您可以将三个3x3块的任何行与任何其他行交换。您可以将三个3x3块的任何列与另一列交换。在每个块行或块列中,您可以交换单行和单列。最后,您可以对数字进行置换,以便在整个位置上排列一致的情况下,各个位置都有不同的数字。