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,下个位置数据置0var i,nextI,len,m;    len = arr.length;    for (i = 0; i < len; i += 1) {        //先找nextInextI = -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;};
时间: 2024-10-09 15:47:12

2048 游戏实现原理的相关文章

Android 2048游戏开发

根据教程写的简单的2048游戏. 极客学院教程地址:http://www.jikexueyuan.com/course/43.html 我的源代码地址:https://github.com/myCodingTrip/2048Game 项目有3个类. Card extends FrameLayout{ private int num; private TextView label; public Card(Context context) public int getNum() public vo

2048游戏回顾二:算法总结(移动、合并、动画等)

如果只是单纯的写一个2048游戏,让这个游戏可以玩的话,工作量还是蛮小的.不过,在这写工作中,你可能花时间最多的就是数字的移动与合并的算法了,如果没有做过,可能确实要花点时间来构思,所以,写完2048游戏以后,我希望能把它做个记录. 移动与合并的算法 比如说我们有如下一个界面: 现在,玩家向左划,这个导致所有的数字向左移动,并且移动的过程中如果发生碰撞,会检查数字是不是可以合并. 我们的算法应该是通用的,不仅对于4*4模式,即便是针对3*3模式,n*n模式,它都应该是一样的. 那么怎么做呢?其实

2048游戏回想二:算法总结(移动、合并、动画等)

假设仅仅是单纯的写一个2048游戏.让这个游戏能够玩的话,工作量还是蛮小的.只是,在这写工作中,你可能花时间最多的就是数字的移动与合并的算法了,假设没有做过,可能确实要花点时间来构思,所以.写完2048游戏以后,我希望能把它做个记录. 移动与合并的算法 比方说我们有例如以下一个界面: 如今.玩家向左划.这个导致全部的数字向左移动,而且移动的过程中假设发生碰撞.会检查数字是不是能够合并. 我们的算法应该是通用的.不仅对于4*4模式,即便是针对3*3模式.n*n模式,它都应该是一样的. 那么怎么做呢

游戏外挂原理解析与制作 - [内存数值修改类 篇一]

本章旨在讲解外挂实现原理,未深入涉及至代码层面.希望能与对这方面感兴趣的朋友多多交流,毕竟理论是死的,套路是固定的,只有破解经验是花大量时间和心血积累的. 对于单机游戏而言,游戏中绝大部分的参数(比如血.蓝.能量亦或是金币)都存储在计算机的堆栈中,一些类似剧情进度的则加密后写入本地的自定义配置文件中: 对于页游.网游和手游,虽然服务器保存了大量的重要的参数,但由于客户端不可避免的需要进行大量的计算和资源的加载,本地内存种必定存有部分的临时变量,通过判断这些变量的变化规律和函数的破密寻到利于自身的

用javascript制作2048游戏的思路(原创若 转载请附上本链接)

一.项目已上传至github,地址:https://github.com/forjuan/2048game 二.学习了javascript基础后,想要捣鼓点东西做,做了一个自己以前很爱玩的2048游戏.经过初期的思路设计手工画了设计思路图.手工图有空在用图画出来. 实现2048的功能:1.核心:上下左右移动. 2.游戏开始,游戏结束. 3.外观实现. 4.积分(暂时没实现) 把问题分解:1.首要难点移动,将移动进行分解,分为上下左右移动: 2.用什么记录位置,怎样记录每个方块的值,边界,相同值相

2048游戏C语言代码

听说2048游戏实现起来很easy! 所以今天就试了试!确实不太难,要想编的很成功,也不是太容易!有很多细节需要考虑! 下面是我自己设计的代码,估计里面会漏洞百出!希望路过大神能指点一二! #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #define WIN 256 // 可以修改决定游戏输赢的值 // 矩阵数组 int num[4][4]={0,0,0,0,0

用javascript实现一个2048游戏

早就想自己写一个2048游戏了,昨晚闲着没事,终于写了一个如下图,按方向键开始玩吧.如果觉得操作不方便,请直接打开链接玩吧:http://gujianbo.1kapp.com/2048/2048.html 附上源代码链接:https://github.com/gujianbo/js2048 个人博客地址:http://gujianbo.1kapp.com/ 新浪微博:http://weibo.com/gujianbobo 欢迎读者交流讨论并提出宝贵意见. 用javascript实现一个2048游

游戏外挂原理解析与制作 - [内存数值修改类 篇二]

本章旨在讲解如何利用高级语言根据变量数值寻找内存地址.涉及代码以C#为例. 我用C#写了一个WinForm形式的Demo,界面如下: 源代码: //血量初始值 private int value = 1000; public Form1() { InitializeComponent(); } /// <summary> /// 刷新界面:将最新的血量显示在界面 /// </summary> /// <param name="sender"><

2048游戏回顾一:使用SurfaceView创建游戏启动动画

SurfaceView有个很大的好处,就是可以在子线程中绘制UI,其他的View只能在主线程中更新UI,这或多或少给编程增加了些不便.而SurfaceVIew在子线程中可以绘制UI的特性,再加上其可以直接从内存或者DMA等硬件接口取得图像数据,这使得它适合2d游戏的开发. SurfaceView使用步骤 SurfaceView的使用比较简单,可以总结为如下几个步骤: 1.继承SurfaceView并实现 SurfaceHolder.Callback方法 譬如: public class Star