最近突发奇想,想写一个连连看小游戏玩一下。没动手的时候以为这个游戏简单的不得了,写起来应该是一挥而就的感觉;等真的写起来才发现是纸上谈来终觉浅,绝知此事要躬行啊。

  连连看的核心算法主要由两部分组成,第一个是地图的生成算法,另一个是地图寻路的算法。本文主要讨论地图的生成。

我们设地图是一个m x n二维数组。

生成算法:

生成算法要求生成一个不总有连续标记出现的二维数组,数组中每个元素都要出现偶数次。

分析:这个数组必须要有偶数个元素:所以m*n%2==0;

其他就是考虑出现偶数次数据和乱序排列的问题了。现在我们设m=6,n=6进行讨论。并设现在数组中共有6个元素可供选择,不要求所有元素都出现,但如果出现必须出现偶数次。

方法一:先生成一个顺序排列的二位数组 如:

 

 
  
  1. map[m][n]={{1,2,3,4,5,6}, 
  2.            {1,2,3,4,5,6}, 
  3.            {1,2,3,4,5,6}, 
  4.            {1,2,3,4,5,6}, 
  5.            {1,2,3,4,5,6}, 
  6.            {1,2,3,4,5,6},} 

然后循环遍历数组元素和数组中任意位置的数交换,得到打乱顺序的数组。

 

 
  
  1. map[m][n]={{1,4,2,5,6,2,} 
  2.            {2,1,6,5,1,2,} 
  3.            {1,2,3,5,3,4,} 
  4.            {1,4,3,6,6,6,} 
  5.            {4,6,3,5,3,5,} 
  6.            {4,2,5,1,4,3,}} 

评价:此方法生成初始数组的过程简单,但是初识变量需要人为规定好如何布局,以确保有偶数个元素出现,并且每个元素出现的次数固定,对元素个数也有一定要求。随机打乱后数组元素的离散度不高。

方法二:

1、根据数组可用元素个数x,先生成二维数组的前m*n-x个元素。这些元素的值随机取任意有效值(可让每个元素与前方,上方元素不等)。

2、另开辟一长度x的一维数组a[x]记录每个有效值出现的次数。

3、根据a将出现奇数次的元素排列于二维数组末尾,其余位置用随机一对儿相投元素填充。

4、将二维数组的最后x个元素与任意数组元素交换位置。

方法三:

1、先随机生成二维数组半数的元素,将其复制到二维数组的另一半。

2、遍历数组,随机交换数组中的元素。

 

评价:方法二和方法三生成数组的元素个数随机度和元素的离散程度差不多,但都要优于方法一。方法三比方法二步骤简单,但是要多经历一次循环。各有优劣,但性能相差不大。

 

方法四:模板法,顾名思义,就是使用现成的模板。这个不属于生成图的方法,但是我认为有必要提一下他,因为我认为这才是最好的获得连连看地图的方法。

因为此方法系统资源开销小,有利于控制关卡难度,地图随机度也好,简单易得呀!

 

上述前三种方法都没有考虑全图是否有解(第四种方法要看你选的模板考虑了没。。),下面我们再来研究一下如何保证全图有解。

注:全图有解其实在真实的应用中的意义本人认为是不大的,因为很多情况下有解的图在解图过程中也可能转变成无解图,所以即使你生成的图有解有能怎样呢?所以目前遇到图无解采用的方法就是——随机重排!简单实惠,好吃不贵哦。以下讨论只做算法研究。

 

判断图是否有解最直接的方法就是——解,解一张图,如果发现无解就重新生成一张再解(暴力啊)。

另一方法:

1、解图,将消去的元素按其位置不变存放于另一个空二维数组中,直到原图无解;

2、将原图元素限定在非空元素位置重排;

3、然后继续解图,将消去元素对应位置放于另一个数组中。

4、重复2、3直到原图消完。此时另一个数组中存放的即是一个有解图。

注:本人认为此方法可行性最高。

 

另一方法:生成有解图。

根据寻路算法规律将一对对元素按消去规律放置在地图中(需要利用栈的回溯)。

此方法冗繁复杂,并且效果不好,可行性不高,再次就不深入讨论了。

 

如果你有什么更好的生成图算法,请留言告诉我!