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