浅谈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}\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。
于是你就很抓狂,恼怒,生气!
而游戏所吸引我们的,不正是如此吗?