2048曾经很受欢迎。每个人都玩了它,很多人发布了很好的截图和他们的成就(我自己)。然后在某些时候我开始怀疑是否有可能告诉别人玩多久才能达到那个分数。我进行了基准测试,结果证明(至少在我的Android应用程序上),一秒钟内只能进行一次移动。因此,如果你玩得足够长(并且足够快),你所做的动作数量就非常接近于你玩过的秒数。现在的问题是:是否可以使用2048游戏的屏幕截图来计算制作了多少动作。
这是一个示例屏幕截图(实际上我到目前为止我最好的努力):
从屏幕截图中,您可以看到当前时刻的场地布局以及玩家获得的积分数。那么:这些信息是否足以计算我已经做了多少动作?如果是这样,算法是做什么的呢?
注意:我想提醒您,只有当两个瓷砖和#34;组合时才会对积分进行评分。并且得分的数量是新瓦片的值(即被组合的瓦片的值的总和)。
答案 0 :(得分:12)
简短的回答是,可以仅使用此信息计算移动次数。我会解释算法来做到这一点,我会尝试在步骤中发布我的答案。每个步骤都将是一个旨在帮助您解决问题的观察。我鼓励读者在每次提示后单独尝试解决问题。
观察第一:每次移动后,只出现一个图块。这个图块是4或2.因此我们需要做的是计算出现的图块数量。至少在我玩的游戏版本中,游戏总是以2个瓦片开始,其中2个随机放置。
我们不关心该领域的实际布局。我们只关心它上面的数字。当我解释算法时,这将变得更加明显。
查看字段中单元格中的值,我们可以计算在每次移动后出现2时的分数。称该值为twos_score
。
出现的四个数等于twos_score
和actual_score
之差除以4.这是正确的,因为从两个2-s形成4我们将有获得4
分,而如果4分直接出现,我们得分0
。拨打四个人fours
。
我们可以计算出在场上形成所有数字所需的两个数量。之后,我们需要从此值中减去2 * fours
,因为单个4替换了两个2的需要。请拨打此twos
。
使用这些观察我们能够解决问题。现在我将更详细地解释如何执行单独的步骤。
我将证明,要形成数字2 n ,玩家将获得2
n
*(n - 1)
分(使用诱导)。
2
k
*(k - 1)
2
k
*(k - 1) + 2
k
*(k - 1) + 2
{{1 } (组合的两个数字的分数加上新数字的分数)。 k+1
2
k + 1
*(k - 1) + 2
k+1
= 2
k+1
* (k - 1 + 1) = 2
k+1
。这完成了归纳。 因此,如果只有两个人出现,我们需要迭代棋盘上的所有数字,并使用上面的公式累积我们得到的分数。
更容易注意到形成* k
2
所需的两个人数是n
2
。可以使用归纳法再次进行严格的证明,但我会将其留给读者。
我将在n - 1
中提供解决问题的代码。但是我没有使用任何语言特定的东西(来自c++
的appart,它只是一个动态扩展的数组)所以它应该很容易移植到许多其他语言。
vector
现在回答我们已经进行了多少次移动,我们应该添加此函数返回的对的两个值,然后减去两个,因为两个具有2的tile直接出现。