我正在尝试制作数独拼图生成器。这比我预期的要难得多,而且我投入的越多,就越难!
我当前的方法是将问题分为两个步骤:
- 生成完整(已解决)的数独难题。
- 删除数字直到可解决,并且只有一种解决方案。
在第1步中,由于我使用的是蛮力方法,因此我遇到了一些运行时问题。有没有填写完整数独难题的最佳方法?
在第2步中,应该使用哪种算法“解谜”数独?
我正在尝试制作数独拼图生成器。这比我预期的要难得多,而且我投入的越多,就越难!
我当前的方法是将问题分为两个步骤:
在第1步中,由于我使用的是蛮力方法,因此我遇到了一些运行时问题。有没有填写完整数独难题的最佳方法?
在第2步中,应该使用哪种算法“解谜”数独?
Answers:
我在iOS应用商店上有一个最畅销的数独游戏。这是我产生难题的方式。
首先,我有一个拼图生成器应用程序。但这不是游戏代码的一部分。这是我用来制作拼图的独立应用程序。它经过了高度修改,因此我可以将其设置为创建不同的模式类型,难度等级,给定数量等。生成难题并获得一致的难度级别是很难做到的,而且比玩家希望等待的时间更长。因此,我生成了所谓的“种子拼图”,这就是游戏代码用来生成人们玩的拼图的东西。
我不在这里回答如何编码生成器。您可以在Google上在线查找大量的拼图生成器代码。从那里开始。但是要制作出出色的游戏,您需要制作出出色的游戏。我的游戏不会即时产生困惑。
我的谜题生成器应用程序的工作方式是每分钟生成数千个谜题,但是它们并不是都很好,并且它们都不都符合特定的难度等级。生成器创建一个难题,然后对其进行求解并找出难度等级,并根据解决难题所需的技术对难题进行评分,并确定是否需要猜测才能解决(通常很糟糕)。它会抛出任何不符合标准的难题。对于较难但并非不可能的难题,在快速的机器上,可能需要一个小时才能生成100个符合我的确切要求的难题。这就是为什么我不在应用程序中执行此操作的原因。在那些苛刻的规格下实时生成拼图对于我在应用程序中拥有的拼图质量不起作用。
拼图是字符串,长162个字符,带空格的81个字符,带数字和破折号或点,然后是带有解的另外81个字符。然后是每个统计信息的列,例如单打,双打等的数量。
我在所有生成会话中的输出都是以逗号分隔的行,并且统计信息作为列。我可能会拿出10,000个拼图,将它们带入卓越领域,并按难度对它们进行排序。然后将它们带入应用程序以在游戏板上查看它们。我还看它们的视觉吸引力和拼图的可见图案。然后,我从中挑选。
我称它们为种子拼图,这就是我的意思。数独游戏中的数字实际上只是令牌。它们不是颜色1-9,而是颜色,符号或字母。所以我的种子难题不是数字,而是字母ai。每个种子拼图都会即时更改以制作一个可玩的拼图:
因此,每个种子难题都可以创造5,806,080个变化。我已经在实际玩家中对此进行了测试。人们不知道他们实际上在玩同样的难题。实际上这是不可能的。只有当他们每次都注意到给定的模式相同时。但是,即使有100种不同的种子,也没人会注意到。我的游戏没有一百万用户。我还使用求解器应用程序对其进行了测试。旋转或翻转时,求解器应用程序无法以相同的方式解决难题。即使在技术上是相同的难题,有时它甚至会将其分析为不同的难度等级。
但是,Big Bad Sudoku Book在5个难度级别中具有1000个种子拼图中的10个,并且有多种拼图模式类型。这意味着我的游戏中有数十亿个难题。每10,000个种子拼图,有58,060,800,000个不同的拼图。
在Sudoku Book版本4(将于2016年到期)中,我想出了一种方法,可以从这580亿中指定一个确切的谜题,并在每个玩家的设备上获得相同的谜题。
在步骤(1)中,生成一个完整的(已解决的)数独难题,因为我使用的是蛮力方法,所以我遇到了一些运行时问题。有没有填写完整数独难题的最佳方法?
填写完整的Sudoku拼图有一种简单的方法-分组填充和循环移位。
line 1: 8 9 3 2 7 6 4 5 1
line 2: 2 7 6 4 5 1 8 9 3 (shift 3)
line 3: 4 5 1 8 9 3 2 7 6 (shift 3)
line 4: 5 1 8 9 3 2 7 6 4 (shift 1)
line 5: 9 3 2 7 6 4 5 1 8 (shift 3)
line 6: 7 6 4 5 1 8 9 3 2 (shift 3)
line 7: 6 4 5 1 8 9 3 2 7 (shift 1)
line 8: 1 8 9 3 2 7 6 4 5 (shift 3)
line 9: 3 2 7 6 4 5 1 8 9 (shift 3)
为了防止用户注意到明显的模式,最好随机化行和列的顺序,以便不再有任何模式。只要每行/列中的所有9个数字作为一个原子单位一起移动,Sudoku板将始终保持有效。
您将获得一个完整的数独难题。有关更多详细信息,您可以搜索“ make Sudoku”。
只要您有数独求解器,就不太困难了。
制作数独求解器是一个困难/有趣的问题,因此最好将其保存为其他问题。或者,您也可以阅读此书,然后看看自己的情况。
1, 2, 3, 4, ...
然后选择第一个可行的方法。您需要重新整理该顺序,以便尝试执行4, 7, 2, 9, ...
。此过程应与您的求解器一样快。这是一种非常简单(而且很幼稚)的方法,因此无法保证您会遇到某种困难的难题-除了遗漏的数字数量之外,甚至无法删除所需数量的数字。希望这对您有所帮助。
我只是觉得指出此网页很有趣,因为它对我的proyect开发有很大帮助。用独特的解决方案制作数独并非一件简单的事情。在链接中,您可以找到作者(他确实做得很好,没错!)如何找到几种不同的策略。您可能有一个想法可以生成自己的Sudoku求解器。
现在,围绕该主题,还有一种方法可以生成类似的数独,
用算法加油打气:D