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

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S