无论用于瓷砖的布局如何,是否有任何好方法来分割瓷砖,以便您可以保证用户在游戏开始时至少存在一条完成拼图并赢得游戏的途径?
显然,根据用户的动作,他们可以从胜利中脱身.我只是希望能够总是告诉用户如果他们玩得很好就可以赢得这个谜题.
如果您在游戏开始时随机放置磁贴,则用户可能会进行一些移动而无法再执行任何操作.谜题至少可以解决的知识应该让游戏更有趣.
将所有瓷砖反向放置(即从中间开始布局电路板,制定出来)
为了进一步取笑玩家,你可以以非常高的速度明显地做到这一点.
反向玩游戏.
在一个可以将它们滑入堆中的地方随机地逐对布置.您需要一种方法来了解允许放置碎片的位置,以便最终得到与某些预设模式匹配的堆,但无论如何您都需要它.
我知道这是一个老问题,但我在解决问题时遇到了这个问题.这里没有一个答案是完美的,其中一些有复杂的警告或将在病理布局上打破.这是我的解决方案:
使用未标记的磁贴解决板(向前,而不是向后).一次删除两个免费的瓷砖.将您移除的每一对推到"匹配对"堆栈上.通常,这就是你需要做的.
如果你遇到一个死胡同(numFreeTiles == 1),只需重置你的生成器:)我发现我通常没有达到死胡同,到目前为止,10个左右的最大重试次数是3布局我试过了.一旦我重复8次,我就放弃并随意分配其余的瓷砖.这允许我使用相同的发生器来设置电路板和随机播放功能,即使播放器搞砸了并且使其处于100%无法解决的状态.
当你遇到死胡同的另一个解决方案是退出(弹出堆栈,更换板上的瓷砖),直到你可以采取不同的路径.通过确保匹配将删除原始阻止区块的对来采取不同的路径.
不幸的是,取决于电路板,这可能永远循环.如果您最终移除一对类似于"无出口"道路的道路,其中所有后续"道路"都是死路,并且有多个死角,您的算法将永远无法完成.我不知道是否有可能设计一个这样的板,但如果是这样,仍然有一个解决方案.
要解决这个更大的问题,请将每个可能的板状态视为DAG中的节点,每个选定的对都是该图上的边.进行随机遍历,直到找到深度为72的叶节点.跟踪您的遍历历史记录,以便永远不会重复下降.
由于死角比我使用的布局中的第一尝试解决方案更为罕见,因此立即想到的是混合解决方案.首先尝试用最少的内存来解决它(在堆栈上存储选定的对).一旦达到第一个死胡同,在访问每个节点时就会降级为完全标记/边缘生成(尽可能进行延迟评估).
我对图论的研究很少,所以也许有更好的解决DAG随机遍历/搜索问题:)
编辑:你实际上可以使用我的任何解决方案,在2008年10月13日的帖子中反向生成电路板.你仍然有同样的警告,因为你仍然可能最终死路一条.但是,反向生成板有更复杂的规则.例如,如果你没有至少在第一块中间开始你的一些行,例如在长行的布局中,你可以保证你的设置失败.在前向求解发电机中采用完全随机(合法)的第一步更有可能导致可解决的电路板.
我唯一能想到的就是将瓷砖放在配对中,作为一种反向麻将纸牌游戏.因此,在平铺放置期间的任何时候,电路板应该看起来像是在真实游戏的中间(即没有瓷砖漂浮在其他瓷砖上方3层).
如果在反向游戏中将图块放置在匹配对中,则应始终导致至少一个前向路径来解决游戏.
我很想听听其他想法.