AS3连连看核心算法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[教程] 连连看核心算法详解
最近做了个连连看游戏,综合网上各种不同的思路,整理出了个人认为大家都比较好理解的一套思路。
游戏规则:很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。(说明:下面的行和列按照现实的行和列,并不是按照flash坐标系的坐标,请大家按需转换)
连通算法:
1.直连型
2.一折型
3.两折型
下面我们来分析每一种情况:
直连型
直连性又分为两种情况:横向直连,纵向直连。
首先是横向检测:
a(1,2) , b(1,7)
1.private function horizon(a:Point,b:Point):Boolean
2.{
3. if (a.x == b.x && a.y == b.y) return false; //如果点击的是同一个图案,直接返回false;
4. var x_start:int = a.y < b.y?a.y:b.y; //获取a,b中较小的y值
5. var x_end:int = a.y < b.y?b.y:a.y; //获取a,b中较大的值
6. //遍历a,b之间是否通路,如果一个不是就返回false;
7. for (var i:int = x_start + 1; i < x_end;i ++ )
8. {
9. if (mapData[a.x][i] != 0)
10. {
11. return false;
12. }
13. }
14. return true;
15.}
16.其次是纵向检测:
1.a(1,1) , b(4,1)
2.
3.private function vertical(a:Point,b:Point):Boolean
4.{
5. if (a.x == b.x && a.y == b.y) return false;
6. var y_start:int = a.x < b.x?a.x:b.x;
7. var y_end:int = a.x < b.x?b.x:a.x;
8. for (var i:int = y_start + 1; i < y_end; i ++ )
9. {
10. if (mapData[i][a.y] != 0)
11. {
12. return false;
13. }
14. }
15. return true;
16.}
一个拐角的检测
如果一个拐角能连通的话,则必须存在C、D两点。其中C点的横坐标和B相同,纵坐标与A相同,D的横坐标与A相同,纵坐标与B相同
1.* a(4,2) , b(2,7)
2.* c(2,2) , d(4,7)
3.private function oneCorner(a:Point,b:Point):Boolean
4.{
5. var c:Point = new Point(b.x, a.y);
6. var d:Point = new Point(a.x, b.y);
7. //判断C点是否有元素
8. if (mapData[c.x][c.y] == 0)
9. {
10. var path1:Boolean = horizon(b, c) && vertical(a, c);
11. return path1;
12. }
13. //判断D点是否有元素
14. if (mapData[d.x][d.y] == 0)
15. {
16. var path2:Boolean = horizon(a, d) && vertical(b, d);
17. return path2;
18. }else
19. {
20. return false;
21. }
22.
23.}
两个拐角的检测:
这个比较复杂,如果两个拐角能连通的话,则必须存在图中所示的连线,这些连线夹在A、B的横、纵坐标之间,这样的线就以下这个类存储,direct是线的方向,用0、1表示不同的方向.
Line类结构如下:
1.package
2.{
3. import flash.display.Sprite;
4. import flash.geom.Point;
5.
6. /**
7. * ...
8. * @author icekiller
9. */
10. public class Line extends Sprite
11. {
12. public var a:Point;
13. public var b:Point;
14. public var direct:int; //连线方向1:水平直连 0:垂直直连
15. public function Line(a:Point,b:Point,direct:int)
16. {
17. this.a = a;
18. this.b = b;
19. this.direct = direct;
20. }
21.