我必须做一个推箱子解算器(http://en.wikipedia.org/wiki/Sokoban)。 你做过一次吗?我正在寻找提示,而不是代码。就像“你可以使用IDA * alg”或“我使用启发式并且它非常好”或“我使用该技术不会避免死锁”。
基本上我想在编写任何代码之前在纸上写下策略。
答案 0 :(得分:21)
我已经写了关于推箱子算法的硕士论文。我的目的是提供关于推箱子解算器中使用的技术的一个很好的概述。它没有提供明确的答案,但可能为有兴趣编写推箱子解算器的人提供一个良好的起点。
http://weetu.net/Timo-Virkkala-Solving-Sokoban-Masters-Thesis.pdf
答案 1 :(得分:6)
field - 当前游戏的等级,整个游戏区域。
位置 - 在现场设置阶段。
最终位置 - 无法转弯的位置 - 目标或死锁。
框 - 与包装箱相同。
只是一点点逻辑 - 看起来很明显,但我们会在实现部分中使用它。
所以 - 关于推箱子的每一场比赛,我们可以说这是其中之一:
现在 - 一个推箱子游戏包括:
框可以是:
这是我们将用于解决(下面的定义)的逐步过程:
说明:
possibleTurns x - 二维数组或数组数组 - x 定义转弯的“深度”
n - 在开头是零,将在执行上面的算法时递增
最后 - 上面的过程将为您留下一系列转弯,这些转弯将留在一个已解决的位置。最后要做的是使用像A *这样的算法来确定这些转弯/推动之间的最短路线,以最大限度地提高速度和得分,最大限度地减少游戏内转弯次数。
答案 2 :(得分:1)
你可以创建一个强力求解器,试图在每个可能的方向上移动你的人。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤。
A *可能不会对你有任何好处,因为你不必通过迷宫找到自己的方式,而且还需要移动盒子。这意味着您可能需要在移动盒子后向后退一步。因此,对于每个步骤,您需要评估所有方向,包括您来自的方向。也就是说,除非你没有在上一步中移动一个方框。
[编辑] 你可以使用A *使它更聪明一些;找到从当前位置到任何位置的方法,你可以从中移动一个方框。这可能会使您的解决方案更有效率,因为您不必跟踪中间的所有位置,而只需跟踪您推送到下一个框中的位置。