2048移动算法

之前一直想写一个web版的2048 ,主要页面已经写好了,但是移动的算法还没有完成。今天研究了一下移动的算法,用4*4的数组表示游戏界面,虽然有点简陋,不过已经能看出效果了( ̄▽ ̄)/。接下来有时间再把代码和页面整合一下。( ̄▽ ̄”)

以左移为例,当用户按下左键时,游戏需要完成两个步骤:
1,从左往右检查是否有可以相加的数字
2,每次检查后从右往左调整数字的位置,保证数字相邻的左端不会有0

左移函数:

        function moveLeft (){
            var i,j;  
            for(i=0;i<4;i++){  
                for(j=0;j<3;j++){  
                    if(data[i][j] == data[i][j+1]){
                        data[i][j] += data[i][j+1];
                        data[i][j+1] = 0 ;
                    }
                    clearLeft();
                }
            }
        }

清零函数:

    function clearRight(){
        for(var i = 0 ; i < 4 ; i++){
            for(var j = 3 ; j >= 0  ; j-- ){
                for(var k = j ; k < 4  ; k++ ){
                    if(data[i][j]!= 0 && data[i][k] == 0){
                        data[i][k] = data[i][j];
                        data[i][j] = 0 ;
                    }
                }
            }
        }
    }

完整代码如下:

<html>

<body>
    <input type="button" value="Left" onclick="moveLeft(); show();"/>
    <input type="button" value="right" onclick="moveRight(); show();"/>
    <input type="button" value="up" onclick="moveUp(); show();"/>
    <input type="button" value="down" onclick="moveDown(); show();"/>

    <div id="s"></div>
    <script>
    var data = [[8,8,2,0],[8,0,8,2],[8,0,2,8],[8,2,0,8]];
        function show(){
            var s = document.getElementById("s");
            s.innerHTML = "";
            for(var i = 0 ; i < 4 ; i++){
                for(var j = 0 ; j < 4 ; j++){
                    s.innerHTML += data[i][j]+"&nbsp;&nbsp;&nbsp;&nbsp;";
                }
            s.innerHTML += "<br/>";
            }
        }

        // 左移
        function moveLeft (){
            var i,j;  
            for(i=0;i<4;i++){  
                for(j=0;j<3;j++){  
                    if(data[i][j] == data[i][j+1]){
                        data[i][j] += data[i][j+1];
                        data[i][j+1] = 0 ;
                    }
                    clearLeft();
                }
            }
        }

        // 右移
        function moveRight (){
            var i,j;  
            for(i=0;i<4;i++){  
                for(j=0;j<3;j++){  
                    if(data[i][j] == data[i][j+1]){
                        data[i][j+1] += data[i][j];
                        data[i][j] = 0 ;
                    }
                    clearRight();
                }
            }
        }

        // 上移
        function moveUp (){
            var i,j;  
            for(j=0;j<4;j++){  
                for(i=0;i<3;i++){  
                    if(data[i][j] == data[i+1][j]){
                        data[i][j] += data[i+1][j];
                        data[i+1][j] = 0 ;
                    }
                    clearUp();
                }
            }
        }   

        // 下移
        function moveDown (){
            var i,j;  
            for(j=0;j<4;j++){  
                for(i=3;i>0;i--){  
                    if(data[i][j] == data[i-1][j]){
                        data[i][j] += data[i-1][j];
                        data[i-1][j] = 0 ;
                    }
                    clearDown();
                }
            }
        }       

    // 清除右边的0
    function clearRight(){
        for(var i = 0 ; i < 4 ; i++){
            for(var j = 3 ; j >= 0  ; j-- ){
                for(var k = j ; k < 4  ; k++ ){
                    if(data[i][j]!= 0 && data[i][k] == 0){
                        data[i][k] = data[i][j];
                        data[i][j] = 0 ;
                    }
                }
            }
        }
    }

    // 清除左边的0
    function clearLeft(){
        for(var i = 0 ; i < 4 ; i++){
            for(var j = 0 ; j < 4  ; j++){
                for(var k = j ; k >= 0 ; k-- ){
                    if(data[i][j]!= 0 && data[i][k] == 0){
                        data[i][k] = data[i][j];
                        data[i][j] = 0 ;
                    }
                }
            }
        }
    }

    // 清除上方的0
    function clearUp(){
        for(var j = 0 ; j < 4 ; j++){
            for(var i = 0 ; i <4  ; i++){
                for(var k = i ; k >=0  ; k-- ){
                    if(data[i][j]!= 0 && data[k][j] == 0){
                        data[k][j] = data[i][j];
                        data[i][j] = 0 ;
                    }
                }
            }
        }
    }

    // 清除下方的0
    function clearDown(){
        for(var j = 0 ; j < 4 ; j++){
            for(var i = 3 ; i >= 0 ; i--){
                for(var k = i ; k < 4 ; k++ ){
                    if(data[i][j]!= 0 && data[k][j] == 0){
                        data[k][j] = data[i][j];
                        data[i][j] = 0 ;
                    }
                }
            }
        }
    }   

    show();



    </script>
</body>
</html>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值