2048移动算法

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/71254965 之前一直想写一个web版的2048 ,主要页面已经写好了,但是移动的算法还没有完成。
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/71254965

之前一直想写一个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>
相关文章
|
机器学习/深度学习 算法 Python
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
749 0
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
|
机器学习/深度学习 数据采集 算法
一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码
一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码
1240 0
一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码
|
算法 vr&ar Python
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
1308 0
一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码
|
算法 Java
算法学习入门Day4_lecode_283移动零
算法学习入门Day4_lecode_283移动零
算法学习入门Day4_lecode_283移动零
|
机器学习/深度学习 算法 计算机视觉
【智能优化算法】基于移动阻尼波算法求解单目标优化问题附matlab代码
【智能优化算法】基于移动阻尼波算法求解单目标优化问题附matlab代码
【智能优化算法】基于移动阻尼波算法求解单目标优化问题附matlab代码
|
Rust 算法 安全
【算法学习】1769. 移动所有球到每个盒子所需的最小操作数(java / c / c++ / python / go / rust)
有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 '0' 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 '1' 表示盒子里有 一个 小球。 在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。 返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子所需的 最小 操作数。 每个 answer[i] 都需要根据盒子的 初始状态 进行计算。
【算法学习】1769. 移动所有球到每个盒子所需的最小操作数(java / c / c++ / python / go / rust)
|
算法 Java C#
【算法千题案例】⚡️每日LeetCode打卡⚡️——51.移动零
📢前言 🌲原题样例:移动零 🌻C#方法:排序 🌻Java 方法:双指针 Java方法二:哈希表 💬总结 🚀往期优质文章分享
[leetcode/lintcode 题解] 算法面试真题详解:移动的圆
[leetcode/lintcode 题解] 算法面试真题详解:移动的圆
[leetcode/lintcode 题解] 算法面试真题详解:移动的圆
|
人工智能 算法 开发者
算法笔试模拟题精解之“移动射击”
首先理解题意,题目说的“发动之后只能改变一次方向”是干扰你的,因为即使你在中间过程中左右摆,但宏观上还是最多改变了一次方向。
算法笔试模拟题精解之“移动射击”