flash as3 连连看小游戏实现方法

建fla文件.取名随便(我取的是testllk.fla)
在fla里新建影片剪辑(取名随便 我取的是mov_tupian),在里面添加自己喜欢的图片,每帧一张,对齐原点.在第一帧写上stop();把连接类改为tupian.
在fla里新建影片剪辑(取名随便 我取的是line-mov),在里面添加一个框,和刚才的影片剪辑里的图片一样大小.;把连接类改为kuan.
在文当类里写testllkan.

llkan.as代码

package {
/**
* 连连看算法
*
* @author huangxianchang
* @version1.0
* @date090329
*/
import flash.geom.point;
public class llkan {
//地图数组
private var m_map:array;
/**
* 连连看算法
*/
public function llkan(map_arr :array) {
this.m_map = map_arr;
}
//====================================
//properties
//====================================
/**
* 地图数组
*/
public function set map(map_arr : array):void {
this.m_map = map_arr;
}
//====================================
//public methods
//====================================
/**
* @param p_startx起点x坐标
* @param p_starty起点y坐标
* @param p_endx终点x坐标
* @param p_endy终点y坐标
*
* @return 找到的路径(数组 : [p_startx, p_starty], ... , [p_endx, p_endy])
*/
public function find(p_startx : int, p_starty : int, p_endx : int, p_endy : int):array {
if (isblock(p_startx,p_starty)||isblock(p_endx,p_endy)) {
return null;//超出边界或者为0返回空;
}
//trace(this.m_map[p_starty][p_startx]+"----"+ this.m_map[p_endy][p_endx])
if (this.m_map[p_starty][p_startx]== this.m_map[p_endy][p_endx]) {//2个点内容相同才检测
//返回的4个点
var point1oint = new point(p_startx,p_starty);
var point4oint = new point(p_endx,p_endy);
var point2oint;
var point3oint;
//trace([point1,point4]);
//保存这2个点的内容,并把它设为0表示可通过
var dian1:int=this.m_map[p_starty][p_startx];
var dian2:int=this.m_map[p_endy][p_endx];
this.m_map[p_starty][p_startx]=0;
this.m_map[p_endy][p_endx]=0;
var i:int,j:int,linnum:int;
var shucanxiao:boolean = false;//竖可连不?
var hengcanxiao:boolean = false;//行可连不?
//对以下形状做判断
// | |
// | |
// |----------|
// | |
// | |
var one_blank_shu_arr:array = new array();
var one_blank_shu_arr1:array = new array();
var one_blank_shu_arr2:array= new array();
//starty
one_blank_shu_arr1.push(p_starty);
linnum = p_starty+1;
while ( this.chaoshu(linnum) && this.m_map[linnum][p_startx]==0) {
one_blank_shu_arr1.push(linnum);
linnum++;
}
linnum = p_starty-1;
while ( this.chaoshu(linnum) && this.m_map[linnum][p_startx]==0) {
one_blank_shu_arr1.push(linnum);
linnum--;
}
//endy
one_blank_shu_arr2.push(p_endy);
linnum = p_endy+1;
while ( this.chaoshu(linnum) && this.m_map[linnum][p_endx]==0) {
one_blank_shu_arr2.push(linnum);
linnum++;
}
linnum = p_endy-1;
while ( this.chaoshu(linnum) && this.m_map[linnum][p_endx]==0) {
one_blank_shu_arr2.push(linnum);
linnum--;
}
var on_blank_shu_num:int=0;
//找出2个数组相同的,也就是同一行的y坐标.
var one_blank_shu_arr1_len:int=one_blank_shu_arr1.length;
var one_blank_shu_arr2_len:int=one_blank_shu_arr2.length;
for (i=0; i<one_blank_shu_arr1_len; i++) {
for (j=0; j<one_blank_shu_arr2_len; j++) {
if (one_blank_shu_arr1 == one_blank_shu_arr2[j]) {
one_blank_shu_arr[on_blank_shu_num] = one_blank_shu_arr1;
on_blank_shu_num++;
break;
}
}
}
//看看可连不
var one_blank_shu_len:int=one_blank_shu_arr.length;
for (i=0; i<one_blank_shu_len; i++) {
var xlinnum1:int = math.min(p_startx, p_endx);
var xlinnum2:int = math.max(p_startx, p_endx);
var xlincannum:int = 0;
point2= new point(p_startx,one_blank_shu_arr);
point3= new point(p_endx,one_blank_shu_arr);
//取出在竖相同2点的行比较
var shu_y:int=one_blank_shu_arr;
//行是否可连通
for (var k:int=xlinnum1; k<=xlinnum2; k++) {
if (this.m_map[shu_y][k]==0) {
xlincannum++;
} else {
break;
}
}
if (xlincannum == (xlinnum2-xlinnum1)+1) {
shucanxiao = true;//竖可连
break;
}
}
//竖结束
//shucanxiao = false;
if (shucanxiao) {
//竖可连
} else {
//竖不可连,对行判断
//对以下形状做判断
// ---------------
// |
// |
// ----------------
var one_blank_heng_arr:array = new array();
var one_blank_heng_arr1:array = new array();
var one_blank_heng_arr2:array = new array();
//startx
one_blank_heng_arr1.push(p_startx);
linnum = p_startx+1;
while ( this.chaohan(linnum) && this.m_map[p_starty][linnum]==0) {
one_blank_heng_arr1.push(linnum);
linnum++;
}
linnum = p_startx-1;
while ( this.chaohan(linnum) && this.m_map[p_starty][linnum]==0) {
one_blank_heng_arr1.push(linnum);
linnum--;
}
//endx
one_blank_heng_arr2.push(p_endx);
linnum = p_endx+1;
while ( this.chaohan(linnum) && this.m_map[p_endy][linnum]==0) {
one_blank_heng_arr2.push(linnum);
linnum++;
}
linnum = p_endx-1;
while ( this.chaohan(linnum) && this.m_map[p_endy][linnum]==0) {
one_blank_heng_arr2.push(linnum);
linnum--;
}
var on_blank_heng_num:int = 0;
var one_blank_heng_arr1_len:int=one_blank_heng_arr1.length;
var one_blank_heng_arr2_len:int=one_blank_heng_arr2.length;
//找出2个数组相同的,也就是同一竖的x坐标.
for (i=0; i<one_blank_heng_arr1_len; i++) {
for (j=0; j<one_blank_heng_arr2_len; j++) {
if (one_blank_heng_arr1 == one_blank_heng_arr2[j]) {
one_blank_heng_arr[on_blank_heng_num] = one_blank_heng_arr1;
on_blank_heng_num++;
break;
}
}
}
//看看可连不
var one_blank_heng_len:int=one_blank_heng_arr.length;
for (i=0; i<one_blank_heng_len; i++) {
var ylinnum1:int = math.min(p_starty, p_endy);
var ylinnum2:int = math.max(p_starty, p_endy);
var ylincannum:int = 0;
point2 = new point(one_blank_heng_arr,p_starty);
point3 = new point(one_blank_heng_arr,p_endy);
var shu_x:int=one_blank_heng_arr;
for (k=ylinnum1; k<=ylinnum2; k++) {
if (this.m_map[k][shu_x]==0) {
ylincannum++;
} else {
break;
}
}
if (ylincannum == (ylinnum2-ylinnum1)+1) {
hengcanxiao = true;
break;
}
}
}
//行结束
//还原被刚才设置的点
this.m_map[p_starty][p_startx]=dian1;
this.m_map[p_endy][p_endx]=dian2;
if (hengcanxiao || shucanxiao) {
var arr:array=[point1,point2,point3,point4];
return arr;
}
}
return null;
}
//====================================
//private methods
//====================================
private function isblock( p_endx : int, p_endy : int):boolean {//是否超出边界
var mapheight: int = this.m_map.length;//y
var mapwidth : int = this.m_map[0].length;//x
if (p_endx < 0 || p_endx >= mapwidth || p_endy < 0 || p_endy >= mapheight) {
trace("chaochu~~~~");
return true;//超出边界
}
if (this.m_map[p_endy][p_endx]==0||this.m_map[p_endy][p_endx]==null) {
trace("wei 0~~~~");
return true;
//为0或没有不做比较
}
return false;//没有超出边界
}
private function chaoshu( p_endy : int):boolean {//是否超出竖的边界
var mapheight: int = this.m_map.length;
if (p_endy < 0 || p_endy >= mapheight) {
return false;//超出
}
return true;//未超出
}
private function chaohan( p_endx : int):boolean {//是否超出行的边界
var mapwidth : int = this.m_map[0].length;
if (p_endx < 0 || p_endx >= mapwidth) {
return false;//超出
}
return true;//未超出
}
}
}

testllkan.as代码:

package {
import flash.display.sprite;
import flash.display.stagealign;
import flash.display.stagescalemode;
import flash.events.event;
import flash.events.mouseevent;
import flash.geom.point;
import flash.utils.gettimer;
import llkan;
import flash.text.textfield;
import flash.text.textfieldautosize;
import flash.utils.timer;
import flash.events.timerevent;
/**
* 连连看测试类
*
* @author huangxianchang
* @version1.0
* @date090213
*/
public class testllkan extends sprite {
//====================================
//member variables
//====================================
private var scalexy=1.0;//定义缩放;
private var llk_leng=12;//连连看图片种类数本例总21
private var m_player :kuan;
private var m_map : array=new array();//连连看地图
private var m_llkan : llkan;

private var mytimer:timer;
private var child:sprite;
private var oldpiontoint;
private var canclick:boolean=false;
private var m_mapw : int = 14;//几行x
private var m_maph : int = 9;//几列y
private var sel_num:uint=0;
private var m_mapx : int = 20;//起始位置
private var m_mapy : int = 40;//起始位置
private var xstep:number;
private var ystep:number;
private var m_m_clograte : number = 0.3;
private var m_path : array;//返回路径
private var m_outtxt : textfield;
//====================================
//constructor
//====================================
public function testllkan() {
stage.framerate=24;//帧频
stage.align = stagealign.top_left;
stage.scalemode = stagescalemode.no_scale;
stage.doubleclickenabled = true;//双击
stage.addeventlistener(mouseevent.double_click, resethandle);

this.m_outtxt = new textfield();
addchild(this.m_outtxt);
with (this.m_outtxt) {
x = y = 10;
selectable = false;
autosize = textfieldautosize.left;
}
this.m_llkan = new llkan(m_map);
this.reset();
}
//====================================
//private methods
//====================================
private function reset():void {
var t:tupian = new tupian();
t.scalex=t.scaley=scalexy;
xstep= t.width+3;
ystep= t.height+3;//得到宽和高
t=null;
var all_num:uint = m_mapw*m_maph/2;
var stoparr = new array();//初始化数组
for (var loc:uint=0; loc<m_mapw*m_maph; loc++) {
if (loc<=all_num-1) {
stoparr[loc] = uint(math.random()*llk_leng)+1;
} else {
stoparr[loc] = stoparr[loc-all_num];
}
}
this.luan(stoparr);//打乱数组
var nn:uint=0;
//要算旁边的 所以加0和m_maph+1
for (var i : uint = 0; i <= m_maph+1; i++) {//y
this.m_map = new array();
for (var j : uint = 0; j <= m_mapw+1; j++) {//x
if (i == 0 || j == 0 || i == m_maph+1 || j == m_mapw+1) {
m_map[j]=0;//旁边为0,表示没有东西.可通过
} else {
var tile:tupian = new tupian();
tile.addeventlistener(mouseevent.click, clickhandle);
tile.x = m_mapx + (j-1) * xstep;
tile.y = m_mapy + (i-1) * ystep;
tile.scalex=tile.scaley=this.scalexy;
addchild(tile);
tile.name=i+"-"+j;//y-x
var temp:uint=stoparr[nn];
m_map[j] = temp;
tile.gotoandstop(temp);
//trace(tile.currentframe)
nn++;
}

}
}
m_player= new kuan();
addchild(m_player);
m_player.scalex=m_player.scaley=this.scalexy;
m_player.x=-1000;
m_player.y=-1000;
sel_num=0;
oldpiont=null;
canclick=true;
output("双击空白区域重排游戏 ");
}
private function getxy(p_s oint)oint {//换算成真正的坐标
var p_x:int =m_mapx+xstep*(p_s.x-0.5);
var p_y:int =m_mapy+ystep*(p_s.y-0.5);
return new point(p_x,p_y);
}
private function output(p_info : string):void {
this.m_outtxt.htmltext = "<b><font color='#0000ff' size='16'>连连看示例</font></b>ttt" + p_info;
}
//====================================
//event handles
//====================================
private function luan(luan_arr:array):void {//打乱数组
var luan_arr_len:uint=luan_arr.length;
for (var luan_arr_i:uint=0; luan_arr_i<luan_arr_len; luan_arr_i++) {
var luan_lin_num:uint = uint(math.random()*luan_arr_len);
var luna_lin_arr_num:uint = luan_arr[luan_lin_num];
luan_arr[luan_lin_num] = luan_arr[luan_arr_i];
luan_arr[luan_arr_i] = luna_lin_arr_num;
}
}
private function resethandle(event : mouseevent):void {
this.removechild(m_player);
while (this.numchildren > 1) {
var tile : tupian = this.getchildat(1) as tupian;
if (tile.haseventlistener(mouseevent.click)) {
tile.removeeventlistener(mouseevent.click, clickhandle);
}
this.removechild(tile);
}
this.reset();
}
private function getpoint(p_s :string)oint {
var p_x:int =p_s.split("-")[1];
var p_y:int =p_s.split("-")[0];
return new point(p_x,p_y);
}
private function clickhandle(event : mouseevent):void {
if (canclick) {
var findpiont : point =getpoint(event.target.name);
m_player.x=event.target.x;
m_player.y=event.target.y;
if (sel_num == 0) {
oldpiont= findpiont;
sel_num = 1;
} else if (sel_num == 1) {
sel_num = 2;
canclick = false;
var kaishi:int=gettimer();
this.m_path = this.m_llkan.find(oldpiont.x, oldpiont.y, findpiont.x, findpiont.y);
trace(this.m_path);
var yongshi:int=gettimer()-kaishi;
if (this.m_path != null && this.m_path.length > 0) {
var name1:*=getchildbyname(string(oldpiont.y+"-"+oldpiont.x));
var name2:*=getchildbyname(string(findpiont.y+"-"+findpiont.x));
name1.removeeventlistener(mouseevent.click, clickhandle);
name2.removeeventlistener(mouseevent.click, clickhandle);
removechild(name1);
removechild(name2);
name1=null;
name2=null;
this.m_map[oldpiont.y][oldpiont.x]=0;
this.m_map[findpiont.y][findpiont.x]=0;
output("可以连通,正在画线 用时:"+yongshi);
huaxian();
//this.addeventlistener(event.enter_frame, enterframehandle);
} else {
output("无法连通 用时:"+yongshi);
canclick = true;
sel_num = 0;
}
m_player.x=-1000;
m_player.y=-1000;
}
}

}
private function timerhandler(event:timerevent):void {
{
if (this.m_path == null || this.m_path.length == 0) {
output("连连看,双击空白区域重排地图");
canclick = true;
sel_num = 0;
removechild(child);
child=null;
mytimer.removeeventlistener("timer", timerhandler);
return;
}
}
};
private function huaxian():void {
var noteoint = this.m_path[0];
var nowoint=getxy(note);
child = new sprite();
child.graphics.linestyle(4, 0xff0000);
child.graphics.moveto(now.x,now.y);
for (var i:int=1; i<4; i++) {
note = this.m_path;
now=getxy(note);
child.graphics.lineto(now.x,now.y);
}
addchild(child);
this.m_path=null;
mytimer= new timer(600, 1);
mytimer.addeventlistener("timer", timerhandler);
mytimer.start();
}
}
}

时间: 2024-09-27 01:17:00

flash as3 连连看小游戏实现方法的相关文章

JavaScript编写连连看小游戏_javascript技巧

天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果图: 写连连看之前要先考虑哪些呢? 1:如何判断两个元素可以连接呢, 刚刚开始的时候我也纳闷, 可以参考这里:打开: 2:模板引擎怎么选择呢, 我用了底线库的template,因为语法简单. 本来想用Handlebars,但是这个有点大啊, 而且底线库也提供很多常用工具方法( •̀ ω •́ )y:

flash as3 设置文件框焦点focus方法

flash as3 设置文件框焦点focus方法 lash文件和ActionScript文件要放到同一目录下,并且注意ActionScript文件名为类名,在flash文件的属性面板的类中填写focus. package {   import flash.display.Sprite;   import flash.text.TextField;   import flash.text.TextFieldType;   import flash.events.MouseEvent;   publ

java-关于用Java语言编写连连看小游戏

问题描述 关于用Java语言编写连连看小游戏 我要做一个连连看程序,用JAVA语言编写,请问有没有大神手里有源码或是能抽空回答我编写过程中的问题,谢 解决方案 http://download.csdn.net/album/detail/1369 有你需要的游戏 都是源码

物理引擎-挪移链条小游戏实现方法

问题描述 挪移链条小游戏实现方法 最近在4399上玩了个小游戏,叫什么<挪移链条>,因此自己想写代码实现它,但是在用物理引擎的时候对于那个转弯时的角度不知道怎么处理,希望有人帮我解决,提供思路,谢谢!!!! 解决方案 没有人么?自己顶上去,希望让更多的大神看见,帮帮忙啊

java-关于用Java语言编写连连看小游戏的问题

问题描述 关于用Java语言编写连连看小游戏的问题 用Java语言编写连连看小游戏时,如何加入炸弹和计时器功能,怎样才能在点击再来一局是把已得分数归零 解决方案 计时器可以开线程,清零不就把记录分数值的变量赋零不就好了 解决方案二: java游戏源码 很多游戏http://download.csdn.net/album/detail/1369

go语言实现猜数字小游戏的方法_Golang

本文实例讲述了go语言实现猜数字小游戏的方法.分享给大家供大家参考.具体分析如下: 随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了 复制代码 代码如下: package main import (     "bufio"     "fmt"     "math/rand"     "os"     "strconv"     "time" ) var (  

如何快速找回Win7系统自带小游戏的方法介绍

不少朋友都很喜欢Win7系统自带的小游戏,比如扫雷.纸牌.空档接龙等等,空闲时间直接从Windows系统中调出小游戏,既可以放松心情又能锻炼脑筋.但是有些朋友打开Win7开始菜单中的"游戏"选项,却找不到熟悉的 Win7小游戏(如下图),这是怎么回事呢?原来,Win7专业版默认关闭了自带游戏功能,我们只需做一些小小的设置就可以找回Win7系统自带的丰富小游戏啦!

利用C语言实现2048小游戏的方法_C 语言

准备工作 首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的. 了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作:     1.将所有数字向一个方向移动至中间没有空位     2.将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上 另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录. 同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续

怎样实现java小游戏的联机?

问题描述 怎样实现java小游戏的联机? 我们现在是要做一个java小游戏,已经写了各种界面还有行动的逻辑,现在需要实现联机,不太能理解怎样用socket实现联机以及各个组件的交互,求大神帮助! 解决方案 http://blog.csdn.net/u014174328/article/details/40866263http://blog.csdn.net/emilyRR/article/details/40596647 解决方案二: http://blog.csdn.net/a19881029