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连连看算法分析及源代码相关推荐
- flash连连看算法
这个简单游戏的技术问题是一类游戏如俄罗斯方块,纸牌游戏等制作的基础.通过对这个游戏算法的分析,特别是对检查连线的探讨,大家可以基本掌握这类游戏算法的基本思维方法. 连连看游戏规则很简单,就是点中两个互 ...
- Flash 连连看算法
这个简单游戏的技术问题是一类游戏如俄罗斯方块,纸牌游戏等制作的基础.通过对这个游戏算法的分析,特别是对检查连线的探讨,大家可以基本掌握这类游戏算法的基本思维方法. 连连看游戏规则很简单,就是点中两个互 ...
- 多关卡连连看php源码_连连看算法及源代码
闲着无聊,编个连连看玩玩,用了魔兽里面的头像来做图片.下面记录如下: 程序的关键在于判断用户连续点击的两个图案能否消除.两个图片可以消除的条件有两个: 图片相同 图片间连线的转角数不得超过2 . 而判 ...
- 八皇后算法分析及源代码
[问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...
- 连连看c语言源程序,连连看源代码C语言
连连看源代码C语言Tag内容描述: 1.连连看游戏C语言源代码 include stdio h include graphics h include stdlib h include math h i ...
- Java实现连连看源代码文档_JAVA实现连连看游戏
文件名大小更新时间 JAVA实现连连看游戏\java连连看游戏设计介绍 幻灯片.pptx22697322018-06-09 JAVA实现连连看游戏\源代码\JAVA连连看游戏设计 源代码\.class ...
- 浮士德头像裁剪flash版2016福利版
前言 最近看回以前改的flash版头像裁剪,譬如,浮士德头像裁剪,发现了一些bug,还有一些不尽如意的地方,譬如,图片上传的方式没有遵守web的mutipart标准,整个组件没有组件化便于调用.当然, ...
- win32游戏开发(2) --连连看游戏制作(vc++版)
文章索引 源代码下载 工程目录一览 实现细节 源代码下载 附上下载链接:连连看vc++版源代码 工程目录一览 文件功能及关系图: GameEngine类 成员名 作用 static GameEngin ...
- you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识
you-get下载b站选集 Life without Flash would be uninteresting and mundane. Flash sites are to static HTML ...
- Lora开发板Flash存储读写
· 本文会介绍如何用Lora开发板一步步实现Flash存储读写(基于STM32L151C8T6芯片) 一.看题 二.读题,明白我门最终要实现成什么样的效果 题目的要求就是板子通上电,LE ...
最新文章
- grantrevoke
- 点击率预估又有新花样?
- mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...
- 查看-增强会话_会话式人工智能-关键技术和挑战-第2部分
- android获取button宽度,android – 如何获得Button的高度和宽度
- 从Grunt测试Grunt插件
- C++中? : 运算符的使用
- Java 的强引用、弱引用、软引用、虚引用
- Vue 事件绑定 事件修饰符 条件判断 循环遍历
- rsync 全网备份
- 数字格式化类NumberFormat
- matlab中的脚本文件和函数文件
- 首次适应算法 C语言实现
- 搭建简易个人博客(一篇文章就搞定!)
- 惊闻家乡的学校要撤销
- Web3专属的流支付协议,Zebec把它玩出了新的花样
- 手游(cocos2dx)图片资源压缩
- 维基百科没有告诉你关于宝马的什么
- Hashmap如何实现key的唯一性
- 一个小众的语言:REBOL(一)