博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2048游戏原理(二)
阅读量:5131 次
发布时间:2019-06-13

本文共 2957 字,大约阅读时间需要 9 分钟。

上一次讲了2048游戏关于处理一行数据的实现原理,对每一行的处理中针对数据为0的需要重新进行处理,效率略低

实现原理一:

//遍历数组从数组的的当前位置的下一个开始遍历,找不是0的位置()    // 如果没找到什么也不做    // 如果找到        //如果当前位置是0,那么像当前位置与下一个进行互换(当前位置获得下一个位置的数据,并且将下一个位置数据置为0,将下标减一)        //如果当前位置和下一个位置相等,将当前位置数据*2,下个位置数据置0
var getData = function(arr) {     //遍历数组从数组的的当前位置的下一个开始遍历,找不是0的位置()        // 如果没找到什么也不做        // 如果找到            //如果当前位置是0,那么像当前位置与下一个进行互换(当前位置获得下一个位置的数据,并且将下一个位置数据置为0,将下标减一)            //如果当前位置和下一个位置相等,将当前位置数据*2,下个位置数据置0        var i,nextI,len,m;        len = arr.length;        for (i = 0; i < len; i += 1) {            //先找nextI            nextI = -1;            for (m = i+1; m < len; m++){                if(arr[m] !== 0) {                    nextI = m;                    break;                }            }            if (nextI !== -1) {                //存在下个不为0的位置                if (arr[i] === 0) {                    arr[i] = arr[nextI];                    arr[nextI] = 0;                    i -= 1;                } else if (arr[i] === arr[nextI]) {                    arr[i] = arr[i] *2;                    arr[nextI] = 0;                }            }        }        return arr;    };

 

实现原理二: 具体实现方法2:
var getDataArray = function(arr) {        //遍历数组将其中的0去除,剩下的放入数组1中        //遍历数组1,当前位置与下一个是否相等如果相等,将当前位 的值 *2,下一位值 为0,同时下标加2,否则下标加1        //遍历数组1,将其中的0去除 得到数组2        //将数组2补齐到arr的长度,用0补        var getNonemptyArray = function(arr) {            var i,len, targetArr = [];            for (i = 0,len = arr.length;i < len;i += 1) {                if (arr[i] !== 0)                    {targetArr.push(arr[i]);                }            }            return targetArr;        };        var i,len,targetArr = [];        targetArr = getNonemptyArray(arr);        if(targetArr.length === 0) {
return arr} for(i = 0,len = targetArr.length;i < len;) { if(i < len -1 && targetArr[i] === targetArr[i + 1]) { targetArr[i] = targetArr[i] * 2; targetArr[i + 1] = 0; i += 2; }else{ i += 1 } } targetArr = getNonemptyArray(targetArr); for(i = 0,len = arr.length - targetArr.length; i < len; i += 1) { targetArr.push(0); } return targetArr; };

  用这种方式进行操作的数据共遍历了4次;

  用函数来测试两个方法的耗时

  当数组中3000个数据的时候的运行结果。

var getRandomNumber = function() {       return  Math.random() > 0.4 ? 0 : Math.random() > 0.5 ? 2 : 4;    };    var getTestDataArray = function(len) {        var arr = [];        for(var i = 0;i < len; i += 1) {          arr.push(getRandomNumber());        }        return arr;    };    var time1,time2,testArr;    testArr = getTestDataArray(30000);        time1 = new Date();    getData(testArr);    time2 = new Date();    console.log('方法一' + (time2 -time1));    time1 = new Date();    getDataArray(testArr);    time2 = new Date();    console.log('方法二' + (time2 -time1));

  运行结果:

方法一425 方法二3

可以看出方法二的效率要高很多。

 

转载于:https://www.cnblogs.com/pipu-qiao/p/6015594.html

你可能感兴趣的文章
virutalenv一次行安装多个requirements里的文件
查看>>
Vue安装准备工作
查看>>
.NET 母版页 讲解
查看>>
Android Bitmap 和 Canvas详解
查看>>
最大权闭合子图
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
导入导出数据库和导入导出数据库表
查看>>
linux下操作mysql
查看>>
【03月04日】A股滚动市盈率PE历史新低排名
查看>>
Xcode5和ObjC新特性
查看>>
jvm slot复用
查看>>
高并发系统数据库设计
查看>>
LibSVM for Python 使用
查看>>
入坑的开始~O(∩_∩)O~
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
Windows 7 上安装Visual Studio 2015 失败解决方案
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>