• 浅谈2048


    PS:还没有更新完,日后会陆续更新,并配上彩图,方便理解!

    关于2048的一些心得

    本人比较菜(其实是没有太多时间去玩了),只玩到了4096分,现在把自己的一些技巧分享给大家

    (本文需要前置知识:分治,贪心,递归)

    整体思路

    首先观察这个图,是一个16个格子的矩阵,失败的终点是无法再合并

    考虑合并的规则(2;to;4,4;to;8,8;to;16),依次类推,可以发现,可以用(2^{x-1})可以得到(2^x)其中((1 leq x))

    而游戏所能获得的分值也随着合并之后所得到的数的大小而递增

    我们考虑如何最优化合并,以得到2048为例子,想要得到2048((2^{11})),就要通过两个1024((2^{10}))来合并得到

    而每一个1024((2^{10}))需要两个512((2^9))来合并,以此类推,我们发现,必须是(2^{max-1})(2^{max-2})挨在一起

    这样我们只需要得到一个(2^{max-2})就可以合并得到(2^{max})

    在此我规定把当前最大值(2^{max-1})堆在矩阵的右下方,把当前次大值(2^{max-2})紧挨着最大值放(也就是矩阵的最后一行从右往左数,第二个位置,因为第一个位置被(2^{max-1})放了)

    我们考虑在除了右下方的地方进行乱搞,得到(2^{max-2}),然后就可以进行合并(2^{max-2} imes2;to;2^{max-1},2^{max-1} imes2;to;2^{max})

    至此,整体思路分析完毕。

    具体细节

    首先明白移位的意义是什么

    移位并不是瞎动,每一步都有每一步的作用,每一步都要顾全大局,每一步都是为了合并出更大的max而做基础。

    考虑具体每一步怎么走

    开局随便玩,尽量把最大值往右下方堆积起来,闭着眼睛几乎都可以完成的事情。

    我们希望的是当前的最大值永远在最下最右的地方,所以每一步都要保证最大值没有移位

    也就是说,慎用或者可以的话,不要用左移和上移,考虑左移的影响,极其有可能是你当前的最大值,到了属于当前次大值的位置,然后在本属于最大值的位置,冒出了一个2;考虑上移的影响,极其有可能是在你最大值的下方新冒出来的2占据了当前最大值的位置,如果出现以上两种情况,基本上是GG了,对于前者有一种补救办法叫做“围魏救赵”,文章末尾会提到

    为什么要上移?

    假如说你把最下层的8个格子刚好占满,且刚好无法合并,并且没有多余的格子,这时候你无论左移还是右移都是无效的,你只能上移(有一次我最底下依次是({4096;2048;1024;512;256;128;64;32}),但是没有办法,不得不上移,于是我就GG了)

    为什么要左移?

    • 1.最后一行没有补齐(也就是有空位),并且当前你再怎么右移也无法进行合并,因此就需要左移(这就是上文提到的风险情况)
    • 2.如果最后一行是补齐的,并且左移之后,你会合并某些项数,意味着你在合并之后,会出现空位,也就有可能成为上文提到的风险情况,有个技巧叫“延迟合并”在大多数情况下会避免这种合并之后出现空位乃至GG的尴尬,文章的末尾会提到这些的

    每次移动,尽量下移,这样大多数情况下可以保证你不需要上移,尽量右移,保证你不需要左移

    如果在你可以下移可以右移的情况下,大多数选择尽量下移,因为上移可能带来的风险更大,且补救成功的概率为零

    相比左移带来的影响,就要小一些,大多数情况可以补救成功(在最大值小于等于1024的时候概率最大).

    “围魏救赵”:

    设当前的右下方的的数为(x)

    考虑把当前的(x)培养成当前最大值,就可以和(x)右边的最大值进行合并

    于是我们只能在靠右的一两列作为(x)的“移位储备资源库”,每一次都必须使得(x)上面的数和当前右下方(x)一样,然后可以合并

    合并时保持如此原则:能向右合并,尽量不向左;能向下合并,尽量不向上

    当能向右和向下的时候,我们选择向右,因为向下有概率和底层(x)旁边的数进行合并,而不是(x)(注意区分与上文的区别)

    “延迟合并”:

    在当前这一行可以合并的时候,我们先不去左移或者右移,先尽量下移,使我们有足够多的储备合并块(就是一些零散的2,4,8之类的),然后再左右移合并,可以大大降低自己出锅的概率,具体原理读者自证不难

    关于配图,日后会补上的

    结语

    因为2048每次移位后出现的2与4都是随机化的,因此无法设计出一种完美无缺的算法,达到(2^{16})

    只能通过一些技巧来规避,但是无法避免失误,难免会在你成功前的一瞬间,出现一个不速之客“2”,使你顿时GG。

    于是你就很抓狂,恼怒,生气!

    而游戏所吸引我们的,不正是如此吗?

  • 相关阅读:
    maven工程下添加oracle驱动包
    面试题----入参两个Integer,无返回值,然后使这个两个值在调用函数后交换
    使用spring data solr 实现搜索关键字高亮显示
    MyBatisPlus忽略映射字段注解
    Linux下Solr单机版、集群版安装与配置
    AngularJs实现全选功能
    SpringBoot2.0整合mybatis、shiro、redis实现基于数据库权限管理系统
    springboot2.0集成shiro出现ShiroDialect报错找不到AbstractTextChildModifierAttrPr
    linux下ssh远程登录服务器入门操作
    英文邮件寻求帮助的礼貌用语
  • 原文地址:https://www.cnblogs.com/yszhyhm/p/13489707.html
Copyright © 2020-2023  润新知