記錄一下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;
};
