38 12
发新话题
打印

[编程] 连连看算法[zszen式连连算法]070626更新

连连看算法[zszen式连连算法]070626更新

理论和实践的结合,完美的连连看算法

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

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;
}
[ 本帖最后由 zszen 于 2007-9-2 17:39 编辑 ]

附件

01.gif (2.77 KB)

2007-6-22 11:51

先纵向计算

01.gif

02.gif (2.81 KB)

2007-6-22 11:51

纵向有贯通点,进一步横向检测

02.gif

03.gif (2.56 KB)

2007-6-22 11:51

如果纵向无法联通,横向计算

03.gif

04.gif (2.71 KB)

2007-6-22 11:51

横向有连通,进一步纵向检测

04.gif

核心算法.swf (622 Bytes)

2007-6-22 16:13, 下载次数: 310

核心算法.zip (8.56 KB)

2007-6-22 16:13, 下载次数: 256

my link up.swf (5.41 KB)

2007-6-26 08:50, 下载次数: 235

linkup简单实例[核心算法得到]

lp.zip (21.63 KB)

2007-6-26 08:50, 下载次数: 290

linkup实例源文件

54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

没看出什么时候是false..
寻觅终生伴侣!

my blog

TOP

沉了 沉了 这么好的算法 没人顶真可惜
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

又没原文件,又没图释,又没注释,啥都没有,懒的看

TOP

啊~!好算法!收藏!顺便顶!

TOP

不过建议还是加上注释

TOP

假如这样的情况
ary = [[1, 1, 1, 1], [1, 2, 0, 1], [1, 1, 2, 1], [1, 1, 1, 1]];

结果返回的是false....

是不是limit也要跟着设置?
寻觅终生伴侣!

my blog

TOP

循环那个位置 有问题 呆细琢磨 之前我设置的外循环是 在min和max之间 包括他们 后来又给改成了limit的最大和最小了  具体问题还需要多画图
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

刚学flash的时候写过一个连连看.考虑的情况有多种
你现在有几种情况,返回是false的

TOP

连个注释都没啊 这怎么看 以前的算法好像是 看折点

TOP

感觉就用一个fn没必要注释吧 代码也不长 ,除非你不想看懂就想改代码直接用
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

更新了 更新了 还增加了 注释和图解
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

..怎么能通过两个位置来确定一个矩形范围呢?>>>

//矩阵
/*
[0,2,1,0]
[0,1,0,0]
[0,1,1,0]
[0,0,0,2]
*/
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}));

//打印结果看看
寻觅终生伴侣!

my blog

TOP

有这么几种情况
1. 两点之间没有拐点
2. 两点之间只有一个拐点
3. 两点之间有两个拐点

第一中情况,很好判断.不说了,
第二种情况:分别取两点横\纵方向,通路的线段,如果有交叉点,则通过
第三种 :a,b两点
取a点,先取其横向通路线段的点加入列表A,从A列表第一个点开始,取其纵向通路的点线段,如果该线段与b点的横向线段交叉则相通.........(其他情况类似)

太拗口了,表达不清楚

第三中情况的图

[ 本帖最后由 quhuan 于 2007-6-22 15:03 编辑 ]

附件

111.jpg (7.9 KB)

2007-6-22 15:00

111.jpg

TOP

这回没有问题了 ><
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP


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}));
这样返回true

[ 本帖最后由 quhuan 于 2007-6-22 15:28 编辑 ]

TOP

唉 哈 不好意思 第一个循环里面的襄套循环 j<=maxj 不是j<maxj 疏忽 疏忽 呵呵
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

终于有注释了~
呵呵,谢谢楼主的热心啊~

TOP

严重谢谢ycccc8202和quhuan帮我测试
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

谢谢版主 HOHO 不错 ~

TOP

有点象迷宫哈!·

TOP

各位朋友,谁下载好了[超级收集2500多个FLASH源代码下载演示]?现在不能下载,哪个朋友能传给我,QQ343776259,谢谢

TOP

当年我写过,也一样沉得很快
欢迎大家来浏览我的参赛作品,有空支持下,没空也按下投票键,谢谢.
[url]http://kp.flash8.net/Flash/275.html[/url]

TOP

应该顶呀

TOP

看的有点蒙 继续看

TOP

这坟挖得好 顶下慢慢看.

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

 38 12
发新话题