建议脚本解决颜色瓷砖匹配拼图

时间:2017-08-04 02:55:36

标签: python algorithm puzzle

我有一个游戏,我试图设计一个脚本来找到解决方案。我使用的是python,因为这是我最熟悉的。

这里是要点,游戏是由5个不同颜色的瓷砖组成的10 x 14板。机制是您可以选择任意一组2个或更多相同颜色的瓷砖在水平或垂直轴上接触(对角线不计算)。然后该组将消失,上面的所有瓷砖都会掉下来取代它们。如果列完全没有拼贴,则右侧任何剩余的拼贴列将向左移动以填充间隙。你通过清理棋盘而不留下任何瓷砖来获胜。

游戏板的小例子,实际的是10 x 14

Much smaller example of the game board

第一步 - 编写一个python脚本来尊重游戏规则。相当容易。

我将贴图的颜色映射到数字值并创建如下矩阵:

test_game_board = [
    [2, 2, 2, 1, 1, 1, 5], 
    [2, 2, 2, 3, 3, 1, 5], 
    [3, 2, 4, 5, 3, 3, 5], 
    [3, 3, 4, 5, 5, 3, 5], 
    [1, 1, 1, 1, 1, 3, 5], 
    [1, 1, 5, 5, 1, 4, 4]]

我解析矩阵并找到所有相同颜色的连续图块,并为当前板上的每个可能移动创建一个对象。

然后我给出了一段代码,给出了一定的符合条件的移动(参见后面关于选择移动的逻辑的评论)来更新游戏板的副本并将瓦片向下移动到需要的位置。

再次检查棋盘以刷新符合条件的移动列表,因为切片已移动。

如果有合格的举动,那么继续选择新动作。 如果找不到更多符合条件的移动,那么我会检查棋盘以查看我是否输了或赢了比赛。 如果游戏丢失,我会重新开始并重置为原始游戏板布局。

以上表现似乎贯穿30-40次动作,并在约0.0350秒内完成一次游戏尝试。

第二步 - 选择一系列动作

我尝试过几种方法:

  • 每回合随机选择一个动作:即使在运行脚本数小时之后,它也没有重复从几百万次尝试中移出的确切顺序。

  • 我尝试通过每次移动中有多少个瓷砖来选择移动并选择较大的移动。

  • 顺序完成可能的动作。与随机选项相同,但这样我可以看到它正在取得的某些进展。我已经尝试在备用机器上运行这几天,它已经通过了1500万个序列,并且在可能的总移动量未知的数量上仍然不是很远。

所以我想我的问题是,如果有人有任何资源或想法,我可以设计一个算法来解决这个问题,而不是我目前的暴力强迫方法。我可以在pastebin上发布脚本,或者不想让我的帖子膨胀的东西比现在更多:P

编辑:所以我选择了蛮力顺序路线。我在合格动作列表中选择了第一步。如果移动顺序失败,我将重新开始并增加最后一次合格的移动。所以我正在为蛮力方法进行一些优化:

  • 缓存序列中N组移动的结果,因此循环更快。
  • 如果移动创建了一个不可赢的棋盘跳过它(例如:如果移动颜色在棋盘上有一块单独的瓷砖)

我认为如果我找到更多优化,我可以在合理的时间内解决这个难题:)

1 个答案:

答案 0 :(得分:1)

这根本不是一个简单的问题。)我认为这个任务属于NP-complete类,因此没有简单的方法来解决它。

你能做什么?尝试使用A* search。作为一种启发式方法,您可以尝试选择一些可以通过操作删除的元素(我不确定它是否正确/最佳,您必须自己研究它)。 / p>

还有其他方法,例如constraint satisfaction,但我认为用它来实现拼图的解算器非常困难。但是,请查看Minizinc了解相关信息。我会生成一个任务形式的任务,是否有可能在K步骤中清空当前的电路板?'。如果没有,请增加K并再次运行Minizinc。