• js实现2048小游戏二维数组更新算法


    2048小游戏是当下比较流行的益智游戏了,而它最关键的模块莫过于当手指滑过或鼠标按下后如何确定更新的值。

    首先该游戏可以看作一个4*4的二维数组的更新游戏,玩家通过控制数组内元素的合并来不断产生更大的数字,当方向确定时,每一行或每一列的计算方式实际上是一样的,例如,当我确定方向为向左时,每一行的计算方式都是一样的,这样,我们就可以将二维数组的计算简化为一维数组的计算了,然后通过循环计算其他行即可。

    而一维数组中主要就是寻找相邻的两个非空值进行合并,相关函数可表示如下:

    // 一维数组合并相邻非空项
        function mergeArrayElement(arr) {
            var newArr = []
            var index = -1 // index为-1表示未找到一个非空值
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] != 0) {
                    if (index != -1) {
                        if (arr[index] == arr[i]) {
                            newArr.push(arr[index] * 2)
                            index = -1
                        } else {
                            newArr.push(arr[index])
                            index = i
                        }
                    } else {
                        index = i
                    }
                }
            }
            if (index != -1) newArr.push(arr[index])
            // 如果新数组长度不足4,补0
            while (newArr.length < 4) {
                newArr.push(0)
            }
            return newArr
        }

    其他方向也都大同小异,稍微对数组加工一下即可获取到更新后的二维数组值,这里贴出完整代码供参考

    var arr = [
        [1122],
        [1222],
        [1002],
        [1224],
    ]
    console.log(get2048NewArray(arr, ))
    console.log(get2048NewArray(arr'left'))   // [ [ 2, 4, 0, 0 ], [ 1, 4, 2, 0 ], [ 1, 2, 0, 0 ], [ 1, 4, 4, 0 ] ]
    console.log(get2048NewArray(arr'right'))  // [ [ 0, 0, 2, 4 ], [ 0, 1, 2, 4 ], [ 0, 0, 1, 2 ], [ 0, 1, 4, 4 ] ]
    console.log(get2048NewArray(arr'up'))     // [ [ 2, 2, 0, 0 ], [ 1, 4, 0, 0 ], [ 4, 2, 0, 0 ], [ 4, 2, 4, 0 ] ]
    console.log(get2048NewArray(arr'down'))   // [ [ 0, 0, 2, 2 ], [ 0, 0, 1, 4 ], [ 0, 0, 2, 4 ], [ 0, 2, 4, 4 ] ]


    function get2048NewArray(arrdirection) {
        var arrT = arrayTransposition(arr)
        var newArr = []
        switch (direction) {
            // 向上
            case 'up':
                for (var i = 0i < 4i++) {
                    newArr[i] = mergeArrayElement(arrT[i])
                }
                break
                // 向下
            case 'down':
                for (var i = 0i < 4i++) {
                    newArr[i] = mergeArrayElement(arrT[i].reverse()).reverse()
                }
                break
                // 向右
            case 'right':
                for (var i = 0i < 4i++) {
                    // 为了不影响原数组,slice复制一下
                    newArr[i] = mergeArrayElement(arr[i].slice().reverse()).reverse()
                }
                break
            case 'left':
            default:
                // 向左
                for (var i = 0i < 4i++) {
                    newArr[i] = mergeArrayElement(arr[i])
                }
        }
        return newArr

        // 一维数组合并相邻非空项
        function mergeArrayElement(arr) {
            var newArr = []
            var index = -1 // index为-1表示未找到一个非空值
            for (var i = 0i < arr.lengthi++) {
                if (arr[i] != 0) {
                    if (index != -1) {
                        if (arr[index] == arr[i]) {
                            newArr.push(arr[index] * 2)
                            index = -1
                        } else {
                            newArr.push(arr[index])
                            index = i
                        }
                    } else {
                        index = i
                    }
                }
            }
            if (index != -1newArr.push(arr[index])
            // 如果新数组长度不足4,补0
            while (newArr.length < 4) {
                newArr.push(0)
            }
            return newArr
        }

        // 二维数组转置
        function arrayTransposition(arr) {
            var newArr = [
                [],
                [],
                [],
                []
            ]
            for (var i = 0i < arr.lengthi++) {
                for (var j = 0j < arr[0].lengthj++) {
                    newArr[i][j] = arr[j][i]
                }
                // console.log(newArr[0][0])
            }
            return newArr//.reverse()
        }
    }
  • 相关阅读:
    混沌的艺术--- YChaos通过数学公式生成混沌图像
    相声段子:How Are You
    太阳崇拜---64幅由算法生成的八芒星图像
    自然的密码---36幅由算法生成的六芒星图像
    雪花六出---几幅算法生成的雪花图像,并祝大家平安夜和圣诞节快乐
    18个分形图形的GIF动画演示
    python的with用法(参考)
    彻底解决django 2.2以上版本与mysql兼容性问题(不用改源码)
    python操作MySQL数据库的三个模块
    MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
  • 原文地址:https://www.cnblogs.com/chuanzi/p/11638376.html
Copyright © 2020-2023  润新知