通过2048游戏界面推断其应得分
2048 是最近热门的一款游戏。在4×4的方格界面上,通过上下左右移动来将相同数字的方块合并,数字相加,获得一2048方块者获胜。在移动一次后,空白处随机出现一值为2或4的方块,如没有空白且无可合并方块,玩家输。已知出现方块2的概率为90%,且得分为每一次合并后所获得方块数值之和,问给定一游戏画面,如何判定其真伪?
解:每一个方块都是由2或4方块累加而得,所以只需求出每一个方块应得分之和,即可判断得分是否在应得分范围内。
如 16=8+8=4+4+4+4,4=2+2。所以要得到 16,就有至少 16×2=32 的分数。而如果生成的方块全是 2,则有 16×3=48 的分数。一般地,要得到方块数字 a,最少得分(全部生成 4)为 a(log2a − 2) (a = 2 时为 0),最多得分(全部生成 2)为 a(log2a − 1)
所以最终得分不能低于每一块最小分值之和,不能高于每一块最大分值之和。观察分值是否在此范围内即可得知是否真实。
再考虑概率问题。有 10% 概率的方块 4 是直接出现的,得 0 分。所以得分的数学期望应为:
a(log2a − 2) + 0.9a = a(log2a − 1.1)
Python 程序:
from math import log
def score(*values):
cmax = lambda n: n*(int(log(n, 2)) - 1)
cmin = lambda n: n*(int(log(n, 2)) - 2) if n > 2 else 0
cavg = lambda n: n*(int(log(n, 2)) - 1.1) if n > 2 else 0
return (sum(cmax(i) for i in values),
sum(cmin(i) for i in values),
sum(cavg(i) for i in values))