这是我第3次做拼图游戏了。算法简单得很,而且是最少的9宫拼图,拿到设计稿后不外几个小时搞定。
记得2008年7月份,刚毕业被EOL拉进PCHome的时候,工作所做的第一个就是flash游戏拼图(9、16、25宫)。那时为了研究出如何防止拼图死局,着实花了不少功夫(小时候玩的金山文曲星中就经常出现这个bug)。为此我特地发了个帖子求助数学大人,最终问题得以解决。
那么,什么是拼图死局呢?
以最简单的9宫拼图为例,拼图的最终目的是将随机的数块移动到如下状态:
1 2 3
4 5 6
7 8
第9格是空的,用以让玩家能够任意移动某一个数块。但是,初始随机情况可能会是这样:
1 2 3
4 5 6
8 7
这种情况下,想要变换到正确的结束状态是不可能的。至于为什么,繁琐的数学证明就不贴了。记得曾经《读者》杂志上刊登过这个东西,说是国外某位数学家悬赏1000w美金让人来拼这个拼图,结果无一人能做到。最后他才公布为何不能做到:因为这种情况的开始逆序和和目标逆序和不同。
数学定义:
n*n的方格中放入1,2,3,…,n-1及一个空格,在任何一种状态A下,
定义:f(i)=k,表示i放在第k个格子中,k按照从左至右,从上到下排序;
定义:g(i,j)=1,如果(f(i)-f(j))(i-j)<0;否则为0;
定义:F(A)=SUMg(i,j),对所有i,j求和;
当n=3时;
目标状态F(Aobj)=0,你给的状态F(Abegin)=1;
而移动空格只有2种方式:在同行中移动不改变F值,在不同行中移动F值+2,-2或不变;
利用F函数可以解决所有n为奇数的情况;
当n为偶数时,定义F1(A)=F(A)+空格所在行&1;处理方式一样。
当初始随机情况出现死局时,逆序和就会不相等,那么发现之后该怎么办呢?当然不会重新去随机一次,这太傻了。解开锁的钥匙很简单,随便交换同行的2个数块的位置即可。
那个时候写的一个产生9、16宫随机初始数块顺序的工厂(现在看来无需用工厂方法,一个类就能搞定):
//GenMatrixFactory
package matrix {
public class GenMatrixFactory {
public static function getArray(i:int):Array {
var…

本博客所有文章均采用