消除游戏解析

消除游戏需要定义的就是它的行数和列数,以及颜色种数。

var GameData = {
    W_NUM:10,
    H_NUM:10,
    CELL_TYPE:2,
}

首先我们建立一个二维数组,设置好位置

_init:function(){
        this.cellArr = []
        for (var i = 0;i < GameData.W_NUM; i++) {
            this.cellArr[i] = []
            for(var j = 0;j < GameData.H_NUM;j++){
                var sp = new Cell()
                sp.setArrIndex(i, j)
                sp.setPosition(50 + i*40, cc.winSize.height-40 - j*40)
                this.addChild(sp)
                this.cellArr[i][j] = sp
            }

我们可以用for循环来试先检测一下我们点击色块边上的位置,由于可能有时候色块会比较多,所以我们先用五次

 dispell: function (event) {
 var touchIndex = event.getUserData()      //点击的坐标
        cc.log(touchIndex)
        var arr = this.checkNeighbor(touchIndex)
        //循环五次检测
        for(var i = 0;i < Q.H_NUM*2;i++) {
            var newArr = arr.slice()
            for (var index in arr) {
                var po = arr[index]
                 var newArr = this.filterDelSame(newArr, this.checkNeighbor(po))
            }
            var size = newArr.length
            var oldLen = arr.length
                arr = newArr
                if(arr.length == oldLen)  break
        }
        //获取到了颜色相同的数组
        this.cellFallDown(arr)
    }

在这代码里,filterDelSame是我们写的一种检测色块下落,然后色块下标随着移动而改变的代码

 filterDelSame: function(arr1, arr2){
        var returnArr = arr1.concat(arr2)
        for(var i = 0; i < returnArr.length; i++){
            var nowPo = returnArr[i]
            for(var j = i + 1; j < returnArr.length; j++){
                if(cc.pSameAs(returnArr[j], nowPo)){
                    returnArr.splice(j , 1)
                    j--       //上面删除了一个元素,下标需要减一
                }
            }
        }
        return returnArr
    },

checkNeighbor就是检测我们点击的色块的四周有没有同色的,然后接下里找到第二个继续这样检测的方法

 checkNeighbor: function (touchIndex) {      //根据一个点检测周围符合情况的点  检测周围四个符合条件的点 返回数组
        var checkArr = [cc.p(-1,0),cc.p(1, 0), cc.p(0, -1), cc.p(0, 1)]
        var arr = []
        for (var index in checkArr) {
            var arrayIndex = checkArr[index]
            var tempPo = cc.pAdd(touchIndex,arrayIndex)
            if(this.checkCellColor(tempPo,touchIndex)){
                arr.push(tempPo)
            }
        }
        return arr;
  }

cellFallDown是清除色块的一个方法

cellFallDown: function(arrayIndexArr){
        //清除同颜色的块儿   并且二维数组中的位置置为null
        for(var index in arrayIndexArr){
            var arrayIndex = arrayIndexArr[index]
            this.cellArr[arrayIndex.x][arrayIndex.y].removeFromParent(true)
            this.cellArr[arrayIndex.x][arrayIndex.y] = null
        }
        for(var i = 0; i < Q.W_NUM;i++){
            for(var j = Q.H_NUM - 1; j >= 0;j--){
                if(this.cellArr[i][j] == null){
                    continue
                }
                var tempAdd = 0
                for(var k = j;k < Q.H_NUM;k++){
                    if(this.cellArr[i][k] == null)  tempAdd++
                }
                this.cellArr[i][j].fallDownNum = tempAdd
            }
        }
        for(var i = 0;i < Q.W_NUM; i++){
            for(var j = Q.H_NUM - 1; j >= 0; j-- ){
                this.updateCellByFallDownNum(this.cellArr[i][j])
            }
        }
    },

updateCellByFallDownNum是清除并且掉落更新的方法

 updateCellByFallDownNum : function(cell){
        if(cell == null)  return
        if(cell.fallDownNum == 0)  return
        var tempPo = cc.pAdd(cc.p(0, cell.fallDownNum), cell.count)
        this.cellArr[tempPo.x][tempPo.y] = cell
        this.cellArr[cell.count.x][cell.count.y] = null
        cell.fallDown()
        cell.fallDownNum = 0
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值