FLASH连连看算法分析及源代码

2024-02-05 21:58

本文主要是介绍FLASH连连看算法分析及源代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做FLASH连连看有特别之处,下面我们就详细分析FLASH连连看的算法。

在做连连看之前,我们根据折线数的不同分为3种情况:

    第一种情况:


如图,方块1与方块2 在同一水平线上,方块1与方块3在同一垂直线上,这就是我们的第一种情况:

在实际应用时,我们在1和2之间或1和3之间实例化一条线段,用hitTestObject来测试,如果与这条线段相交的图片个数小于等于2,那么这两个图片就是连通的。

第二种情况:

就是2和3 的关系了,在2和3之间实例化四条线段,两个水平的,两个垂直的,如下图所示:


与A相交的图片数加上与B相交的图片数小于等于2或者与C相交的图片数加上与D相交的图片数小于等于2,那么这两个图片就是连通的。

第三种情况:


第三种情况主要与前两种情况配合使用,如果前两种情况测试不成功,那么直接跳转到第三种情况,如果第三种情况测试依然不成功,那么这两个图片不连通,也就是说用户进行了一次错误操作。

第三种情况比较复杂,测试两个图片是否连通分为两种情况,一种是A线段是水平的(垂直扫描),另一种是A线段是垂直的(水平扫描)。

1. A线段是水平的,我们要平均间隔垂直扫描并实例化A线段,只有在测试到与A相交的图片数为0时,跳出扫描的循环,并且实例化B线段和C线段,如果与B线段相交的图片数加上与C线段相交的图片数小于等于2,则两个图片连通。

2. A线段是垂直的,算法与上者相同,只是扫描的方向不同。

好了,下面我们来亲手做一个简单的连连看。

我们这个连连看很简单,只要按照下面的操作就可以了。

若要运行此示例,请确保在FLASH文件同目录下有一个images文件夹,其中有1.gif,2.gif,3.gif...40.gif共40个32*32像素的gif格式的图片。

打开flash cs3,新建一个FLASH文档,在文档类中填写simplellk,在同目录下新建一个AS文件,名为simplellk.as,在其中输入以下代码:

package {
/**
版权所有 粉色男孩
2008-8-9
连连看原始模型,供AS3交流所用
*/
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
public class simplellk extends Sprite {
   private var myllk:llk;
   private var myllkarr:Array=new Array;
   private var image:Loader;
   public function simplellk():void {
    setlisteners();
    addllk();
   }
   private function setlisteners():void {
    stage.addEventListener("mouseDown",click_stage);
    stage.addEventListener("keyUp",keyup);
   }
   private function keyup(event):void{
    if(event.keyCode==116){
     pl();
    }
   }
   private function addllk():void {
    for (var i:int=0; i<80; i++) {
     myllk=new llk;
     image=new Loader;
     image.load(new URLRequest("images/"+((i%40)+1)+".gif"));
     myllk.addChild(image);
     myllk.x=30+(i%10)*40;
     myllk.y=30+Math.floor(i/10)*40;
     myllkarr.push(myllk);
     addChild(myllk);
    }
    pl();//reset
   }
   private function click_stage(event):void {
    for (var i in myllkarr) {
     if (myllkarr[i].hitTestPoint(mouseX,mouseY)) {
      myllkarr[i].selected=!myllkarr[i].selected;
      myllkarr[i].show_selected();
      for (var j in myllkarr) {
       if (j!=i&&myllkarr[j].selected&&j%(myllkarr.length/2)==i%(myllkarr.length/2)) {
        if (testbylevel(i,j)) {
         myllkarr[i].removethis();
         myllkarr[j].removethis();
         if (i>j) {
          myllkarr.splice(i,1);
          myllkarr.splice(j,1);
         } else {
          myllkarr.splice(j,1);
          myllkarr.splice(i,1);
         }
         break;
        } else {
         myllkarr[i].selected=false;
         myllkarr[i].show_selected();
         myllkarr[j].selected=false;
         myllkarr[j].show_selected();
        }
       } else {
        if (j!=i) {
         myllkarr[j].selected=false;
         myllkarr[j].show_selected();
        }
       }
      }
      break;
     }
    }
   }
   private var plarr:Array=new Array;
   private function pl():void {
    //reset
    plarr.splice(0,plarr.length);
    function cxpl(aa:int):void {
     myllkarr[aa].x=30 + Math.floor(Math.random() * 10) * 40;
     myllkarr[aa].y=30 + Math.floor(Math.random() * 8) * 40;
     for (var j:int=0; j < plarr.length; j++) {
      if (myllkarr[aa].x == plarr[j].x && myllkarr[aa].y == plarr[j].y) {
       cxpl(aa);
       break;
      }
     }
    }
    for (var i:int=0; i < myllkarr.length; i++) {
     cxpl(i);
     plarr.push(myllkarr[i]);
    }
   }
   private function testbylevel(a:Number,b:Number):Boolean {
    //测试是否连通并返回相关布尔值
    var unit:Boolean=false;//定义连通初值为false;
    var js:int=0;//计数
    if (myllkarr[a].y == myllkarr[b].y || myllkarr[a].x == myllkarr[b].x) {
     var sprite5:Sprite=new Sprite;
     sprite5.graphics.moveTo(myllkarr[a].x + 16,myllkarr[a].y + 16);
     sprite5.graphics.lineTo(myllkarr[b].x + 16,myllkarr[b].y + 16);
     addChild(sprite5);
     js=0;
     for (var i in myllkarr) {
      if (myllkarr[i].hitTestObject(sprite5)) {
       js++;
       if (js > 2) {
        break;
       }
      }
     }
     if (js <= 2) {
      unit=true;
     } else {
      unit=testlevelthird(a,b);
     }
     sprite5.graphics.clear();
    } else {
     var sprite1:Sprite=new Sprite;
     var sprite2:Sprite=new Sprite;
     var sprite3:Sprite=new Sprite;
     var sprite4:Sprite=new Sprite;
     var test1:Boolean=false;
     var test2:Boolean=false;

     sprite1.graphics.moveTo(myllkarr[a].x + 10,myllkarr[a].y + 10);
     sprite1.graphics.lineTo(myllkarr[b].x + 10,myllkarr[a].y + 10);

     sprite2.graphics.moveTo(myllkarr[b].x + 10,myllkarr[a].y + 10);
     sprite2.graphics.lineTo(myllkarr[b].x + 10,myllkarr[b].y + 10);

     sprite3.graphics.moveTo(myllkarr[a].x + 10,myllkarr[a].y + 10);
     sprite3.graphics.lineTo(myllkarr[a].x + 10,myllkarr[b].y + 10);

     sprite4.graphics.moveTo(myllkarr[a].x + 10,myllkarr[b].y + 10);
     sprite4.graphics.lineTo(myllkarr[b].x + 10,myllkarr[b].y + 10);

     addChild(sprite1);
     addChild(sprite2);
     addChild(sprite3);
     addChild(sprite4);
     js=0;
     for (var d in myllkarr) {
      if (myllkarr[d].hitTestObject(sprite1) || myllkarr[d].hitTestObject(sprite2)) {
       js++;
       if (js > 2) {
        break;
       }
      }
     }
     if (js <= 2) {
      test1=true;
     }
     js=0;
     for (var e in myllkarr) {
      if (myllkarr[e].hitTestObject(sprite3) || myllkarr[e].hitTestObject(sprite4)) {
       js++;
       if (js > 2) {
        break;
       }
      }
     }
     if (js <= 2) {
      test2=true;
     }
     if (test1 || test2) {
      unit=true;
     } else {
      unit=testlevelthird(a,b);
     }
     sprite1.graphics.clear();
     sprite1.graphics.clear();
     sprite3.graphics.clear();
     sprite4.graphics.clear();
    }
    return unit;
   }
   private function testlevelthird(c:Number,d:Number):Boolean {
    var unit:Boolean=false;
    var js:int=0;//计数参量
    var sprite7:Sprite;
    var sprite10:Sprite;
    var test1:Boolean=false;
    var test2:Boolean=false;
    var test3:Boolean=false;
    var test4:Boolean=false;
    for (var kk:int=0; kk < 10; kk++) {
     sprite10=new Sprite ;
     sprite10.graphics.moveTo(myllkarr[c].x + 16,6 + 40 * kk);
     sprite10.graphics.lineTo(myllkarr[d].x + 16,6 + 40 * kk);
     addChild(sprite10);
     js=0;
     for (var ff in myllkarr) {
      if (myllkarr[ff].hitTestObject(sprite10)) {
       js++;
       break;
      }
     }
     if (js == 0) {
      var sprite11:Sprite=new Sprite;
      sprite11.graphics.moveTo(myllkarr[c].x + 16,6 + 40 * kk);
      sprite11.graphics.lineTo(myllkarr[c].x + 16,myllkarr[c].y + 16);
      addChild(sprite11);
      js=0;
      for (var qq in myllkarr) {
       if (myllkarr[qq].hitTestObject(sprite11)) {
        js++;
        if (js > 1) {
         break;
        }
       }
      }
      if (js <= 1) {
       test3=true;
      } else {
       test3=false;
      }
      var sprite12:Sprite=new Sprite;
      sprite12.graphics.moveTo(myllkarr[d].x + 16,6 + 40 * kk);
      sprite12.graphics.lineTo(myllkarr[d].x + 16,myllkarr[d].y + 16);
      addChild(sprite12);
      js=0;
      for (var ww in myllkarr) {
       if (myllkarr[ww].hitTestObject(sprite12)) {
        js++;
        if (js > 1) {
         break;
        }
       }
      }
      if (js <= 1) {
       test4=true;
      } else {
       test4=false;
      }
      if (test3 && test4) {
       unit=true;
       sprite11.graphics.clear();
       sprite12.graphics.clear();
       sprite10.graphics.clear();
       break;
      }
      sprite11.graphics.clear();
      sprite12.graphics.clear();
     }
     sprite10.graphics.clear();
    }
    for (var ii:int=0; ii < 12; ii++) {
     sprite7=new Sprite ;
     sprite7.graphics.moveTo(6 + 40 * ii,myllkarr[c].y + 16);
     sprite7.graphics.lineTo(6 + 40 * ii,myllkarr[d].y + 16);
     addChild(sprite7);
     js=0;
     for (var jj in myllkarr) {
      if (myllkarr[jj].hitTestObject(sprite7)) {
       js++;
       break;
      }
     }
     if (js == 0) {
      var sprite8:Sprite=new Sprite;
      sprite8.graphics.moveTo(6 + 40 * ii,myllkarr[c].y + 16);
      sprite8.graphics.lineTo(myllkarr[c].x + 16,myllkarr[c].y + 16);
      addChild(sprite8);
      js=0;
      for (var pp in myllkarr) {
       if (myllkarr[pp].hitTestObject(sprite8)) {
        js++;
        if (js > 1) {
         break;
        }
       }
      }
      if (js <= 1) {
       test1=true;
      } else {
       test1=false;
      }
      var sprite9:Sprite=new Sprite;
      sprite9.graphics.moveTo(6 + 40 * ii,myllkarr[d].y + 16);
      sprite9.graphics.lineTo(myllkarr[d].x + 16,myllkarr[d].y + 16);
      addChild(sprite9);
      js=0;
      for (var ll in myllkarr) {
       if (myllkarr[ll].hitTestObject(sprite9)) {
        js++;
        if (js > 1) {
         break;
        }
       }
      }
      if (js <= 1) {
       test2=true;
      } else {
       test2=false;
      }
      if (test1 && test2) {
       unit=true;
       sprite8.graphics.clear();
       sprite9.graphics.clear();
       sprite7.graphics.clear();
       break;
      }
      sprite8.graphics.clear();
      sprite9.graphics.clear();
     }
     sprite7.graphics.clear();
    }
    return unit;
   }
}
}


import flash.display.Sprite;
class llk extends Sprite {
private var mouseover:Sprite;
private var select:Sprite;
public var selected:Boolean=false;
public function llk():void {
   this.buttonMode=true;
   setface();//设置鼠标事件界面
   configlisteners();
}
//------------------------------------------------------------------
//private functions
private function setface():void {
   mouseover = new Sprite;
   mouseover.graphics.beginFill(0x0000FF, .3);
   mouseover.graphics.drawRect(0, 0, 32, 32);
   mouseover.mouseEnabled=false;

   select = new Sprite;
   select.graphics.beginFill(0xFF0000, .3);
   select.graphics.drawRect(0, 0, 32, 32);
   select.mouseEnabled=false;

}
private function configlisteners():void {
   this.addEventListener("mouseOver", over_this);
   this.addEventListener("mouseOut", out_this);
}
private function out_this(event):void {
   if (!selected) {
    try {
     removeChild(mouseover);
    } catch (error:Error) {
    }
   }
}
private function over_this(event):void {
   if (!selected) {
    addChild(mouseover);
   }
}
//-------------------------------------------------------------------
//public functions
public function show_selected():void {
   if (selected) {
    addChild(select);
    try {
     removeChild(mouseover);
    } catch (error:Error) {
    }
   } else {
    try {
     removeChild(mouseover);
    } catch (error:Error) {
    }
    try {
     removeChild(select);
    } catch (error:Error) {
    }
   }
}
public function removethis():void {
   this.removeEventListener("mouseOver", over_this);
   this.removeEventListener("mouseOut", out_this);
   parent.removeChild(this);
}
}

好了,Ctrl+enter就可以看到效果了,按F5可以重排。

=========================================
原作者:粉色男孩http://hi.baidu.com/fsnhf

这篇关于FLASH连连看算法分析及源代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682286

相关文章

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1