推箱子解决方案,提示

时间:2010-11-21 10:52:19

标签: artificial-intelligence

我必须做一个推箱子解算器(http://en.wikipedia.org/wiki/Sokoban)。 你做过一次吗?我正在寻找提示,而不是代码。就像“你可以使用IDA * alg”或“我使用启发式并且它非常好”或“我使用该技术不会避免死锁”。

基本上我想在编写任何代码之前在纸上写下策略。

3 个答案:

答案 0 :(得分:21)

我已经写了关于推箱子算法的硕士论文。我的目的是提供关于推箱子解算器中使用的技术的一个很好的概述。它没有提供明确的答案,但可能为有兴趣编写推箱子解算器的人提供一个良好的起点。

http://weetu.net/Timo-Virkkala-Solving-Sokoban-Masters-Thesis.pdf

答案 1 :(得分:6)

条款

field - 当前游戏的等级,整个游戏区域。

位置 - 在现场设置阶段。

最终位置 - 无法转弯的位置 - 目标死锁

- 与包装箱相同。

理论

只是一点点逻辑 - 看起来很明显,但我们会在实现部分中使用它。

所以 - 关于推箱子的每一场比赛,我们可以说这是其中之一:

  • 可解决,未解决 - 在解决过程中
  • 可解决,已解决 - 目标
  • 无法解决,未解决 - 如果我们的实施没有产生结果,并且没有更多可能的移动/移动组合

现在 - 一个推箱子游戏包括:

  • 移动 - 角色可以在由墙壁和/或方框定义的区域中移动,此区域小于或等于(如果不计算墙壁,并且没有框子)整个播放区域 - 然而,在场地周围移动角色会使得除了得分之外没有区别,这与实际解决方案无关 - 让我们暂时忽略它
  • 推动 - 推动这些方块更为重要,并且有可能导致我们的目标 - 通过推动各自目标的方框来解决这个问题

可以是:

  • in-goal - 很可能此框不需要移动,有些规则可以禁止框在目标位置移动(非常不寻常)
  • pushable - 在1到4个方向
  • 不可用,不在目标
    • 被2面墙挡住 - 当前位置无法解析无论
    • 其他 - 稍后我们会进入此框 - 现在一个箱子挡住了我们的路

过程

这是我们将用于解决(下面的定义)的逐步过程:

  1. 使用当前位置的每个可直接访问的推送(可推送或进球)填充 possibleTurns n ,其中玩家位于当前位置
  2. possibleTurns n 中的第一项,将其删除并执行
  3. 查看当前位置:
    1. 是最后的 - 目标 - 解决,不做任何事
    2. 是最后的 - 死锁 - 这一转是导致死锁,不再填充它,回到2.步骤, n 保持不变
    3. 不是最终的 - 增加 n 并填充 possibleTurns n 并可能在这个位置转弯
  4. 说明:

    possibleTurns x - 二维数组或数组数组 - x 定义转弯的“深度”

    n - 在开头是零,将在执行上面的算法时递增

    提示

    最后 - 上面的过程将为您留下一系列转弯,这些转弯将留在一个已解决的位置。最后要做的是使用像A *这样的算法来确定这些转弯/推动之间的最短路线,以最大限度地提高速度和得分,最大限度地减少游戏内转弯次数。

答案 2 :(得分:1)

你可以创建一个强力求解器,试图在每个可能的方向上移动你的人。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤。

A *可能不会对你有任何好处,因为你不必通过迷宫找到自己的方式,而且还需要移动盒子。这意味着您可能需要在移动盒子后向后退一步。因此,对于每个步骤,您需要评估所有方向,包括您来自的方向。也就是说,除非你没有在上一步中移动一个方框。

[编辑] 你可以使用A *使它更聪明一些;找到从当前位置到任何位置的方法,你可以从中移动一个方框。这可能会使您的解决方案更有效率,因为您不必跟踪中间的所有位置,而只需跟踪您推送到下一个框中的位置。