注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

永恒的遗失古都-亚特兰蒂斯

一个游戏开发者的个人博客。

 
 
 

日志

 
 

连连看路径算法(1)  

2013-05-21 22:58:00|  分类: 程序相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<转载于http://hi.baidu.com/139694197/blog/item/25c700a8c787ecb6ca130c63.html>

连连看路径算法(1) - 自由骑士笃志 - 永恒的遗失古都-亚特兰蒂斯

/*方格数组,高9,宽12。数字0代表空缺位置,其他数字代表每种图像块,同数字代表同种图像块,规定头尾数组所有元素只能为0,各数组首尾元素只能为0,以构成一个矩形环绕空位。用表达式map_ary[0~9][0~12],可以访问这个矩阵的所有元素。
*/ var map_ary:Array = Array();
////               [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2]; map_ary[0] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; map_ary[1] = [0, 1, 3, 4, 7, 7, 8, 9, 1, 6, 6, 2, 0]; map_ary[2] = [0, 3, 5, 6, 8, 8, 9, 2, 5, 7, 0, 7, 0]; map_ary[3] = [0, 4, 2, 6, 7, 5, 4, 3, 0, 0, 0, 2, 0]; map_ary[4] = [0, 7, 5, 9, 3, 8, 0, 8, 0, 5, 4, 5, 0]; map_ary[5] = [0, 5, 3, 4, 0, 0, 7, 5, 4, 2, 4, 2, 0]; map_ary[6] = [0, 1, 0, 3, 6, 0, 0, 6, 2, 4, 5, 6, 0]; map_ary[7] = [0, 6, 0, 0, 0, 7, 0, 4, 3, 8, 9, 4, 0]; map_ary[8] = [0, 2, 5, 6, 7, 4, 3, 9, 7, 9, 8, 1, 0]; map_ary[9] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; /*
排序方法函数,用于Array.sort()方法的调用。编写方法是function 函数名(第一个元素,第二个元素):Number{如果第一个元素和第二个元素不换位置则返回-1;否则返回1;如果相等就返回0}
使用:数组名.sort(函数名);
下面的这个函数把数组元素的长度作为排序的依据,a.length大于b.length则换位。从而按照此方法排序后的数组是以元素长度升序排列的。
但首先必须确认从数组中取出的的元素具有.length属性,即元素要属于Array或者String,所以被排序的数组是一个嵌套数组。
因为路径集在算法构思时被定义为一个嵌套数组,它的元素是一条条路径,而路径由一个个点组成,一个点由两个坐标组成。
如:paths=[[[1,1],[1,2],[1,3]],[[2,1],[2,2]]]
        paths.length的值为2,即包含两条路径
        paths[0].length的值为3,即第一条路径的长度是3,也即第一条路径包含3个点[1,1],[1,2],[1,3]。
        如果要访问到最低层元素可以用类似表达式:paths[0][0][0] 值为1,意为第一条路径的第一个点的第一个坐标。
        paths.sort(byLength)后较深层数据顺序不变,只改变paths第一层数据即路径的顺序。结果为:[[[2,1],[2,2]],[[1,1],[1,2],[1,3]]]
*/ function byLength(a:Array, b:Array):Number {
        if (a.length>b.length) {
                return 1;
        } else if (a.length<b.length) {
                return -1;
        } else {
                return 0;
        }
}/*
遍历序列建立函数,建立一个从v1到v2值中间向两边扩展的序列,以确保遍历从可能出现最短路径的位置开始。
如有一个数列8,6,4,2,0,1,3,5,7,9 现假设要从0的位置开始扩展,得到的数列为0,1,2,3,4,5,6,7,8,9。
现在反过来,原来数列是0,1,2,...,vmax,用(v1+v2)/2作为开始位置。
如:create_sequence(1,8,9)得到的数组是:4,5,3,6,2,7,1,8,0,9。
*/ function create_sequence(v1:Number, v2:Number, vmax:Number):Array {
        var sequence:Array = Array();
        var tmp_ary:Array = Array();
        for (var j = 0; j<=vmax; j++) {
                sequence.push(j);
        }
        var i = int((v1+v2)/2);
        for (j=0; j vmax-i ? i : vmax-i); j++) {
                if (j == 0) {
                        tmp_ary.push(sequence[i]);
                } else {
                        if (sequence[i+j] != undefined) {
                                tmp_ary.push(sequence[i+j]);
                        }
                        if (sequence[i-j] != undefined) {
                                tmp_ary.push(sequence[i-j]);
                        }
                }
        }
        return tmp_ary;
}/*
下面函数的作用是判断路径是否被阻断(是否不全为0),如果被阻断则返回值true,主函数将继续下一个搜索。
a是个数组用来接收一段路径。其他四个数字是例外的点,因为被判断的两个图块不可能是空缺的,但是
路径的两端包含着这两个点,传递这四个参数的目的是把它们当作是通的。
*/ function ary_isBlocked(a:Array, x1:Number, y1:Number, x2:Number, y2:Number):Boolean {
        for (var m = 0; m<a.length; m++) {
                if (map_ary[a[m][0]][a[m][1]] != 0) {
                        if ((a[m][0] == x1 && a[m][1] == y1) || (a[m][0] == x2 && a[m][1] == y2)) {
                        } else {
                                return true;
                        }
                }
        }
        return false;
}/*
下面函数的作用是判断一个点是否被阻断(是否不为0),如果被阻断则返回值true,主函数将继续下一个搜索。
*/ function pot_isBlocked(xi:Number, yi:Number, x1:Number, y1:Number, x2:Number, y2:Number):Boolean {
        if ((xi == x1 && yi == y1) || (xi == x2 && yi == y2)) {
                return false;
        }
        if (map_ary[xi][yi] != 0) {
                return true;
        } else {
                return false;
        }
}

  评论这张
 
阅读(23)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018