Python 解决彩色瓷砖匹配难题的脚本建议

Python 解决彩色瓷砖匹配难题的脚本建议,python,algorithm,Python,Algorithm,我有一个游戏,我正试图设计一个脚本来找到解决方案。我使用python是因为这是我最熟悉的 这里的要点,游戏是一个10 x 14董事会组成的5种不同颜色的瓷砖。机制是,您可以选择在水平轴或垂直轴(对角线不计算)上接触的任何一组2个或多个相同颜色的瓷砖。那群人会消失,上面所有的瓦片都会掉下来取而代之。如果一列完全没有磁贴,则右侧剩余的磁贴列将向左移动以填充间隙。你通过清理棋盘而不留下任何牌来获胜 游戏板的小示例,实际的是10 x 14 第一步-编写python脚本以遵守游戏规则。相当容易 我将瓷砖

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

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

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

第一步-编写python脚本以遵守游戏规则。相当容易

我将瓷砖的颜色映射到数值,并创建如下矩阵:

test\u game\u 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组移动的结果,因此循环速度更快
  • 如果一个移动创建了一个不可赢的棋盘,跳过它(例如:如果一个移动颜色在棋盘上有一个单独的平铺)

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

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

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


例如,还有其他方法,但我认为用它来实现你的谜题的解算器是非常困难的。但是,请查看以获取见解。我将以“是否可以在K个步骤中清空当前板?”的形式生成一个任务。如果没有,请增加K并再次运行Minizing。

谢谢您的建议!我将研究这些不同的领域。一位朋友用python解决了这个问题,一块4色的15x9板,以1s运行。不确定另一种颜色会增加多少,但应该可以在合理的环境下运行time@juvian哦,我对学习他们的方法很感兴趣,你能分享一下代码/例子吗?哦,有了代码,就忘了。