显然,根据用户的动作,他们可能会失去获胜的机会。我只想告诉用户,如果他们玩得好,这个谜题是可以赢的。
如果您在游戏开始时随机放置瓷砖,则有可能用户做几个动作后就无法继续。知道一个谜题至少有解决方案应该使其更有趣。
将所有瓷砖倒置(即从中间开始布局,向外扩展)。
为了更进一步刺激玩家,可以让其在非常高速的情况下进行可见操作。
反向玩游戏。
随机成对地摆放碎片,在可以滑动到堆中的位置。您需要一种方法来“知道”您可以放置碎片的位置,以便最终获得与某些预设模式匹配的堆,但无论如何都需要这样做。
我唯一想到的方法是将瓷砖放置在匹配的成对位置,就像倒着玩麻将接龙一样。因此,在放置瓷砖的任何时刻,游戏板应该看起来像是处于真正游戏的中间阶段(即没有瓷砖浮动在其他瓷砖上方3层)。
如果将瓷砖放置在匹配的成对位置并进行倒着玩,它应该始终会有至少一条正向路径来解决游戏。
我很乐意听取其他的想法。
游戏中有144个方块,每个方块都有一个块列表。 (堆栈上的顶部方块具有空块列表)
所有有效移动都要求它们的“current__vertical_Block_list”为空。这可以是一个144x144矩阵,因此需要20k的内存以及左侧和右侧的块列表,每个也需要20k。
从(剩余的方块)和((空的CURRENT VERTICAL BLOCK LIST)和((空的CURRENT LEFT BLOCK LIST)或(空的CURRENT RIGHT BLOCK LIST)))生成一个有效的移动表。
从有效的移动表中随机选择2个方块,并记录它们。更新当前表格的Vert、left和right,并将删除的方块记录到堆栈中。
现在我们有了一个包含有效游戏的移动列表。为每个72个移动分配匹配的方块类型。
对于具有挑战性的游戏,请跟踪每个方块何时可用。找到早期早期晚期和晚期晚期早期的集合,因为它是空白的,所以你会发现1个EE 1个LL和2个LE块。在2个LE块中,找到一个EARLY,它会阻止除右侧块之外的任何其他EARLY块(左侧块)。
一旦你获得了一个有效的游戏,请尝试改变顺序。
我相信最好的答案已经被推出来了:通过“反向”解决问题创建一个集合 - 即从一个空白的棋盘开始,然后在某个位置添加一对,再添加另一对可解的位置,以此类推...
如果你更喜欢“大爆炸”方法(在开始时随机生成整个集合),是一个非常“男人”的开发者或者今天只是感到自虐,那么你可以通过有向图表示从给定集合中可以取出的所有对及它们之间的依赖关系。
从那里,你只需要获取该集合的传递闭包,并确定是否存在至少一条路径从至少一个初始合法对导致所需的结果(没有剩余的瓷砖对)。
实现这个解决方案留给读者作为练习:D
这是我在实现中使用的规则。
在构建堆时,对于每对fret分别找到一个单元格(位置),它们应该满足以下条件:
这些规则并不能保证构建总是成功的 - 有时会留下最后2个自相矛盾的空单元格,需要重新尝试构建(或至少是最后几个fret) 在实践中,“turtle”最多只需6次重试即可完成构建。
大多数现有游戏似乎限制将第一个(“行首”)fret放在中间某个位置。这会产生更方便的配置,当没有fret位于非常长的行的边缘时,可以一直保持到最后一个玩家移动。但是,“中间”对于不同的配置是不同的。
祝好运 :)
P.S. 如果您发现了可以在一回合内构建可解堆的算法,请告诉我。
纸牌游戏? 我猜测您的计算机需要打赢这个游戏(或接近于打赢)才能确定这一点。
另一种选择可能是拥有几个预先设置的布局(允许赢得,混合您当前的水平)。
在某种程度上,您可以尝试确保4个图块中的一个不超过另一个X层。
我看到的大多数游戏都有洗牌命令,以便当有人卡住时使用。
我会尝试组合各种方法,看看哪种最有效。