首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 网页教程 > Flash教程 > 正文
Google
zszen式连连算法
来源:闪吧论坛 作者:zszen 2007年06月27日 15:34 网友评论:0条 点击:
连连看算法,大家看看有没有错误...
2是两个可以匹配的对象,1为障碍,0为空 可通过。

原理是扫描横排或是纵排是否存在全空行/列,只有存在这种状况,连线的拐点才能达到2个以内。

先看看linkup简单实例[核心算法得到]:
/UploadTeach/200706/20070626155536272.swf
070626最新修改
增加了例子、特效,都算上不到200行代码。
//矩阵
/*
[0,2,1,0]
[0,1,2,0]
[0,1,1,0]
[0,0,1,0]

[0,2,1,0]
[0,1,0,0]
[0,1,1,0]
[0,0,0,2]

[0,2,0,1]
[0,1,0,0]
[1,1,1,2]
[0,1,1,0]
*/
//前两个是两个目标点,最后一个是整体最大区域 目标点修改 矩阵也需要修改
//ary = [[0, 2, 1, 0], [0, 1, 2, 0], [0, 1, 1, 0], [0, 0, 1, 0]];
//trace(outPath({i:0, j:1}, {i:1, j:2}, {i:4, j:4}));
//ary = [[0, 2, 1, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 2]];
//trace(outPath({i:0, j:1}, {i:3, j:3}, {i:4, j:4}));
ary = [[0, 2, 0, 1], [0, 1, 0, 0], [1, 1, 1, 2], [0, 1, 1, 0]];
trace(outPath({i:0, j:1}, {i:2, j:3}, {i:4, j:4}));
function outPath(now, then, limit) {
var mini = Math.min(now.i, then.i);
var maxi = Math.max(now.i, then.i);
var minj = Math.min(now.j, then.j);
var maxj = Math.max(now.j, then.j);
var limiti = limit.i;
var limitj = limit.j;
var haveLine;
var i = 0;
var j = 0;
///纵列 当用纵列来扫描 行i就限制在两目标点之间
for (i=0; i<limiti; i++) {
  haveLine = true;
  for (j=minj; j<=maxj; j++) {
   //trace([i, j, ary[j]]);
   if (!(i == now.i && j == now.j) && !(i == then.i && j == then.j)) {
    if (ary[j] == 1) {
     haveLine = false;
     break;
    }
   }
  }
  if (haveLine) {
   var check = unitEmpty({i:i, j:now.j}, {i:now.i, j:now.j}) && unitEmpty({i:i, j:then.j}, {i:then.i, j:then.j});
   if (check) {
    break;
   } else {
    haveLine = false;
   }
  } else {
   haveLine = false;
  }
}
if (haveLine) {
  return haveLine;
} else {
  //行列 当用行列来扫描 列j限制在两个目标点之间
  for (j=0; j<=limitj; j++) {
   haveLine = true;
   for (i=mini; i<=maxi; i++) {
    if (!(i == now.i && j == now.j) && !(i == then.i && j == then.j)) {
     //trace([i, j, ary[j]]);
     if (ary[j] == 1) {
      haveLine = false;
      break;
     }
    }
   }
   if (haveLine) {
    var check = unitEmpty({i:now.i, j:j}, {i:now.i, j:now.j}) && unitEmpty({i:then.i, j:j}, {i:then.i, j:then.j});
    if (check) {
     break;
    } else {
     haveLine = false;
    }
   } else {
    haveLine = false;
   }
  }
  return haveLine;
}
}
function unitEmpty(now, then) {
//取得两目标点是否其间可穿越,必须是同行或是同列
var mini = Math.min(now.i, then.i);
var maxi = Math.max(now.i, then.i);
var minj = Math.min(now.j, then.j);
var maxj = Math.max(now.j, then.j);
//trace([mini, maxi, minj, maxj]);
var haveLine = true;
if (mini == maxi) {
  for (var j = minj+1; j<maxj; j++) {
   if (ary[mini][j] == 1) {
    haveLine = false;
    break;
   }
  }
  return haveLine;
} else if (minj == maxj) {
  for (var i = mini+1; i<maxi; i++) {
   if (ary[minj] == 1) {
    haveLine = false;
    break;
   }
  }
  return haveLine;
}
return false;
}

图片附件: [先纵向计算] 01.gif
按此在新窗口浏览图片

图片附件: [纵向有贯通点,进一步横向检测] 02.gif
按此在新窗口浏览图片

图片附件: [如果纵向无法联通,横向计算] 03.gif
按此在新窗口浏览图片

图片附件: [横向有连通,进一步纵向检测] 04.gif
按此在新窗口浏览图片

linkup实例源文件:20070627003.rar
上一篇:用Flash模拟制作简单的3D视觉特效   下一篇:Flex 2.0实现SWF全屏
收藏此页】【打印】【关闭
 相关文章  我要点评

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】