简单flash代码实现连连看

不做不知道,连连看原来如此简单
四个as类加一张图片

Main.as文件

package LianLian.Mains { import flash.display.Sprite; import flash.display.Shape; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.net.URLRequest; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.events.Event; import LianLian.Box.ImageBox; import LianLian.Image.ImageCtrl; public class Main extends Sprite{ //声明Bitmap private var _image:Bitmap; //图片载入器 private var _pic_loader:Loader; //图片数组 public var _imageArr:Array; public var _mapLeng:int; //数据数组 public var _mapArr:Array; //小块数组 public var _boxArr:Array; //小块 private var _box:ImageBox; //点击图片数组 public var _clickArr:Array; //线数组 public var _lineArr:Array; //底层Sprite private var _spriteImage:Sprite; //线Sprite private var _spriteLine:Sprite; //搜索类 private var _query:QueryRoad; //画线时间控制 private var _lineCtrl:int; //画线笔刷 private var _shapes:Shape; /** *Main类 *构造器 */ public function Main() { //初始化各个数据 //添加底层画板和线画板 _spriteImage = new Sprite(); _spriteLine = new Sprite(); addChild(_spriteImage); addChild(_spriteLine); _clickArr = new Array(); _mapArr = new Array(); _boxArr = new Array(); _lineArr = new Array(); _query = new QueryRoad(this); //设置数组长度 _mapLeng = 8; //载入外部图片 _pic_loader = new Loader(); _pic_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadImage); _pic_loader.load(new URLRequest("image.jpg")); } /** *载入外部图片完毕 */ private function onLoadImage(event:Event):void { _pic_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoadImage); _image = Bitmap(_pic_loader.content); //拆分图片 _imageArr = ImageCtrl.divide(_image,15,1); //随机数组生成与显示 setMapArr(_mapLeng); } /** *连接判断 *返回值:无 */ public function checkClick():void{ //点击图片数小于2的时候,无处理 if(_clickArr.length < 2){ return; } //开始检索判断 //判断两个图片是否相同 if(_clickArr[0]._index != _clickArr[1]._index){ //如果两个图片无法消去 _clickArr[0].alpha = 1; _clickArr.splice(0,1); return; } //进行搜索 _query.queryCheck(); //如果两个图片可以消去 if(_lineArr.length > 0){ _lineCtrl = 0; this.addEventListener(Event.ENTER_FRAME, onFrame); }else{ //如果两个图片无法消去 _clickArr[0].alpha = 1; _clickArr.splice(0,1); } } /** *贞函数 */ private function onFrame(event:Event):void { //画线 if(_lineCtrl == 0){ _shapes = new Shape(); _shapes.graphics.lineStyle(1, 0xFF0000, 1); for(var i:int = 0;i<_lineArr.length - 1;i++){ _shapes.graphics.moveTo(_lineArr[i]._point.x*50 + 25,_lineArr[i]._point.y*50 + 25); _shapes.graphics.lineTo(_lineArr[i + 1]._point.x*50 + 25,_lineArr[i + 1]._point.y*50 + 25); } _shapes.graphics.endFill( ); _spriteLine.addChild(_shapes); } //清除线,并消去相同图片 if(_lineCtrl >= 5){ this.removeEventListener(Event.ENTER_FRAME, onFrame); _spriteLine.removeChildAt( 0 ); _clickArr[0].setImageData(0); _clickArr[1].setImageData(0); _clickArr.splice(0,_clickArr.length); _lineArr.splice(0,_lineArr.length); } _lineCtrl ++; } /** *数据数组GET *参数 * 数组长度 *返回值:成对随机数组 */ private function setMapArr(len:int):void{ var arr:Array = new Array(); //得到总图片数 var leng:int = Math.pow(len,2); var i:int; var ran_value:int; //成对生成随机数据 for(i=0;i<leng/2;i++){ ran_value = Math.random()*15 + 1; arr.push(ran_value); arr.push(ran_value); } getDataArr(len + 2); //将成对数组乱序抽出,生成数据数组 for(i=0;i<leng;i++){ ran_value = Math.random()*arr.length; _box = _boxArr[Math.floor(i/len) + 1][i%len + 1]; _box.setImageData(arr[ran_value]); //删除已经添加的数据 arr.splice(ran_value,1); } } /** *空数据数组GET *参数 * 数组长度 *返回值:空数据数组 */ private function getDataArr(len:int):void{ var i:int; var j:int; var arr:Array; for(i=0;i<len;i++){ arr = new Array(); for(j=0;j<len;j++){ _box = new ImageBox(j,i,this); _box.x = j*50; _box.y = i*50; _spriteImage.addChild(_box); arr.push(_box); } _boxArr.push(arr); } } } }

ImageCtrl.as文件

package LianLian.Image{ import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.geom.Point; public class ImageCtrl { public function ImageCtrl() { } /* 图片拆分 *参数 source:原图片,row:图片列数,col:图片行数 *返回值:载入小图片的数组 */ public static function divide(source:Bitmap,row:int,col:int,total:* = null):Array { //计算出每个小位图对象的宽度 var w:uint=source.width/row; //计算出每个小位图对象的高度 var h:uint=source.height/col; //计算有效位图总数 total=total==null?col*row:total; //定义结果数组 var result:Array= new Array(); //定义矩阵 var matrix:Matrix = new Matrix(); //定义矩形 var rect:Rectangle=new Rectangle(0,0,w,h); out:for (var j:int = 0; j < col; j++) { var tempArr:Array = new Array(); for (var i:int = 0; i < row; i++) { if (total<=0) { break out; } //新建小位图对象 var bmp:BitmapData=new BitmapData(w,h,true,0x00000000); //定义矩阵的焦点 matrix.tx=- i*w; matrix.ty=- j*h; //将矩阵内的数据按定义好的矩形大小和相应位置,画出小位图对象像素 bmp.draw(source,matrix,null,null,rect,true); tempArr.push(bmp); total--; } result.push(tempArr); } return result; } } }

ImageBox.as文件
package LianLian.Box { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Point; import LianLian.Mains.Main; public class ImageBox extends Sprite{ //声明Bitmap private var _image:Bitmap; //値 public var _index:int; //位置 public var _point:Point; //main类 private var _main:Main; public function ImageBox(pointx:int,pointy:int,main:Main) { _main = main; //小块位置 _point = new Point(pointx,pointy); //值设为空 _index = 0; _image = new Bitmap(null); //添加显示 this.addChild(_image); //添加点击事件 this.addEventListener(MouseEvent.CLICK, onClick); } /** *设置图片 *参数 * 值 *返回值:无 */ public function setImageData(index:int):void{ _index = index; if(index == 0){ _image.bitmapData = null; this.buttonMode = false; }else{ _image.bitmapData = _main._imageArr[0][index - 1]; this.buttonMode = true; } } /** *点击事件 */ private function onClick(event:MouseEvent):void{ if(_main._clickArr.length >= 2){ return; }else{ //二次点击禁止 if(this.alpha < 1){ return; } //点击后设置透明度为0.5 this.alpha = 0.5; _main._clickArr.push(this); //相同判断开始 _main.checkClick(); } } } }

QueryRoad.as文件

package LianLian.Mains { public class QueryRoad { private var _main:Main; public function QueryRoad(main:Main) { _main = main; } public function queryCheck():void{ var checkResult:Boolean = false; var x1:int = _main._clickArr[0]._point.x; var y1:int = _main._clickArr[0]._point.y; var x2:int = _main._clickArr[1]._point.x; var y2:int = _main._clickArr[1]._point.y; //逐步进行检查,如果两个图片可以相连,则将画线需要经过的折点存入_lineArr数组,准备画线 //横向检查 checkResult = checkRow(x1,y1,x2,y2); if(checkResult){ _main._lineArr.push(_main._clickArr[0]); _main._lineArr.push(_main._clickArr[1]); return; } //纵向检查 checkResult = checkCol(x1,y1,x2,y2); if(checkResult){ _main._lineArr.push(_main._clickArr[0]); _main._lineArr.push(_main._clickArr[1]); return; } //一次折线检查 checkResult = checkOnce(x1,y1,x2,y2); if(checkResult){ _main._lineArr.unshift(_main._clickArr[0]); _main._lineArr.push(_main._clickArr[1]); return; } //二次折线检查横向检测 checkResult = checkTwiceRow(x1,y1,x2,y2); if(checkResult){ _main._lineArr.unshift(_main._clickArr[0]); _main._lineArr.push(_main._clickArr[1]); return; } //二次折线检查纵向检测 checkResult = checkTwiceCol(x1,y1,x2,y2); if(checkResult){ _main._lineArr.unshift(_main._clickArr[0]); _main._lineArr.push(_main._clickArr[1]); return; } } /** * 二次折线检查横向检测 *判断四种情况, *1表示点击图片,0表示检索路径,3表示其他图片 *一 *0000 *0330 *1331 *二 *1331 *0330 *0000 *三 *1333 *0333 *0000 *3330 *3331 *四 *3331 *3330 *0000 *0333 *1333 */ private function checkTwiceRow(x1:int,y1:int,x2:int,y2:int):Boolean { var checkResult:Boolean; for(var i:int = 0;i<_main._mapLeng + 2;i++){ if(x1<=x2){ if(checkRow(x1-1,i,x2 + 1,i)){ if(checkCol(x1,y1,x1,i)&&checkCol(x2,y2,x2,i)){ checkResult = true; _main._lineArr.push(_main._boxArr[i][x1]); _main._lineArr.push(_main._boxArr[i][x2]); break; } } }else{ if(checkRow(x2-1,i,x1 + 1,i)){ if(checkCol(x1,y1,x1,i)&&checkCol(x2,y2,x2,i)){ checkResult = true; _main._lineArr.push(_main._boxArr[i][x1]); _main._lineArr.push(_main._boxArr[i][x2]); break; } } } } return checkResult; } /** * 二次折线检查纵向检测 *判断四种情况, *1表示点击图片,0表示检索路径,3表示其他图片 *一 *1000 *3330 *1000 *二 *0001 *0333 *0001 *三 *10033 *33033 *33033 *33033 *33001 *四 *33001 *33033 *33033 *33033 *10033 */ private function checkTwiceCol(x1:int,y1:int,x2:int,y2:int):Boolean { var checkResult:Boolean; for(var i:int = 0;i<_main._mapLeng + 2;i++){ if(y1<y2){ if(checkCol(i,y1-1,i,y2 + 1)){ if(checkRow(x1,y1,i,y1)&&checkRow(x2,y2,i,y2)){ checkResult = true; _main._lineArr.push(_main._boxArr[y1][i]); _main._lineArr.push(_main._boxArr[y2][i]); break; } } }else{ if(checkCol(i,y2-1,i,y1 + 1)){ if(checkRow(x1,y1,i,y1)&&checkRow(x2,y2,i,y2)){ checkResult = true; _main._lineArr.push(_main._boxArr[y1][i]); _main._lineArr.push(_main._boxArr[y2][i]); break; } } } } return checkResult; } /** * 一次折线检查 *判断四种情况, *1表示点击图片,0表示检索路径,3表示其他图片 *一 *1000 *3330 *3331 *二 *0001 *0333 *1333 *三 *1333 *0333 *0001 *四 *3331 *3330 *1000 */ private function checkOnce(x1:int,y1:int,x2:int,y2:int):Boolean { var checkResult:Boolean; if(x1<x2) { checkResult = checkRow(x1,y1,x2+1,y1)&&checkCol(x2,y1,x2,y2); if(checkResult){ _main._lineArr.push(_main._boxArr[y1][x2]); }else{ checkResult = checkRow(x1 - 1,y2,x2,y2)&&checkCol(x1,y1,x1,y2); if(checkResult){ _main._lineArr.push(_main._boxArr[y2][x1]); } } }else{ checkResult = checkRow(x1,y2,x1,y1)&&checkCol(x1 + 1,y2,x2,y2); if(checkResult){ _main._lineArr.push(_main._boxArr[y2][x1]); }else{ checkResult = checkRow(x2 - 1,y1,x1,y1)&&checkCol(x2,y2,x2,y1); if(checkResult){ _main._lineArr.push(_main._boxArr[y1][x2]); } } } return checkResult; } /** * 横向检查 *这个简单,只需要判断两个图片中间是否有其他图片即可 */ private function checkRow(x1:int,y1:int,x2:int,y2:int):Boolean{ var checkResult:Boolean = true; var i :int; if(y1 != y2){ return false; }else if(Math.abs(x1 - x2) == 1){ return true; } for(i = Math.min(x1,x2) +1;i<Math.max(x1,x2);i++) { if(_main._boxArr[y1][i]._index==0){ checkResult = true; } else{ checkResult = false; break; } } return checkResult; } /** * 纵向检查 *这个简单,只需要判断两个图片中间是否有其他图片即可 */ private function checkCol(x1:int,y1:int,x2:int,y2:int):Boolean{ var checkResult:Boolean = true; var i : int; if(x1 != x2){ return false; }else if(Math.abs(y1 - y2) == 1){ return true; } for(i = Math.min(y1,y2) +1;i<Math.max(y1,y2);i++) { if(_main._boxArr[i][x1]._index==0){ checkResult = true; } else{ checkResult = false; break; } } return checkResult; } } }

演示路径
http://lufy.hp2.jp/sample/lianlian/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值