方法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,而自动求解应该是连连看游戏开发过程中,最难的一个模块,比连连看的布局生成还难。
1.连连看在判断一对棋子是否可以消除时,推荐用广度优先搜索,在自动求解连连看时,推荐用深度优先搜索。
其实连连看使用的算法并不多,主要还是集中在地图生成算法、匹配消除算法。我们先来看看地图生成算法
地图生成算法
连连看的地图其实可以简单的看成一个二维数组,数组的大小取决于所要绘制的元素的个数。但是我们我们必须要保证元素是成对出现的,也就是说,假如显示的数组的长为m,宽为n,那么必须要保证* m \ n / 2 == 0 **。
现在我们来看下地图生成的几种算法(以5*6)的数组为例:
- 生成一个m*n/2的数组,然后再把数组的前一半拷贝到数组的后一半,随机进行打乱。我们用lua来演示下吧:123456789101112131415161718
matrix = {}
total_row = 5
total_col = 6
total_type = 5
for
i = 1, (total_row*total_col)/2
do
matrix[i] = math.random(1, 5)
end
for
i = 1, (total_row*total_col)/2
do
table.insert(matrix, matrix[i])
end
==> 1,3,1,5,3,3,
2,5,5,4,1,5,
4,3,2,1,3,1,
5,3,3,2,5,5,
4,1,5,4,3,2,
从生成的数据可以看出,这种方法离散度并不是太强。我们还需要再随机一次,将原有的数据打乱。12345678910111213141516171819for
seq = 1, 13*2
do
for
i = 1, #self.m_sprites
do
local row_org = math.random(1, total_row)
local col_org = math.random(1, total_col)
local row_dest = math.random(1, total_row)
local col_dest = math.random(1, total_col)
matrix[(row_org-1)*total_col + col_org], matrix[(row_dest-1)*total_col + col_dest]
= matrix[(row_dest-1)*total_col + col_dest], matrix[(row_org-1)*total_col + col_org]
end
end
==> 5,2,1,3,1,3,
3,5,1,3,3,4,
3,5,4,1,2,4,
3,2,1,1,5,5,
5,2,3,5,5,4,
- 模板法。所谓模板就是手动或者用工具建立一个模板,在生成地图时,根据模板的设置来生成地图。比如我们生成一个地图格式如下:1234567
map = {
1,2,3,4,5,6,
5,4,3,2,1,6,
1,2,3,4,5,5,
3,5,4,2,1,6,
2,4,3,5,2,1
}
我们可以根据上面的地图模板生成对应的精灵并且显示出来。其实这个方法应该是最有效的生成地图的方法,能适应各种需求。
上面描述的方法中,我们都没有确定地图是否有解。对于模板法其实我们在生成地图的时候就可以生成一个有解的地图;对于随机生成法来说就比较麻烦了,我们必须要去解地图。而解地图就要用到我们下面要讲述的匹配消除算法了。
http://upupxjg.blog.51cto.com/2665891/662658/方法三:
1、先随机生成二维数组半数的元素,将其复制到二维数组的另一半。
2、遍历数组,随机交换数组中的元素。
判断图是否有解最直接的方法就是——解一张图,如果发现无解就重新生成一张再解(暴力啊)。
另一方法:
1、解图,将消去的元素按其位置不变存放于另一个空二维数组中,直到原图无解;
2、将原图元素限定在非空元素位置重排;
3、然后继续解图,将消去元素对应位置放于另一个数组中。
4、重复2、3直到原图消完。此时另一个数组中存放的即是一个有解图。
注:本人认为此方法可行性最高。