标签:原理 cti 相等 nbsp -- 二位数组 row 核心 技术
记录一下2048游戏的逻辑
这个游戏的本质是二位数组,就以4*4的二位数组来分析关键的逻辑以及实现。二位数组如图1
--------》 结果
图1 图2 图3
我们所有的操作都是对这个二维数组的数据的操作。分为上下左右四个方向。我们先说向左的方向(如图2)。
向左操作的结果如图3;
当相左的方向是,所有的数据沿着水平方向向左跑,恩,这是:看到的结果。
水平相左:
1:水平说明操作的是二维数组的一行,而垂直操作的则是二位数组的一列。这样就可以将二维数组的操作变成遍历后对一维数组的操作。
2:向左说明数据的优先考虑的位置是从左开始的。这样就确定了一维数组的遍历开始的位置。
图2 中共四行,每一个行都能得到一个以为数组
arr1:[0,0,2,0];
arr2:[0,4,2,0];
arr3:[0,0,4,4];
arr4:[2,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; };
这样一来向左的方向就变成。
从上到下获得每一行的数组,方向向左。参数(row,left);
其他的三个方向在开始的时候记住是怎样获得以为数组的,等操作完才放回去这样就能实现了
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;
};
标签:原理 cti 相等 nbsp -- 二位数组 row 核心 技术
原文地址:http://www.cnblogs.com/pipu-qiao/p/6012697.html