chengyu game code

showSuccessBox(){

 

        console.log("本局结束")

        var boxNode = new cc.Node()

        var boxBgSp=boxNode.addComponent(cc.Sprite);

        var texture = new cc.Texture2D;

        var spriteFrame = new cc.SpriteFrame;

        texture.initWithData(new Uint8Array([221, 221, 221]), cc.Texture2D.PixelFormat.RGB888, 1, 1, cc.winSize);

        spriteFrame.setTexture(texture);

        spriteFrame.setRect(cc.rect(0, 0,this._screenWidth*0.6,this._screenWidth*0.6*2/3));

        boxBgSp.spriteFrame = spriteFrame     

        boxNode.position = cc.p(0,0)

        boxNode.parent = this.node

 

 

        var btn = new cc.Node()

        var btnTxt = btn.addComponent(cc.Label)

        btnTxt.string = "重新开始"

        btn.color = new cc.Color(0,0,0,255)

        btn.postion = cc.p(0,0)

        btn.parent = boxNode

 

        btn.on(cc.Node.EventType.TOUCH_START,

                

            function(event){

 

                cc.director.loadScene('study')

            }

               

        ,this)

 

    },

    start () {},

 

    loadCube(cubeSize,blocks,words){

 

        console.log("显示矩阵")

        //加载背景

 

        this._words = words

        this._blocks = []//增加一个状态

        /*

            pos 坐标

            text 文字

            status 状态

            covered 是否掩码

            inputedTxt 输入字

            obj block实体

 

            -1 已存在  -> 6

            0 空白 ->1,2,3,4,5->6

            1 当前焦点未输入 默认按顺序第一个空白方块 或者点击某个不是最终状态的方块     

            2 当前焦点已输入 焦点方块获得输入后,没有进行检查

            3 非焦点已输入 焦点移动后,获得输入并且没有进行错误检查的方块

            4 非焦点错误 检查出错的方块(当前不是焦点位置)

            5 焦点错误 检查出错的方块(当前是焦点位置)

            6 正确已保存 最终状态

        */

        this._leftText = []

        /*

            text

            status 0,1

            obj

        */

        //console.log("screenWidth:"+this._screenWidth)

        var cubeBg = new cc.Node("cubeBg")

        var G = this._screenWidth/8

        var L = this._screenWidth-20

        //console.log("矩阵背景长宽:"+L)

 

        var cubeBgSp=cubeBg.addComponent(cc.Sprite);

        var texture = new cc.Texture2D;

        var spriteFrame = new cc.SpriteFrame;

        texture.initWithData(new Uint8Array([221, 221, 221]), cc.Texture2D.PixelFormat.RGB888, 1, 1, cc.winSize);

        spriteFrame.setTexture(texture);

        spriteFrame.setRect(cc.rect(0, 0,L,L));

        cubeBgSp.spriteFrame = spriteFrame

        cubeBg.position = cc.p(0,this._screenHeight/2-L/2-G)

        cubeBg.parent = this.node

 

        //加载成语

        var unitWidth = L/9

        //console.log("矩阵/9背景长宽:"+unitWidth)

        var blockWidth = unitWidth-6

        //console.log("方块长宽:"+blockWidth)

 

        //this.frame_empty = new cc.SpriteFrame(cc.url.raw('resources/block_empty.png'));

        //this.frame_notEmpty = new cc.SpriteFrame(cc.url.raw('resources/block_notEmpty.png'));

        //this.frame_focus = new cc.SpriteFrame(cc.url.raw('resources/block_focus.png'));  

 

        for(var i=0;i<blocks.length;i++){

 

            var tmp = {}

 

 

            var x = blocks[i]['pos']['x']

            var y = blocks[i]['pos']['y']

            tmp['pos']={'x':x,'y':y}//坐标

            tmp['covered']=blocks[i]['covered']

            tmp['inputedTxt']=''

            var block = new cc.Node()

            block.width = blockWidth

            block.height = blockWidth

            var sp = block.addComponent(cc.Sprite);    

            sp.sizeMode = 'CUSTOM'//支持缩放!

 

 

            if(blocks[i]['covered']==1){

                sp.spriteFrame = this.frame_empty

            }else{

                sp.spriteFrame = this.frame_notEmpty

            }

            block.position = cc.p(-L/2+unitWidth/2+x*unitWidth,L/2-unitWidth/2-y*unitWidth)

            block.parent = cubeBg

            

            //加载文字

            var textNode = new cc.Node('text')

            var textLabel = textNode.addComponent(cc.Label);

            if(blocks[i]['covered']==1){

                //textLabel.string = ""

                tmp['status'] = 0

                this._leftText.push({'text':blocks[i]['text']})

            }else{

                textLabel.string = blocks[i]['text']

                tmp['status'] = -1//状态

            }

            tmp['text'] = textLabel.string//文本

            textLabel.verticalAlign = cc.Label.VerticalAlign.CENTER

            textNode.position = cc.p(0,0)

            textNode.color = new cc.color(48,55,65,255);

            block.addChild(textNode)

            block.name = i+""

            block.on(cc.Node.EventType.TOUCH_START,

                

                function(event){

 

                    var blockIdx = event.target.name

                    this.clickBlock(blockIdx)

                }

               

            ,this)

 

 

            tmp['obj']=block//实体

 

            //保存block信息队列

            this._blocks.push(tmp)

            /*

            pos 坐标

            text 文字

            status 状态

            obj block实体

            */

        }

 

        //加载填充的文字

        var leftUnitWidth = L/7

        var leftBlockWidth = leftUnitWidth-12

        

        for(var i=0;i<this._leftText.length;i++){

 

            var tmp={}

            var leftBlock = new cc.Node()

            leftBlock.width = leftBlockWidth

            leftBlock.height = leftBlockWidth

            var sp = leftBlock.addComponent(cc.Sprite);

            sp.spriteFrame = this.frame_notEmpty   

            sp.sizeMode = 'CUSTOM'//支持缩放!

 

            var lefTextNode = new cc.Node()

            var lefTextLabel = lefTextNode.addComponent(cc.Label);

            lefTextLabel.verticalAlign = cc.Label.VerticalAlign.CENTER

            lefTextLabel.string = this._leftText[i]['text']

            lefTextNode.position = cc.p(0,0)

            lefTextNode.color = new cc.color(48,55,65,255);

            leftBlock.addChild(lefTextNode)

            leftBlock.name = i+""

            leftBlock.position = cc.p(-L/2+leftUnitWidth/2+leftUnitWidth*(i%7),this._screenHeight/2-L-G*2-leftUnitWidth/2-leftUnitWidth*Math.floor(i/7))

            leftBlock.parent = this.node

            leftBlock.on(cc.Node.EventType.TOUCH_START,

                

                function(event){

 

                    var leftBlockIdx = event.target.name

                    this.clickLeftBlock(leftBlockIdx)

                }

               

            ,this)

 

            this._leftText[i]['status']=0

            this._leftText[i]['obj']=leftBlock

        }

 

        //设置第一个焦点在第一个空白位置(左上角)

        //从左到右 从上到下 找到第1个空白方块

        this.focusFirstBlock()

    },

    focusFirstBlock(){

 

        console.log("设置第一个空白方块为焦点")

        //先找出所有空白方块

        var emptyBlocks = []

        for(var i=0;i<this._blocks.length;i++){

 

            var tmp = {}

            var pos = this._blocks[i]['pos']

            var covered = this._blocks[i]['covered']

            if(covered == 1 && this._blocks[i]['status'] == 0){

                

                tmp = {'idx':i,'x':pos['x'],'y':pos['y']}

                emptyBlocks.push(tmp)

            }

        }

 

        //找出最小的Y

        var miny = emptyBlocks[0]['y']

        var idx = emptyBlocks[0]['idx']

        for(var j=1;j<emptyBlocks.length;j++){

 

            if(emptyBlocks[j]['y'] < miny){

                miny = emptyBlocks[j]['y']

                idx = emptyBlocks[j]['idx']

            }

        }

        console.log("空白方块的最小Y:"+miny)

 

        //Y最小的前提下,X最小

        var minx = this._blocks[idx]['pos']['x']

        for(var j=0;j<emptyBlocks.length;j++){

 

            if(emptyBlocks[j]['y'] == miny && emptyBlocks[j]['x'] < minx){

                minx = emptyBlocks[j]['x']

                idx =  emptyBlocks[j]['idx']

            }

        }

        console.log("空白方块的最小POS x:"+minx+" y:"+miny+" idx:"+idx)

        //高亮显示

        this.blockChangeStatus(idx,1,"")

        this._nowFocusIdx = idx

 

    },

    clickBlock(idx){

 

        console.log("点击方块:"+idx)

        if(idx != this._nowFocusIdx){

 

            //原来的焦点变化

            if(this._blocks[this._nowFocusIdx]['status'] == 1){

 

                this.blockChangeStatus(this._nowFocusIdx,0,"")

 

            }else if(this._blocks[this._nowFocusIdx]['status'] == 2){

 

                this.blockChangeStatus(this._nowFocusIdx,3,"")

 

            }else if(this._blocks[this._nowFocusIdx]['status'] == 5){

 

                this.blockChangeStatus(this._nowFocusIdx,4,"")

 

            }

 

            //被点击方块的变化

            var l = [0,3,4,5]

            //if(this._blocks[idx]['status'] == 0 ||this._blocks[idx]['status'] == 3){

            if(l.indexOf(this._blocks[idx]['status']) > -1){    

 

                //把字放回下方

                this.returnLeftText(this._blocks[idx]['inputedTxt'])

                this.blockChangeStatus(idx,1,"")

      

 

            }

            this._nowFocusIdx = parseInt(idx)

           

 

        }else{

            console.log("重复点击,清除焦点输入内容")

            //2,5->1

            if(this._blocks[idx]['status'] == 2 || this._blocks[idx]['status'] == 5){

 

                //把字放回下方

                this.returnLeftText(this._blocks[idx]['inputedTxt'])

                this.blockChangeStatus(idx,1,"")

 

            }

        }

 

        /*

        被点击的方块

        0->1

        1不变

        2->1

        3->1

        4->1

        5->1

        原焦点方块

        1->0

        2->3

        5->4

        */

        /*

        0 空白

        1 当前焦点未输入 默认按顺序第一个空白方块 或者点击某个不是最终状态的方块     

        2 当前焦点已输入 焦点方块获得输入后,没有进行检查

        3 非焦点已输入 焦点移动后,获得输入并且没有进行错误检查的方块

        4 非焦点错误 检查出错的方块(当前不是焦点位置)

        5 焦点错误 检查出错的方块(当前是焦点位置)

        6 正确已保存 最终状态

        -1 已存在

        */

    },

    returnLeftText(leftText){

 

        console.log("放回:"+leftText)

        for(var i=0;i<this._leftText.length;i++){

 

            if(this._leftText[i]['text'] == leftText && this._leftText[i]['obj'].active == false){

 

                this._leftText[i]['obj'].active = true

            }

        }

    },

    checkWord(idx){

        /*

        {"word":"俯首贴耳",

        "startPoint":{"x":20,"y":20},

        "direction":"x",

        "blockIndex":[0,1,2,3]},

        */

        var result = []//可能多个成语同时判断

        for(var i=0;i<this._words.length;i++){

            

            var list = this._words[i]['blockIndex']

            if(list.indexOf(idx) > -1){

 

                var tmp = {}

                var list = this._words[i]['blockIndex']

                tmp['targetWord'] = this._words[i]['word']

                tmp['blockIndxList'] = list

                var inpuWord = ""

 

                for(var j=0;j<4;j++){

 

                    var blockIdx = list[j]

                    if(this._blocks[blockIdx]['covered']==1){

 

                        var inpuTxt = this._blocks[blockIdx]['inputedTxt']

                        if(inpuTxt == ""){

                            console.log(tmp['targetWord']+" 没有填完")

                            tmp['justify'] = 0 //未完成

                            inpuWord = ""//清空

                            break

                        }else{//空白方块 取输入的文字

 

                            inpuWord += inpuTxt

                        }

                    }else{//非空白方块 去显示的文字

                        inpuWord += this._blocks[blockIdx]['text']

                    }

                    

                }

                if(inpuWord == tmp['targetWord']){

 

                    tmp['justify'] = 1 //正确

                }else if(inpuWord != "" && inpuWord != tmp['targetWord']){

                    tmp['justify'] = 2 //不正确

                }

                tmp['inpuWord'] = inpuWord

 

                result.push(tmp)

            }

        }

        return result

        /*

        console.log("发现"+result.length+"个成语")

        for(var k=0;k<result.length;k++){

 

            console.log(result[k]['targetWord'])

            console.log(result[k]['blockIndxList'])

            console.log(result[k]['justify'])

            console.log(result[k]['inpuWord'])

        }

        */

    },

    clickLeftBlock(leftBlockIdx){

 

        //隐藏

        this._leftText[leftBlockIdx]['obj'].active = false;

        var inTxt = this._leftText[leftBlockIdx]['text']

        console.log("点击字:"+ inTxt)

        //接受输入 只考虑1 2 5焦点状态

        var status = [1,2,5]

        if(status.indexOf(this._blocks[this._nowFocusIdx]['status']) > -1){

 

            if(this._blocks[this._nowFocusIdx]['status'] == 1){

                //1->2

                this.blockChangeStatus(this._nowFocusIdx,2,inTxt)

            }else if(this._blocks[this._nowFocusIdx]['status'] == 5){

                

                //把字放回下方

                this.returnLeftText(this._blocks[this._nowFocusIdx]['inputedTxt'])

                //更新文字

                this._blocks[this._nowFocusIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = inTxt

                this._blocks[this._nowFocusIdx]['inputedTxt'] = inTxt

        

            }

            //对错判断

            var result = this.checkWord(this._nowFocusIdx)

 

            //console.log("发现"+result.length+"个成语")

            for(var k=0;k<result.length;k++){

 

                var justify = result[k]['justify']

                var blockIdxList = result[k]['blockIndxList']

                if(justify == 0){

                    //没有输入完 pass

                }else if(justify == 2){

                    //提示错误 2->5 3->4

                    for(var z=0;z<4;z++){

 

                        if(this._blocks[blockIdxList[z]]['status'] == 2){

                            //console.log("2->5")

                            this.blockChangeStatus(blockIdxList[z],5,"")

 

                        }else if(this._blocks[blockIdxList[z]]['status'] == 3){

                            //console.log("3->4")

                            this.blockChangeStatus(blockIdxList[z],4,"")

                        }

                    }

                }else if(justify == 1){

                    //正确 2,3,5 ->6

                    for(var z=0;z<4;z++){

 

                        var l = [2,3,4,5]

                        if(l.indexOf(this._blocks[blockIdxList[z]]['status']) > -1){

                   

                            //console.log("2->5")

                            this.blockChangeStatus(blockIdxList[z],6,"")

 

                        }

                    }

                    

                }

            }

 

            //判断是否结束

            if(this.isEnd()){

 

                console.log("完成本局挑战")

                this.showSuccessBox()

                return

            }

 

            if(result.length == 1){

 

                if(result[0]['justify'] != 2){

 

                    //当前焦点是 2->3

                    if(this._blocks[this._nowFocusIdx]['status'] == 2){

                            //console.log("2->5")

                       this.blockChangeStatus(this._nowFocusIdx,3,"")

 

                    }

                    this.focusNext(result)

 

                }

            }else if(result.length == 2){

 

                var jus = [result[0]['justify'],result[1]['justify']]

                console.log(jus)

                if(jus.toString() == [0,2].toString() || jus.toString() == [2,0].toString() || jus.toString() == [2,2].toString()){

                    

                }else{

 

                    //当前焦点是 2->3

                    if(this._blocks[this._nowFocusIdx]['status'] == 2){

                            //console.log("2->5")

                       this.blockChangeStatus(this._nowFocusIdx,3,"")

 

                    }

                    this.focusNext(result)

                }

            }

            /*

            (1)只有1个成语

            2 错误 stop

            (2)两个成语

            0 2 stop

            2 2 stop

            */

        }

 

        /*

            text

            status 0,1

            obj

        */

 

    },

    focusNext(result){

 

        /*移动规则

        0、只能移动到未输入的方块 status = 0

        1、当前成语下一个空白方块 按字顺序0->3

        2、如果当前成语没有空白方块,跳转到相邻的成语(可能有多个,选择1个未完成的,

        如果有多个未完成的,那么随机选1个)的最开始的空白方块;

        3、如果当前成语相邻的其他成语都没有空白方块

        找出所有中未填满的成语

        找出每个成语第一个空白方块

        先向下排列,到底后从头开始排列

        */

 

 

        //console.log(result[k]['blockIndxList'])

        //console.log(result[k]['justify'])

        console.log("移动焦点")

        //移动到属于的成语的下一个空白方块

        for(var i=0;i<result.length;i++){

 

            var blockIdxList = result[i]['blockIndxList']

            if(result[i]['justify'] == 0){//没有填满

 

                for(var j=0;j<4;j++){

 

                    var blockIdx = blockIdxList[j]

                    if(this._blocks[blockIdx]['status'] == 0){

 

                        this.blockChangeStatus(blockIdx,1,"")

                        this._nowFocusIdx = blockIdx

                        return

                    }

                    

                }

                

            }

 

            

        }

 

        console.log("寻找相邻成语")

        for(var i=0;i<result.length;i++){

 

            var blockIdxList = result[i]['blockIndxList']

            for(var k=0;k<this._words.length;k++){

 

                //包含相同的block idx则为相连

                for(var z=0;z<4;z++){

 

                    var blockIdx = blockIdxList[z]

                    if(this._words[k]['blockIndex'].indexOf(blockIdx) > -1 && this._words[k]['blockIndex'].toString() != blockIdxList.toString()){

 

                        console.log(this._words[k]['word']+"相连")

                        var targetBlockIdxList = this._words[k]['blockIndex']

                        for(var a=0;a<4;a++){

 

                            if(this._blocks[targetBlockIdxList[a]]['status'] == 0){

 

                                this.blockChangeStatus(targetBlockIdxList[a],1,"")

                                this._nowFocusIdx = targetBlockIdxList[a]

                                return

                            }

                        }

                       

                    }

                }

                

            }

        }

 

        //找到所有未填满的成语

        var unFullWords = []

        for(var i=0;i<this._words.length;i++){

 

            var tmp = {}

            var blockIndexList = this._words[i]['blockIndex']

            for(var j=0;j<4;j++){

                if(this._blocks[blockIndexList[j]]['status'] == 0){

 

                    tmp['firstBlankBlockIdx'] = blockIndexList[j]

                    tmp['x']=this._blocks[blockIndexList[j]]['pos']['x']

                    tmp['y']=this._blocks[blockIndexList[j]]['pos']['y']

                    unFullWords.push(tmp)

                    break

                }

            }

        }

        console.log("当前有:"+unFullWords.length+"个成语未满")

        if(unFullWords.length == 0){

 

            return

        }

        var nowFocusY = this._blocks[this._nowFocusIdx]['pos']['y']

        var nowFocusX = this._blocks[this._nowFocusIdx]['pos']['x']

 

        var nextFocusIdx = unFullWords[0]['firstBlankBlockIdx']

        //扫描本行

        for(var i=nowFocusX+1;i<9;i++){

 

            for(var j=0;j<unFullWords.length;j++){

 

                if(unFullWords[j]['x'] == i && unFullWords[j]['y'] == nowFocusY){

 

                    console.log("找到同一行的")

                    this.blockChangeStatus(unFullWords[j]['firstBlankBlockIdx'],1,"")

                    this._nowFocusIdx = unFullWords[j]['firstBlankBlockIdx']

                    return

                }

            }

        }

 

        //下方

        for(var j=nowFocusY+1;j<9;j++){

 

            for(var i=0;i<9;i++){

                

                for(var k=0;k<unFullWords.length;k++){

                    if(unFullWords[k]['x'] == i && unFullWords[k]['y'] == j){

 

                        console.log("找到下方的")

                        this.blockChangeStatus(unFullWords[k]['firstBlankBlockIdx'],1,"")

                        this._nowFocusIdx = unFullWords[k]['firstBlankBlockIdx']

                        return

                    }

                }

                

            }

        }   

 

        //上方

        for(var j=0;j<nowFocusY;j++){

 

            for(var i=0;i<9;i++){

                

                for(var k=0;k<unFullWords.length;k++){

                    if(unFullWords[k]['x'] == i && unFullWords[k]['y'] == j){

 

                        console.log("找到上方的")

                        this.blockChangeStatus(unFullWords[k]['firstBlankBlockIdx'],1,"")

                        this._nowFocusIdx = unFullWords[k]['firstBlankBlockIdx']

                        return

                    }

                }

                

            }

        }  

    },

    isEnd(){

 

        console.log("判断是否结束")

        for(var i=0;i<this._blocks.length;i++){

 

            if(this._blocks[i]['covered'] == 1 && this._blocks[i]['status'] != 6){

 

                console.log(this._blocks[i]['text']+" 不是6"+" "+this._blocks[i]['status'])

                return false

            }

        }

        return true

    },

    blockChangeStatus(blockIdx,newStatusId,newTxt){

        

        if(newStatusId == 0){

 

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty

 

        }

        else if(newStatusId == 1){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = ""

            this._blocks[blockIdx]['inputedTxt'] = ""

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus

        

        }else if(newStatusId == 2){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').color = cc.Color.WHITE

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus

            this._blocks[blockIdx]['inputedTxt'] = newTxt

            this._blocks[blockIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = newTxt

            

        }else if(newStatusId == 3){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(48,55,65,255)

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty

        

        }else if(newStatusId == 4){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(165,42,42,255)

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty

        

        }else if(newStatusId == 5){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(165,42,42,255)

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus

        

        }else if(newStatusId == 6){

 

            this._blocks[blockIdx]['obj'].getChildByName('text').color = cc.Color.GREEN

            this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_notEmpty

        }

        this._blocks[blockIdx]['status'] = newStatusId

        

    },

    lefBlockChangeStatus(newStatusId){

 

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值