zoukankan      html  css  js  c++  java
  • 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;
    };
  • 相关阅读:
    openldap
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P1567 统计天数
    Java实现 洛谷 P1567 统计天数
  • 原文地址:https://www.cnblogs.com/pipu-qiao/p/6012697.html
Copyright © 2011-2022 走看看