推箱子游戏:自动移动盒子

时间:2012-04-03 14:32:30

标签: algorithm graph-algorithm

当守门员使用广度优先搜索算法自动移动时,我已经实现了功能性。现在我想让它自动移动盒子(如果饲养员可以将盒子从源移动到目的地而不移动另一个盒子)。我该怎么办?我试过修改BFS,但还没有成功。

更新:我不需要解决这个难题。相反,当用户可以用鼠标移动盒子时,我想开发方便的用户界面。为此我需要一些算法,这将允许计算移动序列。但它只是关于移动单个盒子,如果不是为了这样做就不应该移动其他盒子。

2 个答案:

答案 0 :(得分:4)

像以前一样使用广度优先搜索(或者如果您愿意,使用A *),但搜索适当的状态集。

当您搜索守护者的路径时,状态对应于网格中的方块。但是当你为守门员移动一个区块寻找一种方法时,状态对应于网格中的方块的(一个用于守护者,一个用于块)。

这是最小的非平凡的例子。假设我们有一个推箱子级别,方块标记如下:

Sokoban level with squares numbered 1 to 6

网格包含守护者和一个区块。状态空间由守护者和块占据的成对方块组成。有56个这样的状态,在下图中绘制为小圆圈。

state space with 56 states

线条显示此状态空间内可能的过渡。细线对应于保持器的移动(并且是双向的)。粗线对应于推动块(因此仅沿一个方向)。您需要搜索状态空间。

例如,如果块从7开始并且守护器在8,那么守护者可以通过跟随状态空间中的红色路径将块推到8:

non-trivial path in state space

请注意,沿此路径,区块将经过7-6-5-6-7-8的位置。你只能通过考虑块的位置来找到这条路径,因为块通过位置6和7两次。

答案 1 :(得分:3)

来自Wikipedia - Sokoban

  

可以使用计算复杂性理论来研究推箱子。   已经证明解决推箱子难题的问题   NP-hard。3这对人工智能也很有意义   研究人员,因为解决推箱子可以比较设计一个   在仓库中移动箱子的机器人。进一步的工作表明   解决推箱子问题也是PSPACE完成的。[4]

     

推箱子很难,不仅仅是因为它的分支因素(即   与国际象棋相当),但它的搜索树深度也很大;一些   水平需要超过1000“推”。熟练的人类玩家依赖   主要是关于启发式的;他们通常能够快速丢弃无用的   或冗余的游戏线,并识别模式和子目标,   大幅减少搜索量。

     

一些推箱子的谜题可以通过使用一个自动解决   单一代理搜索算法,如IDA *,由几个增强   利用领域特定知识的技术。[5] 这就是   Rolling Stone使用的方法,由Sokoban求解器开发的   阿尔伯塔大学GAMES集团。更多复杂的推箱子级别   然而,即使对于最好的自动求解器,它也是遥不可及的。

这是你想知道的吗?

顺便说一下,以可证明的最佳方式解决推箱子谜题是NP-hard,这意味着如果你弄明白如何去做,$1,000,000 prize等着你。

相关问题