2048 游戏实现原理

  记录一下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;
};
原文地址:https://www.cnblogs.com/pipu-qiao/p/6012697.html