小游戏 数字连连看

 

游戏玩法:在规定的时间内通过鼠标连线把同颜色的小球尽可能多的连接起来消除掉。

游戏代码分析简化

1:使用Vector类来保存对象集
2:行列二次循环布局小球排列,并根据随机数分配小球的颜色,并用变量val来记录颜色值,以备匹配之用
3:舞台注册鼠标按下,移动,和抬起事件切换
4:核心 鼠标移动,按下记录第一个小球的颜色,然后移动时首先判断是否在有效范围内如果是在判断经过小球的颜色
    进行匹配,如果同色,高亮显示经过的球标注其已被点选则画线并根据相邻小球的角度显示箭头方向。如果不是则不做任何操作,
5:鼠标抬起后则清除掉已经连接的小球,开始从底部到顶部遍历所有小球下方位置,如果为空则此球下降,小球都下降完毕后
     补齐空缺的位置。

 

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    
    /*
    首先资料中两个实现设定好的影片元素
    球对象Tile 线对象Path
    */
    public class Main extends Sprite {
        
        private var fieldWidth:int=8;//小球排列行数
        private var fieldHeight:int=6;//小球排列列数
        private var tileSize:int=80;//小球的大小
        private var tileVector:Vector.<Object>;//小球对象集
        private var visitedVector:Vector.<Point>;//存储已访问过的小球集,我们使用Point点对象来存储坐标X,Y
        private var colorSelected:int=0;//记录用户选择的颜色
        
        //主类
        public function Main() {
            //像舞台上添加小球并初始化小球对象集
            tileVector=new Vector.<Object>();
            //行列循环创建排列
            for (var i:int=0; i<fieldWidth; i++) {
                tileVector[i]=new Vector.<Object>();
                for (var j:int=0; j<fieldHeight; j++) {
                    //创建一个小球对象
                    var tileObject:Object=new Object();
                    tileObject.taken=false;
                    //安排一个1-6的随机数,对应小球颜色帧位
                    tileObject.val=Math.ceil(Math.random()*6);
                    tileObject.tile=new Tile();
                    tileObject.tile.x=i*tileSize;
                    tileObject.tile.y=j*tileSize;
                    //跳转到对应帧
                    tileObject.tile.gotoAndStop(tileObject.val);
                    addChild(tileObject.tile);
                    tileObject.path=null;
                    tileVector[i][j]=tileObject;
                }
            }
            //添加鼠标按下事件
            stage.addEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
        }
        
        //鼠标事件,开始画箭头
        private function startDrawing(e:MouseEvent):void {
            //根据鼠标点坐标来转换其在小球排列中的对应索引
            var i:int=Math.floor(mouseX/tileSize);
            var j:int=Math.floor(mouseY/tileSize);
            //初始化并将球放置到对象集中
            visitedVector=new Vector.<Point>();
            visitedVector.push(new Point(i,j));
            //高亮小球并设定他被选中
            tileVector[i][j].tile.alpha=0.5;
            tileVector[i][j].taken=true;
            //保存选取的颜色
            colorSelected=tileVector[i][j].val;
            //更新侦听器,移除鼠标按下,添加鼠标移动和抬起
            stage.removeEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
            stage.addEventListener(MouseEvent.MOUSE_MOVE,drawing);
            stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);
        }
        
        //-----   移动 ------
        private function drawing(e:MouseEvent):void {
            // 根据鼠标移动获取经过的小球索引
            var i:int=Math.floor(mouseX/tileSize);
            var j:int=Math.floor(mouseY/tileSize);
            // 检查是否在有效的范围内
            var distX:Number=mouseX-(i*tileSize+tileSize/2);
            var distY:Number=mouseY-(j*tileSize+tileSize/2);
            // 1225 is 35^2,计算出有效的范围最大值
            if (distX*distX+distY*distY<1225) {
                //这里检查我们现在移动是否是最后一个经历过的小球
                if (i!=visitedVector[visitedVector.length-1].x || j!=visitedVector[visitedVector.length-1].y) {
                    //现在让我们看如果移动到一个相邻的小球,不想让用户跳过他
                    if (Math.abs(i-visitedVector[visitedVector.length-1].x)<=1 && Math.abs(j-visitedVector[visitedVector.length-1].y)<=1) {
                        //现在我们移动 
                        if (visitedVector.length>1&&i==visitedVector[visitedVector.length-2].x&&j==visitedVector[visitedVector.length-2].y) {
                            //走原路范围时,我们不得不移除在visitedVector中的保存的路径信息,并关闭小球
                            var backtrackPoint:Point=visitedVector.pop();
                            tileVector[backtrackPoint.x][backtrackPoint.y].tile.alpha=1;
                            tileVector[backtrackPoint.x][backtrackPoint.y].taken=false;
                            removeChild(tileVector[backtrackPoint.x][backtrackPoint.y].path);
                            tileVector[backtrackPoint.x][backtrackPoint.y].path=null;
                            //在路径最后添加箭头
                            if (visitedVector.length>=2) {
                                tileVector[visitedVector[visitedVector.length-1].x][visitedVector[visitedVector.length-1].y].path.gotoAndStop(tileVector[visitedVector[visitedVector.length-1].x][visitedVector[visitedVector.length-1].y].path.currentFrame+8);
                            }
                        }
                        else {
                            
                            // 我们不走原路,让我们看看是否有新的小球
                            if (! tileVector[i][j].taken&&tileVector[i][j].val==colorSelected) {
                                //新的小球,插入到集合中并高亮他
                                visitedVector.push(new Point(i,j));
                                tileVector[i][j].tile.alpha=0.5;
                                tileVector[i][j].taken=true;
                                //方式小球的新路径
                                tileVector[i][j].path=new Path();
                                tileVector[i][j].path.x=visitedVector[visitedVector.length-2].x*tileSize+tileSize/2;
                                tileVector[i][j].path.y=visitedVector[visitedVector.length-2].y*tileSize+tileSize/2;
                                //为箭头配置正确的方向帧
                                var iDiff:int=i-visitedVector[visitedVector.length-2].x;
                                var yDiff:int=j-visitedVector[visitedVector.length-2].y;
                                switch (iDiff) {
                                    case -1 :
                                        tileVector[i][j].path.gotoAndStop(Math.abs(yDiff)*(4+3*yDiff)+1+8);
                                        break;
                                    case 0 :
                                        tileVector[i][j].path.gotoAndStop(5+2*yDiff+8);
                                        break;
                                    case 1 :
                                        tileVector[i][j].path.gotoAndStop(5+yDiff+8);
                                        break;
                                }
                                addChild(tileVector[i][j].path);
                                // 从前一路径中移除箭头
                                if (visitedVector.length>=3) {
                                    tileVector[visitedVector[visitedVector.length-2].x][visitedVector[visitedVector.length-2].y].path.gotoAndStop(tileVector[visitedVector[visitedVector.length-2].x][visitedVector[visitedVector.length-2].y].path.currentFrame-8);
                                }
                            }
                            else {
                                //无效的移动,停止画线
                                stopDrawing(null);
                            }
                        }
                    }
                }
            }
        }
        
        //------  停止画线  -------
        private function stopDrawing(e:MouseEvent):void {
            // 更新侦听
            stage.addEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
            stage.removeEventListener(MouseEvent.MOUSE_MOVE,drawing);
            stage.removeEventListener(MouseEvent.MOUSE_UP,stopDrawing);
            // 如果是有效的移动则移除和补充小球
            if (e!=null && visitedVector.length>2) {
                for (var i:int=0; i<visitedVector.length; i++) {
                    // 移除老的小球
                    removeChild(tileVector[visitedVector[i].x][visitedVector[i].y].tile);
                    // 移除老的路径
                    if (i>0) {
                        removeChild(tileVector[visitedVector[i].x][visitedVector[i].y].path);
                    }
                    // 移除小球并标注其为空
                    tileVector[visitedVector[i].x][visitedVector[i].y]=null;
                }
                
                // 从底部到顶部查找为空的小球
                for (i=fieldHeight-1; i>0; i--) {
                    for (var j:int=fieldWidth-1; j>=0; j--) {
                        // 发现为空的小球
                        if (tileVector[j][i]==null) {
                            var temp:int=i-1;
                            //在所有的小球中查找第一个非空小球
                            while (temp>=0 && tileVector[j][temp]==null) {
                                temp--;
                            }
                            if (temp!=-1) {
                                // 向下移动非空的小球
                                tileVector[j][temp].tile.y+=(i-temp)*tileSize;
                                tileVector[j][i]=tileVector[j][temp];
                                tileVector[j][temp]=null;
                            }
                        }
                    }
                }
                //当所有的小球都向下移动完毕后 生产新的小球出现
                for (i=fieldHeight-1; i>=0; i--) {
                    for (j=fieldWidth-1; j>=0; j--) {
                        if (tileVector[j][i]==null) {
                            var tileObject:Object=new Object();
                            tileObject.taken=false;
                            tileObject.path=null;
                            tileObject.val=Math.ceil(Math.random()*6);
                            tileObject.tile=new Tile();
                            tileObject.tile.x=j*tileSize;
                            tileObject.tile.y=i*tileSize;
                            tileObject.tile.gotoAndStop(tileObject.val);
                            addChild(tileObject.tile);
                            tileVector[j][i]=tileObject;
                        }
                    }
                }
            }
            else {
                //关闭所有小球
                for (i=0; i<fieldWidth; i++) {
                    for (j=0; j<fieldHeight; j++) {
                        tileVector[i][j].tile.alpha=1;
                        tileVector[i][j].taken=false;
                        if (tileVector[i][j].path!=null) {
                            removeChild(tileVector[i][j].path);
                            tileVector[i][j].path=null;
                        }
                    }
                }
            }
        }
    }
}

 

简化效果:

posted @ 2013-12-17 09:58  无名盗闪  阅读(332)  评论(0)    收藏  举报