连连看游戏的核心算法

 最近想做一个连连看的游戏,但一直没动手,因为觉得自己的思路还不够成熟,我做一个小游戏,一般是思路比较成熟了,才会去动手做,哈哈。我觉得这是对了的,是应该先考虑周全了再动手做,现在做大项目都提倡先写文档,详细的设计思路(越详尽越好),再来动手,不然会手忙脚乱的,经历一次次的推倒重来,做小游戏也是一样的道理。好了废话就此打住。

        做连连看游戏,要解决的基本问题有两个:

               第一是给你一个连连看初始布局,用程序来自动求解它。

               第二是如何生成连连看游戏初始布局,并且保证这个布局是有解的。

        第一个问题比较简单,就用广度优先搜索,或者深度优先搜索就可以轻松解决。第二问题就要复杂些了,有些难度,我思考了一下没有好的办法,就去baidu,google找了一下,最先看到csdn上有人说了,可以这样弄:

方法1:

        1.随机生成一个连连看的布局,这个布局可能无解,(布局的棋子总数必须是偶数,各种棋子必须成对出现,否则一定无解)

        2.自动求解的这个布局。

        3.如果布局出现死局就转到4,没有出现就大功告成。

        4.改变死局中任意两个棋子的位置,然后转到2.

        这个算法虽然最终可以生成有解的布局,但是并不高效,还挺复杂的。

        首先每当发现死局出现时,都要用数组去记录这个死局,以免出现重复的搜寻(走回头路),交换死局中任意两个棋子的位置时,都要看看交换后的残局是不是和数组中的死局重复了,重复的话必须继续改变死局,直到和数组中记录都不重复时,才可以转到2。

       其次从2到3这个过程也挺麻烦的,需要调用自动求解的函数,消耗不少资源,求解连连看时,不可以遇到死局就转到4,因为一个本来有解连连看极有可能在求解时变成无解的。,从2到3这个过程也有回溯,考虑这样一种情况:再用自动求解函数对布局进行求解后,最终发现这个布局是死局,无解,那么就会得到若干个在自动求解过 程中遇到的死局,我们还需要选出其中棋子总数最少的死局,这时才可以转到第4步。

         所以说这个算法太麻烦了,今天在网上又找到个生成布局更好的办法。

         这个算法是这样的:

方法2:

         1.首先确定要生成什么尺寸的连连看,比如12 x 8,16 x 24 ...

         2.在布局中心区域内随机放置一对棋子。第一对棋子不管怎么放,根据连连看的规则都是可以消除的,所以什么都不要管,转到3。

         3.继续放置下一对棋子

         4.还有空位可以放棋子吗,没有的话转到第7步。有的话转到第5步。

         5.检测新放入的这对棋子,可不可以根据连连看规则消除,可以的话转到3,不行的话,转到第6步。

         6.撤销这对棋子的放置,并用数组记录这对新棋子是如何放的,以免下次重复这样放,转到3.

         7.用自动求解函数验证新生成的布局是否有解,有解就大功告成,无解就跳转到第8步。

         8.从最后放的棋子开始回溯,通过回溯改变了棋子的布局,再转到第7步。

          为什么要验证?最后放置的两对棋子可以让整个棋局无解,但回溯的次数应该不多,我猜平均两三次吧。这个方法的缺点是随机产生布局的样本空间比方法1和方法3小,

实际上第5步可以改成用自动求解函数求解当前残局,没有则回溯,有则放置下一对,但这样一来样本空间大了,效率又低了。

方法3:

          1.随机生成一个连连看的布局,这个布局可能无解。

          2.自动求解的这个布局。

          3.有解就大功告成,无解转到第1步。

实践后的情况:

        最终当我把连连看游戏做出来后,发现自动求解对于一个连连看游戏并不是一个必要的功能,没有自动求解功能的连连看,用户照样可以玩的很high,而自动求解应该是连连看游戏开发过程中,最难的一个模块,比连连看的布局生成还难。

        而连连看的布局生成并没有想象中的那么复杂,当我用方法3去生成有解的布局,发现如果打乱算法很简单的话,生成的布局不够乱,用我写的自动求解函数求解后发现,几乎100%是有解的,但是很多对棋子都是直接相邻的,一眼就能发现很多都可以马上消掉,这样的话游戏难度就低,菜鸟都可以轻松过关。我把打乱算法复杂化后,生成的布局就难了,菜鸟在没有提示的情况下基本不能通关,或者通关要花很长时间,这时也有40%的几率一次性生成有解布局,而生成有解布局目前还没有一次是失败了4次的。

        另外,其实连连看的初始布局无解也无所谓,但必须保证至少有一对棋子可以消除以及用户在玩游戏过程中每消除一对棋子,都是有至少一对棋子是可以消除的。如果用户在玩游戏过程中出现死局(没有任何一对棋子可以消除了),就变换布局,使得至少有一对棋子可以消除。这样的话初始布局肯定可以消除完。

感想:

        1.连连看在判断一对棋子是否可以消除时,推荐用广度优先搜索,在自动求解连连看时,推荐用深度优先搜索。

        2.广度优先搜索和深度优先搜索在棋类游戏中是非常常用的算法。

        3.光想不做是不行的,做程序要务实,不想就做也不好,要走弯路。

        4.做前端程序好啊,想写个什么出来玩,就可以真的弄个出来,呵呵。

连连看的Flex版本下载地址:

http://download.csdn.net/detail/mu399/4477486
--------------------- 
作者:从杰 
来源:CSDN 
原文:https://blog.csdn.net/mu399/article/details/6982650?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值