2048最高分

我来写个带推导过程的答案吧。2048的玩法就不赘述了,先来看看相关的规则,因为是Gabriele Cirulli让这个游戏火起来的,以他的源代码为准(Gabriele Cirulli的版本的地址: 2048 )。

记分规则 :在 2048/game_manager.js at master · gabrielecirulli/2048 · GitHub 中的167行:
self.score += merged.value;
分数就是累加游戏过程中新合成方块的数值。

新方块出现的规则 :在 2048/game_manager.js at master · gabrielecirulli/2048 · GitHub 的71行:
var value = Math.random() < 0.9 ? 2 : 4;
新方块的取值集为{2, 4},其中4出现的概率是0.1。

题主的第一问: 如果到2048不继续,那么最高分是多少?
2048肯定是由两个1024合成的,所以在合成2048的这一步,记分是2048,同样1024也是由合成得到的,所以在得到两个1024的这两步,积分是1024*2=2048,以此类推,在>4的情况下,每一步分解的逆过程都会积2048分。注意到题主问的是理论最高分,我们当然希望尽可能多的合成新方块,所以不希望4是直接生成的,应该都是由2合成的。假设题主运气足够好,玩的过程中出现的新方块都是2,那么基于以上推导,从2一路合成到2048,理论上的最高分为:
\[2048\times \left( {​{\log }_{2}}\left( 2048 \right)-{​{\log }_{2}}\left( 2 \right) \right)={​{2}^{11}}\times \left( 11-1 \right)=\text{20480}\]
对于任意从2开始合成的 \[{​{2}^{N}}\] 这个公式可以推广为:
\[{​{2}^{N}}\times \left( N-1 \right)\]

题主的第二问: 如果继续,那么最高分是多少?
要回答这个问题首先要来看2048理论上能达到最终布局是怎么样的,假设能达到的最大的数值为 \[{​{2}^{N}}\] ,那么在最后一步合成 \[{​{2}^{N}}\] 时一定是占两格的两个 \[{​{2}^{N-1}}\] ,那么对这两个 \[{​{2}^{N-1}}\] 做最小的展开,也就是保持一个不变,另一个展开为两个 \[{​{2}^{N-2}}\] ……如下所示:
\[{​{2}^{N}}\xleftarrow{\text{merge}}{​{2}^{N-1}},{​{2}^{N-1}}\xleftarrow{\text{merge}}{​{2}^{N-1}},{​{2}^{N-2}},{​{2}^{N-2}}\xleftarrow{\text{merge}}\cdots \xleftarrow{\text{merge}}{​{2}^{N-1}},{​{2}^{N-2}},\cdots 16,8,4,4\]
所以依次类推如果要合成 \[{​{2}^{N}}\] ,则需要一直展开一个相邻的方块序列直到游戏能产生的方块值,其中序列长度由要展开的级数的初始值决定,比如要展开到 \[{​{2}^{N-M}}\] ,则需要的序列长度是 \[M+1\] ,因为游戏一共16个格子,所以 \[M+1=16\] ,则 \[M=15\] 。考虑到需要最大值,所以认为在这样一个序列中,游戏产生的方块是两个4,那么 \[{​{2}^{N-M}}={​{2}^{N-15}}={​{2}^{2}}=4\] ,则 \[N=17\] ,所以游戏能达到的方块最大值是 \[{​{2}^{17}}=\text{131072}\] 。同样道理,当一个131072已经产生之后,还剩下15个格子,那么这种情况下能产生的最大值为65536,依此类推,14个格子能合成的最大值是32768,……所以理论上最大值的情况一定是前15个格子的值依次为 \[{​{2}^{17}},{​{2}^{16}},{​{2}^{15}},\cdots ,{​{2}^{4}},{​{2}^{3}}\] ,也就是 \[131072,65536,32768,\cdots ,16,8\] ,而最后一个格子是2或者4。前面好多答主也贴过最后的局面,我这里也贴一例(图用我自己写的 蛋疼99行代码Python版2048 画的):

因为最后一个4或者2是游戏产生的,所以不计入积分,所以所有的积分都来源于从8到131072的15个数字。回想在第一问里得到的从2开始合成 \[{​{2}^{N}}\] 的公式,那么似乎最高分应该是N=3,4,5,...,16,17对应的积分的总和,也就是
\[\sum\limits_{K=3}^{17}{​{​{2}^{K}}\times \left( K-1 \right)}=\text{3932160}\]

这个答案前面有几位答主也提到过,然而,这个答案是不对的,原因就是上面我关于合成数值的最小格子数占用的分析,当65536合成之后,从2开始合成一个数值需要的最少格子数超过了可用格子数了。比如我们考虑要合成两个65536的情况,也就是第一次合成出131072的情况,如下图:

这是合成出131072必经的一步,注意最左上角的4,这个4显然不可能是由2合成的,而是游戏直接生成,因为对于131072,从4开始合成最少需要的格子数是16,所以只有在需要合成的值是65536或者以下时,我们才有可能从2开始合成出所有的数值,也就是说对于2048这个游戏,只有当 \[N\le 16\] \[{​{2}^{N}}\times \left( N-1 \right)\] 才成立。也有其他答主发现了这个问题,所以有答主说,多算了一个4,答案是3932160-4=3932156;另有答主说是3932152,也许考虑的是多算了两个4的情况;然而这几个分数都是无法得到的,关键就在于 要产生多少个值为4的方块,那么最后就得从3932160的分数里减去多少个4

那么什么时候需要游戏必须产生4呢,我们再回到前面关于产生一个数值需要序列长度的推导:前面得出的结论是要展开到 \[{​{2}^{N-M}}\] ,则需要的序列长度是 \[M+1\] ,因为我们希望合成次数尽量最大化,所以要展开到 \[{​{2}^{N-M}}=2={​{2}^{1}}\] ,则需要的格子数目为 \[M+1=N\] ,所以在 \[{​{2}^{17}}=131072\] 出现前,任何数字都不会需要16个以上的格子,所以也就不需要4的出现。而当需要合成131072时,需要17个格子,而整个游戏只有16个,所以就不能从2开始合成了,于是这是第一次需要4的情况。当131072已经出现后,可用格子的最大数目是15了,这时候合成 \[{​{2}^{16}}=65536\] 也需要一次4了。当65536合成之后,可用格子最大数目变为14,这时候32768的合成也需要产生一个值为4的方块了……于是依次类推,当16合成之后(也用到了新产生的值为4的方块),为了合成8,最后一次由游戏产生了4,也就是下图:
所以从8到131072,一共15个数字在最后合成的过程中需要4的出现,也就是说理论上能达到的最高分数是:
\[\text{3932160-4}\times \text{15=3932100}\]
这个答案前面一位答主应该也提到过,虽然没有推导过程。

当然了,这个毕竟是理论最高分,实际操作起来,几乎是无法达到的,通过不断的悔棋和坚强的毅力达到我前面提过的最终局面也许并不难,但是2和4出现的比率是9:1这点是无法通过悔棋改变。不妨大概估算一下,对于 \[{​{2}^{N}}\] 可以算出需要 \[{​{2}^{N-1}}\] 个值为2的方块,那么对于最终局面,如果不考虑格子数目对生成4的限制,则一共需要:
\[\sum\limits_{K=3}^{17}{​{​{2}^{K-1}}}={​{2}^{17}}-{​{2}^{2}}=\text{131068}\]
这么多值为2的方块,减去最后15个必须的值为4的方块,并考虑由于10%的4会生成,并且一个4等价于2个2,所以实际游戏当中玩到最终局面平均生成的方块数目为:
\[\left( 131068-15\times 2 \right)\div 1.1\approx \text{119125}\]
则值为4的方块平均数目约为11915,所以少产生的分数为:
\[\text{11912}\text{.5}\times 4\approx \text{47650}\]
也就是说如果玩到了理论上方块值最大的情况,平均分大约会是
\[3932100-47650=\text{3884450}\]
考虑到4出现的过程是个服从泊松分布,而在数目这么大的情况下可以用高斯分布来近似,如果很不严格地忽略掉4出现得涨落对总方块数目的影响,则有
\[\sigma {​{N}_{4}}\approx \sqrt{11915}\approx \text{109}\]
所以大部分分数会落在以下范围:
\[3884450\pm 3\times 109\times 4=3884450\pm 1308\]
我大概在网上搜了一下,发现玩到最终局面的大都分为两种情况,一种是和我推导的一致在3884450左右的分数,还有一种是在386????附近,是因为Practice mode积分方法不同?版本不同?还是什么别的原因,不太清楚了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值