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}\times2\;to\;2^{max-1},2^{max-1}\times2\;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。

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

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

java 2048思路_浅谈2048相关推荐

  1. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  2. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  3. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  4. java list数组排序_浅谈对象数组或list排序及Collections排序原理

    常需要对list进行排序,小到List,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List进行排序,继而讲到Collection ...

  5. java缓存同步_浅谈JSON的数据交换、缓存问题和同步问题

    JSON轻量级的数据交换格式 相对于XML来说,JSON的解析速度更快,文档更小. JSON的格式 {属性名:属性值,属性名:属性值,--} 属性名的类型可以是string,number,boolea ...

  6. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  7. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  8. java扫码枪键盘_浅谈在react中如何实现扫码枪输入

    触发原理 原理就是监听键盘输入,比如扫一个为6970596130126的69条形码,用扫码枪扫一下会在光标位置依次输出: 6 9 7 0 5 9 6 1 3 0 2 6 但这不是完整的,所以需要写一个 ...

  9. java并发计数器_浅谈java并发之计数器CountDownLatch

    CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么拆分也是便于记忆=_=) 可以理解这个东西就是个计数器 ...

  10. java comparable接口_浅谈程序接口

    · 为什么需要接口?接口和抽象类的区别? 接口就是比"抽象类"还"抽象"的"抽象类",可以更加规范的对子类进行约束.全面地专业地实现了:规范 ...

最新文章

  1. 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战
  2. 栈的应用2---后缀表达式
  3. 继卡巴斯基后 赛门铁克网站被爆亦有SQL注入缺陷
  4. JAVA生产环境验证_Java生产环境下性能监控与调优详解
  5. AntDesignPro一次添加多条数据的表单字数限制,并且把input框变为可变文本框
  6. 外媒:苹果已有条件批准京东方为iPhone 13供应OLED屏幕
  7. 小甲鱼python课后题简书_MOOC_Python语言程序设计(嵩天)课后练习_第二周
  8. 深圳最新10区地图划分JSON
  9. Java中银行转账的一些问题
  10. 解决在局域网内QQ传文件慢的问题(转)
  11. 第九节 html特殊文字符号
  12. word怎么删除最后一页空白页
  13. 灯神动态规划(Dynamic Programing)学习笔记 打劫问题 凑整问题 背包问题 例题+原理+源码超详细讲解
  14. android竖屏固定,ANDROID强制锁定竖屏_APP固定设置竖屏或横屏
  15. python openpyxl模块 合并单元格,设置行高,列宽,边框,居中,字体样式
  16. 详解PHP设置定时任务的实现方法
  17. CNCC 2017大会第一天,邱成桐,梅宏,沈向洋,李飞飞,汤道生,马维英都讲了什么?...
  18. 2022年04月 微信小程序-富文本和文本的使用
  19. 【NB-Iot自我学习之路_3】NB平台介绍【电信篇】+【移动篇】
  20. npm安装windows-build-tools时卡在Successfully installed Python 2.7

热门文章

  1. hiberfil.sys文件过大
  2. 华中科技大学计算机二级成绩,华中科技大学2017年计算机水平测试(软考)报名通知...
  3. shopnc 设置mysql_shopnc 手机网站配置
  4. Ant Design Pro 使用Authorized组件做权限验证
  5. 计算机字长 按字编址,按字节编址与按字长编址区别及原理图解分析
  6. C语言中 1%3,算术什么意思啊 算数什么意思
  7. UTI ( Uniform Type Identifier )
  8. 【黑马程序员pink老师前端】HTML
  9. 新混响预设合集 – Audio Ease Altiverb 7 New Impulse Responses
  10. Javascript使用三大家族和事件来DIY动画效果相关笔记(四)