网站大量收购独家精品文档,联系QQ:2885784924

AS3連连看核心算法详解.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AS3連连看核心算法详解

[教程] 连连看核心算法详解最近做了个连连看游戏,综合网上各种不同的思路,整理出了个人认为大家都比较好理解的一套思路。 游戏规则:很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。(说明:下面的行和列按照现实的行和列,并不是按照flash坐标系的坐标,请大家按需转换)连通算法:1.直连型 2.一折型 3.两折型 下面我们来分析每一种情况:直连型直连性又分为两种情况:横向直连,纵向直连。首先是横向检测:a(1,2) , b(1,7) private function horizon(a:Point,b:Point):Boolean { if (a.x == b.x a.y == b.y) return false;??//如果点击的是同一个图案,直接返回false; var x_start:int = a.y b.y?a.y:b.y;? ?? ???//获取a,b中较小的y值 var x_end:int = a.y b.y?b.y:a.y;? ?? ?? ? //获取a,b中较大的值 //遍历a,b之间是否通路,如果一个不是就返回false; for (var i:int = x_start + 1; i x_end;i ++ ) { if (mapData[a.x][i] != 0) { return false; } } return true;}其次是纵向检测:a(1,1) , b(4,1)private function vertical(a:Point,b:Point):Boolean { if (a.x == b.x a.y == b.y) return false; var y_start:int = a.x b.x?a.x:b.x; var y_end:int = a.x b.x?b.x:a.x; for (var i:int = y_start + 1; i y_end; i ++ ) { if (mapData[i][a.y] != 0) { return false; } } return true;}一个拐角的检测如果一个拐角能连通的话,则必须存在C、D两点。其中C点的横坐标和B相同,纵坐标与A相同,D的横坐标与A相同,纵坐标与B相同* a(4,2) , b(2,7)* c(2,2) , d(4,7)private function oneCorner(a:Point,b:Point):Boolean { var c:Point = new Point(b.x, a.y); var d:Point = new Point(a.x, b.y); //判断C点是否有元素 if (mapData[c.x][c.y] == 0) { var path1:Boolean = horizon(b, c) vertical(a, c); return path1; }?//判断D点是否有元素 if (mapData[d.x][d.y] == 0) { var path2:Boolean = horizon(a, d) vertical(b, d); return path2; }else { return false; } }两个拐角的检测:这个比较复杂,如果两个拐角能连通的话,则必须存在图中所示的连线,这些连线夹在A、B的横、纵坐标之间,这样的线就以下这个类存储,direct是线的方向,用0、1表示不同的方向.Line类结构如下: package??{ import flash.display.Sprite; import flash.geom.Point; /**?* ...?* @author icekiller?*/ public class Line extends Sprite { public var a:Point; public var b:Point; public var direct:int; //连线方向1:水平直连 0:垂直直连 public function Line(a:Point,b:Point,direct:int) { this.a = a; this.b = b; this.direct = direct; } }}从A、B点的横纵两个方向进行扫描,就是Scan函数做的事情,把合适的线用LinkList存起来。判断是否是二连型的算法需要做两个方向上的扫描:水平扫描和垂直扫描。先看水平的,首先,要找到棋子往左右可以延伸的范围,这里的延伸是指左右有多少空的位置;然后,计算水平坐标上两个棋子延伸出来的公共部分;最后,找公共的水平坐标里有没有可以“垂直直连”的.用图6,7,8说明图(6)图(7)水

文档评论(0)

cv7c8hj6b4I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档