1

对于类似于 Unblock Me 的游戏,什么是体面的关卡生成算法?

我的第一次尝试是从一个已解决的关卡开始,然后向后工作。我从板右侧出口旁边的红色水平矩形开始。最初,棋盘上的其他棋子为零。因此,我尝试将伪随机添加到所需的片数(比如七)。仅限于水平或垂直部分的关卡不是很有趣,所以我在添加时在水平和垂直部分之间交替。最后,我尝试通过随机移动它们来打乱这些碎片。通过几个示例后,很明显这种方法通常会生成无趣的关卡。最小移动计数也是未知的。

下一次尝试以不同的方式解决问题。级别是随机生成的。然后搜索算法找到解决难题的最小移动数(如果可能的话)。虽然我还没有实现这一点,但我认为它会创建一些有趣的关卡。由于板子相对较小(上限为 10x10),我认为运行时间对于生成与应用程序捆绑的关卡是可以接受的。最小移动计数也是已知的,这对于得分很重要。

我怀疑第一种方法按原样工作。但是,我没有考虑过的变化可能会起作用。我对第二种方法的唯一保留是潜在的代码复杂性。我认为这将是一个带有备忘录表和 BoardState 对象的 BFS。在深入研究第二种方法之前,我想听听一些替代方案。

4

1 回答 1

2

我会这样做:

  • 生成游戏的随机状态,其中红色矩形位于出口旁边
  • 计算从该状态开始的棋盘的完整状态空间
  • 选择状态空间中距离已解决状态最远的状态之一作为实际问题。我将使用作为距离测量不同棋子的移动次数,即连续计算同一棋子的多次移动为 1
  • 如果生成的状态空间太小,移除碎片并重做
  • 如果生成的状态空间很大,但从任何状态到解的距离很小,则添加碎片并重做
于 2013-02-05T10:07:23.350 回答