做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连连看算法分析及源代码相关推荐

  1. flash连连看算法

    这个简单游戏的技术问题是一类游戏如俄罗斯方块,纸牌游戏等制作的基础.通过对这个游戏算法的分析,特别是对检查连线的探讨,大家可以基本掌握这类游戏算法的基本思维方法. 连连看游戏规则很简单,就是点中两个互 ...

  2. Flash 连连看算法

    这个简单游戏的技术问题是一类游戏如俄罗斯方块,纸牌游戏等制作的基础.通过对这个游戏算法的分析,特别是对检查连线的探讨,大家可以基本掌握这类游戏算法的基本思维方法. 连连看游戏规则很简单,就是点中两个互 ...

  3. 多关卡连连看php源码_连连看算法及源代码

    闲着无聊,编个连连看玩玩,用了魔兽里面的头像来做图片.下面记录如下: 程序的关键在于判断用户连续点击的两个图案能否消除.两个图片可以消除的条件有两个: 图片相同 图片间连线的转角数不得超过2 . 而判 ...

  4. 八皇后算法分析及源代码

    [问题描述]  八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...

  5. 连连看c语言源程序,连连看源代码C语言

    连连看源代码C语言Tag内容描述: 1.连连看游戏C语言源代码 include stdio h include graphics h include stdlib h include math h i ...

  6. Java实现连连看源代码文档_JAVA实现连连看游戏

    文件名大小更新时间 JAVA实现连连看游戏\java连连看游戏设计介绍 幻灯片.pptx22697322018-06-09 JAVA实现连连看游戏\源代码\JAVA连连看游戏设计 源代码\.class ...

  7. 浮士德头像裁剪flash版2016福利版

    前言 最近看回以前改的flash版头像裁剪,譬如,浮士德头像裁剪,发现了一些bug,还有一些不尽如意的地方,譬如,图片上传的方式没有遵守web的mutipart标准,整个组件没有组件化便于调用.当然, ...

  8. win32游戏开发(2) --连连看游戏制作(vc++版)

    文章索引 源代码下载 工程目录一览 实现细节 源代码下载 附上下载链接:连连看vc++版源代码 工程目录一览 文件功能及关系图: GameEngine类 成员名 作用 static GameEngin ...

  9. you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识

    you-get下载b站选集 Life without Flash would be uninteresting and mundane. Flash sites are to static HTML ...

  10. Lora开发板Flash存储读写

    · 本文会介绍如何用Lora开发板一步步实现Flash存储读写(基于STM32L151C8T6芯片) 一.看题 二.读题,明白我门最终要实现成什么样的效果        题目的要求就是板子通上电,LE ...

最新文章

  1. grantrevoke
  2. 点击率预估又有新花样?
  3. mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...
  4. 查看-增强会话_会话式人工智能-关键技术和挑战-第2部分
  5. android获取button宽度,android – 如何获得Button的高度和宽度
  6. 从Grunt测试Grunt插件
  7. C++中? : 运算符的使用
  8. Java 的强引用、弱引用、软引用、虚引用
  9. Vue 事件绑定 事件修饰符 条件判断 循环遍历
  10. rsync 全网备份
  11. 数字格式化类NumberFormat
  12. matlab中的脚本文件和函数文件
  13. 首次适应算法 C语言实现
  14. 搭建简易个人博客(一篇文章就搞定!)
  15. 惊闻家乡的学校要撤销
  16. Web3专属的流支付协议,Zebec把它玩出了新的花样
  17. 手游(cocos2dx)图片资源压缩
  18. 维基百科没有告诉你关于宝马的什么
  19. Hashmap如何实现key的唯一性
  20. 一个小众的语言:REBOL(一)

热门文章

  1. 矩阵计算与AI革命:可将计算性能提高150倍的异构计算
  2. 全桥并网逆变器PLECS仿真
  3. 德勤财务机器人正式上岗,工作视频曝光,效率惊人
  4. matlab修改图片部分像素值
  5. 笔记木计算机自动关机怎么办,为什么笔记本电脑自动关机 笔记本电脑自动关机解决方法...
  6. 微信公众号被关注后自动回复——跳转小程序
  7. 服务器都是sas硬盘吗,服务器硬盘SAS与SATA区别介绍
  8. 郑强上任后,太原理工大学不断引援!
  9. 分了很多节的word文档,使用尾注插入的参考文献,最后怎么在参考文献之后加入致谢?
  10. 使用 Elasticsearch ik分词实现同义词搜索