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;
    };
  • 相关阅读:
    es date_histogram强制补零
    macos下默认的调试工具是lldb
    test
    mybaity 代码自动生成器
    初始化的问题
    SQLServer常用语句
    PowerShell Install-Module 离线安装 .nupkg包
    .NET Core语句记录
    system design(how to design tweet)
    软件-开源
  • 原文地址:https://www.cnblogs.com/pipu-qiao/p/6012697.html
Copyright © 2011-2022 走看看