一,简单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._point.x*50 + 25,_lineArr._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[x1]);
_main._lineArr.push(_main._boxArr[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[x1]);
_main._lineArr.push(_main._boxArr[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]);
_main._lineArr.push(_main._boxArr[y2]);
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]);
_main._lineArr.push(_main._boxArr[y2]);
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]._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[x1]._index==0){
checkResult = true;
} else{
checkResult = false;
break;
}
}
return checkResult;
}
}
}
|