麻将-排列瓷砖以确保至少有一条通往胜利的道路,而不管布局如何

时间:2020-03-06 14:59:47  来源:igfitidea点击:

不管用于图块的布局如何,都有任何好的方法可以划分出图块,以便我们可以向用户保证,在游戏开始时,至少存在一条完成拼图并赢得游戏的路径?

显然,根据用户的举动,他们可以阻止自己获胜。我只想总是能够告诉用户,如果玩得好,拼图是可以赢得的。

如果我们在游戏开始时随机放置磁贴,则用户可能会做出一些动作而无能为力。知道拼图至少可以解决,这应该使玩起来更加有趣。

解决方案

将所有瓷砖反过来放置(即从中间开始布置木板,然后进行锻炼)

为了进一步戏弄玩家,我们可以明显但快速地进行操作。

反向玩游戏。

在可以将它们滑入堆中的地方,成对地随机布置碎片。我们将需要一种方法来知道允许我们在何处放置零件,以便最终得到与某些预设模式匹配的堆,但是无论如何我们都将需要它。

我唯一能想到的就是像平反的麻将纸牌游戏那样将瓷砖成对放置。因此,在放置磁贴期间的任何时候,棋盘都应该看起来像在真实游戏的中间(即没有磁贴在其他磁贴上方漂浮3层)。

如果在反向游戏中将瓷砖成对放置,则应始终至少有一条向前的路径来解决该游戏。

我很想听听其他想法。

纸牌?只是一个猜测,但是我认为计算机需要击败游戏(或者接近游戏)才能确定。

另一个选择可能是具有多个预设布局(允许中奖,并与当前级别混合。

在某种程度上,我们可以尝试确保4个图块之一不超过另一个X之下的X层。

我看到的大多数游戏在有人卡住时都有shuffle命令。

我会尝试各种方法,然后看看哪种方法效果最好。

我认为最好的答案已经被提出:通过"反向"求解来创建集合,即从空白板开始,然后在某处添加一对,在可解决的位置添加另一对,依此类推...

如果我们更喜欢" Big Bang"方法(在一开始就随机生成整个集合),是一个非常有男子气概的开发人员,或者今天只是受虐狂,则可以代表我们可以从给定集合中取出的所有对,以及它们如何依赖通过有向图彼此。

从那里,我们只需要获取该集合的传递闭包,并确定从至少一个初始合法对中是否存在至少一条通向所需终点的路径(没有剩余磁贴对)。

实施此解决方案留给读者练习:D

这是我在实现过程中使用的规则。

构建堆时,分别为成对的每个品格找到一个单元(位置),它们是:

  • 已经填充了所有较低级别的单元格
  • 考虑是否已将第一个琴格放置在第二个琴格的位置不首先阻塞
  • 或者它是连续的第一个品格(左右的所有单元都是递归自由的)

这些规则并不能保证构建总是成功的,有时会留下最后2个空闲单元自我阻塞,应该重试构建(或者至少重试几次)
实际上," turtle"内置的重试次数不超过6次。

现有的大多数游戏似乎都限制了将第一("第一行")品格放在中间的某个位置。这提供了更方便的配置,当在很长的行的边缘没有烦恼时,一直停留到最后一个玩家移动为止。但是,"中间"对于不同的配置是不同的。

祝你好运 :)

P.S.
如果我们发现可以在一轮内建立可解决堆的算法,请告诉我。

我知道这是一个古老的问题,但是当我自己解决问题时遇到了这个问题。这里没有一个答案是十分完美的,其中有几个具有复杂的警告或者将破坏病理布局。这是我的解决方案:

用未标记的瓷砖解决木板的问题(向前而不是向后)。一次删除两个免费的瓷砖。将我们删除的每对放入"匹配对"堆栈中。通常,这就是我们需要做的。

如果我们遇到死胡同(numFreeTiles == 1),只需重置生成器即可:)我发现我通常不会死胡同,到目前为止,大约10左右的最大重试计数为3我尝试过的布局。一旦我打了8次重试,我就放弃了,只是随机分配其余的瓦片。这使我可以使用相同的生成器来设置电路板和随机播放功能,即使播放器拧紧并处于100%无法解决的状态。

遇到死胡同时的另一种解决方案是退回(弹出堆栈,更换板上的瓷砖),直到我们可以采用其他方法为止。通过确保匹配的对将删除原始的遮挡图块,采用不同的路径。

不幸的是,这取决于板子,可能会永远循环。如果最终删除了一条类似于"无出口"道路的对,其中所有后续"道路"都是死角,并且有多个死角,则算法将永远无法完成。我不知道是否可以在这种情况下设计电路板,但是如果是这样,仍然有解决方案。

为了解决更大的问题,请将每个可能的板状态视为DAG中的一个节点,每个选定的对都作为该图形上的一条边。进行随机遍历,直到找到深度为72的叶子节点为止。请跟踪遍历历史,以免再次发生下降。

由于在我使用的布局中,死胡同比初试解决方案更为罕见,因此立即想到的是混合解决方案。首先尝试以最少的内存解决问题(将选定的对存储在堆栈中)。一旦遇到第一个死胡同,请降级以在访问每个节点时进行完整的标记/边缘生成(可能时进行延迟评估)。

不过,我对图论的研究很少,所以也许有更好的解决DAG随机遍历/搜索问题的方法:)

编辑:实际上,我们可以使用我的任何解决方案来生成董事会,相反,例如2008年10月13日的帖子。我们仍然有相同的警告,因为我们仍然可能会死胡同。但是,反向生成电路板的规则更为复杂。例如,如果我们没有至少开始某些行且中间没有第一行,例如在带有1长行的布局中,则可以确保设置失败。在前向求解发生器中选择完全随机(合法)的第一步很可能会导致可解电路板。

我们在游戏中有144个图块,每个144个图块都有一个阻止列表。
(堆栈上的顶部图块具有空的阻止列表)

所有有效的移动都要求其" current__vertical_Block_list"为空。这可以是144x144矩阵,因此需要20k的内存以及LEFT和RIGHT块列表,每个也要20k。

从(remaning_tiles)和((空的当前垂直块列表)和((空的当前左块列表)或者(空的当前右块列表))生成有效的移动表

从有效的移动表中选择2个随机图块,并将其记录下来
更新(当前表Vert,左和右),将已删除的Tiles记录到堆栈中

现在我们有了构成有效游戏的棋步列表。为这72个移动指定匹配的图块类型。

对于具有挑战性的游戏,请跟踪每个图块何时可用。找出具有(早早早晚)和(晚晚早晚早)的集合,因为它们是空白的,我们发现1 EE 1 LL和2 LE块..在2 LE块中,找到一个EAREAR来阻塞任何其他EARLY(除了右遮挡左侧的棋子以外)
一旦有了有效的游戏,就可以进行订购。