三消

三消游戏
1.显示若干随机块儿

this.type= parseInt(1+Math.random()*5);//随机生成数

this.initWithFile("res/square"+this.type+".png"); //显示随机图块


  

 

3.检查横行里是否有3个同色相连的块,结果存为数组,
类似[[cc.p(1,0),cc.p(1,1),cc.p(1,2)],...]
 a.一个二维数组,里面是若干块
 b.块有type属性,记录了颜色值
 算法:
 遍历检测每一个块右侧的两个块颜色是否一致,一致则说明3个相连
 需要注意的是在  横行数 - 2的位置停止检测,防止越界

 

var arr = [];
for(var i = 0 ; i < GAMEDATA.LINE ; i++){
    for( var j = 0; j <GAMEDATA.LIST; j++){
        if( i < GAMEDATA.LINE - 2 &&
            this.spArr[i][j].type == this.spArr[i+1][j].type &&
            this.spArr[i+1][j].type == this.spArr[i+2][j].type){
            arr.push(this.spArr[i][j].primary,this.spArr[i+1][j].primary,this.spArr[i+2][j].primary);

        }
        if( j < GAMEDATA.LIST - 2 &&
            this.spArr[i][j].type == this.spArr[i][j+1].type &&
            this.spArr[i][j+1].type == this.spArr[i][j+2].type){
            arr.push(this.spArr[i][j].primary,this.spArr[i][j+1].primary,this.spArr[i][j+2].primary);
        }
    }
}

 

4.把竖行也添加上
5.将以上检查封装成一个函数,将会返回相连的点的数组
 

6.创建初始没有三个相连的数组
 目前拥有:a.二维数组检查的fun
    b.一个已经填充了随机块的二维数组   
 算法:生成完成后,进行检查,发现相同数组长度大于0,
 将相同的3个块中任意一块换成随机颜色,继续检查,直至检测长度为0
 
//=-------------------------------------------------------------------
点击行为的处理
7.重复点选以及取消的逻辑
 a.点击一个块,该块出现选中图标
 b.再次点击该块,选中图标消失
 c.点击另外一块,如果该块属于a点击块的上下左右,则cc.log('交换')
     否则进入流程a  选中另外一块
 Math.abs(VALUE) 对VALUE取绝对值
     
8.交换逻辑
 2个块交换位置   并且更新在 二维数组中的下标
 用第五步的方法检查,如果3连长度为0,交换失败,将2个换回去
      如果3连长度不为0,使用fun将相连的块找到消除,掉落
 进入稳定状态后,上方刷出随机颜色快掉落,并且消除三连直至稳定状态

 

 

 //消除
cellFallDown:function(arrayIndex){
     if(arrayIndex.length>0) {
         for (var index in arrayIndex) {
             var xo = arrayIndex[index]
             cc.log(xo.x,xo.y)
             this.spArr[xo.x][xo.y].removeFromParent(true)
             this.spArr[xo.x][xo.y] = null
         }
         //掉落
         for (var i = 0; i < GAMEDATA.LINE; i++) {
             for (var j = GAMEDATA.LIST - 1; j >= 0; j--) {
                 if (this.spArr[i][j] == null) {
                     continue
                 }
                 var tempAdd = 0
                 for (var k = j; k < GAMEDATA.LIST; k++) {
                     if (this.spArr[i][k] == null)  tempAdd++
                 }
                 this.spArr[i][j].fallDownNum = tempAdd
             }
         }
         for (var i = 0; i < GAMEDATA.LINE; i++) {
             for (var j = GAMEDATA.LIST - 1; j >= 0; j--) {
                 this.updateCellByFallDownNum(this.spArr[i][j])
             }
         }
     }
     this.scheduleOnce(this.fillEmpty.bind(this),1.1)
 },
 
 
updateCellByFallDownNum:function(cell){
     if(cell == null) return
     if(cell.fallDownNum == 0) return
     var tempPo = cc.pAdd(cc.p(0,cell.fallDownNum), cell.primary)
     this.spArr[tempPo.x][tempPo.y] = cell
     this.spArr[cell.primary.x][cell.primary.y] = null
     cell.fallDown()
     cell.fallDownNum = 0
 },
fillEmpty:function(){
    for(var i = 0;i<GAMEDATA.LINE; i++) {
        for (var j = 0; j<GAMEDATA.LIST; j++) {
            if (this.spArr[i][j] == null) {
                var cells = new cell()
                cells.labels(i,j)
                cells.setPosition(50 + i * 40, cc.winSize.height - 40 - j * 40)
                this.addChild(cells)
                this.spArr[i][j] = cells
            }
        }
    }
    var end = this.rahgar()
    if(end.length == 0 ){
        cc.log("进入稳定状态   停止")
    }else {
        this.scheduleOnce(function (){
            this.cellFallDown(end)
        },0.51)
    }
},

 



//文本

this.Lale = new cc.LabelBMFont("Score:",res.mikado);
this.Lale.setPosition((cc.winSize.width>>1)-240,(cc.winSize.height>>1)+450);
this.addChild(this.Lale);
//按钮

var menuFont = new cc.MenuItemImage("res/kaishi.png","res/kaishi1.png", this.startGame, this);
menuFont.setPosition((-cc.winSize.width >> 1) + 300, (-cc.winSize.height >> 1) + 420);
var menu = new cc.Menu(menuFont);
this.addChild(menu);
//掉落

//掉落
    for (var i = 0; i < GAMEDATA.LINE; i++) {
        for (var j = GAMEDATA.LIST - 1; j >= 0; j--) {
            if (this.spArr[i][j] == null) {
                continue
            }
            var tempAdd = 0
            for (var k = j; k < GAMEDATA.LIST; k++) {
                if (this.spArr[i][k] == null)  tempAdd++
            }
            this.spArr[i][j].fallDownNum = tempAdd
        }
    }
    for (var i = 0; i < GAMEDATA.LINE; i++) {
        for (var j = GAMEDATA.LIST - 1; j >= 0; j--) {
            this.updateCellByFallDownNum(this.spArr[i][j])
        }
    }
}
this.scheduleOnce(this.fillEmpty.bind(this),1)//掉落 下落生成时间


//检测是否有三个相连的方块
rahgar:function(){
    var arr = [];
    for(var i = 0 ; i < GAMEDATA.LINE ; i++){
        for( var j = 0; j <GAMEDATA.LIST; j++){
            if( i < GAMEDATA.LINE - 2 &&
                this.spArr[i][j].type == this.spArr[i+1][j].type &&
                this.spArr[i+1][j].type == this.spArr[i+2][j].type){
                arr.push(this.spArr[i][j].primary,this.spArr[i+1][j].primary,this.spArr[i+2][j].primary);

            }
            if( j < GAMEDATA.LIST - 2 &&
                this.spArr[i][j].type == this.spArr[i][j+1].type &&
                this.spArr[i][j+1].type == this.spArr[i][j+2].type){
                arr.push(this.spArr[i][j].primary,this.spArr[i][j+1].primary,this.spArr[i][j+2].primary);
            }
        }
    }
    arr = this.filterDelSame(arr,[])
    return  arr
},



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值