当前位置: 首页 > 知识库问答 >
问题:

python数独游戏?前后检查拼图

狄阳华
2023-03-14

我已经用Python为非常简单的数独问题编写了一个数独解算器。它的工作原理是检查每个空方块,如果只有一个可能的数字是合法的,则用该数字替换空方块。一旦它完成了整个拼图,如果仍然有1个以上的空方块,它会再次调用新的拼图。我遇到问题的部分是,我希望解算器在每次调用结束时检查谜题是否与调用开始时相同,如果没有更改,这意味着所有剩余的空方块都有超过1个可能值,因此解算器应返回False,以指示解算器无法解算该特定谜题。然而,当我试图实现这一点时,解算器只完成一次谜题,并返回False。这是我的代码:

def Solver(puzzle):

    oldpuzzle = puzzle
    count = 0

    for row in range(9):

        for col in range(9):
            if puzzle[row][col] == '0':
                possible, numpossible = getPossible(puzzle, row, col)

                if numpossible == 1:
                    puzzle[row][col] = possible[0]
        count += puzzle[row].count('0')

    if count > 0:
        if oldpuzzle == puzzle:
            return False
        else:
            Solver(puzzle)
    else:
        return True

函数的作用是:返回可能值的列表和列表的长度。

这是main()函数:

def main():

如何让程序正确地比较for循环前后的谜题状态?

共有3个答案

程博学
2023-03-14

问题是,如果oldpuzzle==puzzle将始终为真,因为创建oldpuzzle时,它不会成为拼图列表的副本,而是一个副本。这意味着,如果更改puzzle,则oldpuzzle也将更改。

list1 = [1, 2, 3]
list2 = list1
list1[0] = 4
print(list2)
# this will print [4, 2, 3]

制作oldphy的副本的一种方法是使用复制库。在这种情况下,需要制作拼图的深度副本,因为它是一个包含列表的列表。一种方法是使用复制库中的深度复制函数。所以函数看起来像这样:

from copy import deepcopy # at the top of the document

def Solver(puzzle):

    oldpuzzle = deepcopy(puzzle)
    count = 0

    # ... and then the rest
颛孙森
2023-03-14

您正在将puzzle的引用设置为oldpuzzle,因此如果您对puzzle进行任何更改,它也将反映在oldpuzzle中。而puzzle总是等于oldpuzzle

我认为你不需要将谜题设置为旧谜题(或者你需要在开始时保存完整的谜题)。

根据逻辑,0单元格的数量永远不会增加,并且以前标记为非零的单元格永远不会标记为0

因此,您可以在开始时存储0s的计数,然后在结束时检查0s的计数是否已更改,如果已更改则好,否则返回False。

示例代码-

def Solver(puzzle):

    oldcount = sum(1 for row in puzzle for cell in row if cell == '0')
    count = 0

    for row in range(9):

        for col in range(9):
            if puzzle[row][col] == '0':
                possible, numpossible = getPossible(puzzle, row, col)

                if numpossible == 1:
                    puzzle[row][col] = possible[0]
        count += puzzle[row].count('0')

    if count > 0:
        if oldcount == count:
            return False
        else:
            Solver(puzzle)
    else:
        return True
高钱青
2023-03-14

你的问题是线路:

oldpuzzle = puzzle

参考拼图称为oldpuzzel而不是副本,因此它们总是相同的-您需要使用副本将拼图复制到oldpuzzel。复制或更多只需设置一个标志:

def Solver(puzzle):
   Changed = False

在以下方面:

          if numpossible == 1:
               Changed = True

然后检查更改是否为假,然后返回。

 类似资料:
  • 数独游戏,游戏分三个难度来生成数独矩阵,有标记功能。关于挑战模式还没有实现。 [Code4App.com]

  • 本文向大家介绍python实现拼图小游戏,包括了python实现拼图小游戏的使用技巧和注意事项,需要的朋友参考一下 Python小白一只,正在成长,程序自己设计,很多不足,算法很多地方能优化。欢迎大佬来指教。 游戏效果 创建设置类,储存游戏基础数据 可以不使用这个类,在程序中直接使用相应的数据。但是使用这个类更便于程序阅读和修改基础数据。 创建图片类,储存游戏需要的图片 这样可以在游戏的开始把游戏

  • 我正在用python为我的CIS类做作业。我们得给数独棋盘编码。在9x9电路板中,我们显然必须检查每一行、col和3x3正方形是否存在重复项。我对如何用3x3的正方形来检查数字的想法有点固执。下面是我检查每一行和每一列的代码,如果有人能帮我一点轮廓或一种方法,那就是检查每一个3x3的正方形,这将是惊人的!

  • 这个程序的作用: 这个程序从一个类中获取值,并使用这些值作为数独游戏的起始值。我们将在一个典型的数独9x9网格中打印这些内容。然后,程序会提示用户在网格上给出一个坐标点,并在其中输入一个值。目前我正在做的是确保用户输入的值对解决这个难题是有效的。填好拼图后,每列、每行和3x3方块中不再有任何重复值,游戏应结束,输出应为“拼图完成”。 到目前为止,我的程序成功地检查了列和行中的重复值,但我不知道从哪

  • 我正在尝试在python中创建一个数独检查器: 我期待这样的输入——一个9个列表的列表。零表示用户尚未填写的数字。它们可以在一行、一列或3x3中多次出现。 我显然需要检查是否有一个9x9列表(网格),以及每行、每列和3x3小正方形中是否没有重复项。在代码中,我首先检查行数是否正确(应该有9行)。然后我检查每一行中是否有9个元素(在病态示例中,您可以看到情况并非如此)。然后我尝试检查每一行中的重复项

  • 我对Python和NLTK相当陌生。我正忙于一个可以执行拼写检查的应用程序(用正确的单词替换拼写错误的单词)。我目前正在使用Python 2.7上的附魔库、PyEnchant和NLTK库。下面的代码是一个处理更正/替换的类。 我编写了一个函数,它接收单词列表,对每个单词执行replace(),然后返回这些单词的列表,但拼写正确。 现在,我真的不喜欢这个,因为它不是很准确,我正在寻找一种方法来实现拼