欢迎光临散文网 会员登陆 & 注册

炉石溢出和最值研究

2019-12-17 22:53 作者:土豆滴滴答答  | 我要投稿

【真】叠最厚的甲,【真】挨最毒的打。实验了各种溢出:血上限、攻击力、生命值、治疗量、伤害值、护甲值。并得出结论。

(本文转自旅法师营地,是同一作者。原文链接https://www.iyingdi.com/web/article/search/68309)

简介

大家好,我是辣鸡土豆,是之前“暗影狂乱计算器”的作者。(https://www.iyingdi.com/web/bbspost/detail/1806541)

众所周知,炉石里的数值是有限的,当你企图通过周卓刷翻倍生命值,到达21亿左右的时候,再增加就会归零。我们称之为“溢出”了。本文介绍什么是溢出、为什么会溢出,并结合实例分析多种溢出方式。

如果你对原理不感兴趣,只希望看看溢出爽一下,可以直接看B站视频。https://www.bilibili.com/video/av40449869

结论

由于大部分人可能对原理并不感兴趣,先说实验结论:

1.炉石传说里大部分数值是int32(关于什么是int32,可以阅读“什么是int32”部分)

2. 如果变量可以是负数,int32超限时按补码溢出,但显示为0 (关于具体溢出方式,可以看“什么是溢出”部分);如果变量不允许是负数,溢出置零。(攻击力允许是负数,法力消耗允许,生命值允许,已损失生命值不允许,生命上限不允许,护甲不允许。)

3.显示零攻击的单位无法攻击,零点血量的单位直接结算死亡。显示为0的负数,只有在加减等数值运算时,按负数运算,但负数总显示0。

 

如果你没有看懂上述3条,可以先看下文例子。

 

名词定义

(为什么这样定义见原理部分)

随从双维、随从身材:指随从的攻击力和血

炉石上界: 炉石传说中,最大的整数,即2147483647

炉石下界:炉石传说中,最大的整数,即-2147483648

Int32:32位有符号整型数

 

数值溢出实例分析

1.血量上限溢出

实验:使用神圣之灵不断翻倍随从血量。

现象:随从血量不断上涨,直到超过炉石上界的时候,归零。并立即结算随从死亡。

 (这个事情大家应该都知道,不放图了)

实验:对血量上限是炉石上界的随从使用香蕉。

现象:随从血量归零。并立即结算随从死亡。

 

推测结论:炉石变量是int32


2.护甲值溢出

实验:一个叠甲到炉石上界的战士,再叠两点护甲。

现象:最厚的甲再girashi的咆哮中变成了零护甲。

结论:护甲值是非负的,非负值溢出置零。

 

叠甲!

 

3.伤害值溢出

实验:用一个双维达到炉石上界的随从,攻击一个装备了诅咒之刃的英雄。(挨最最最最毒的打)

现象:英雄没有受到任何伤害。

结论:伤害值是非负的,非负值溢出置零。

挨打!

4.治疗量溢出

猢狲医者会直接为一个随从回复等于其血量上限的血,效果看起来就好像回满血一样。

水晶工匠坎格尔会让回血效果翻倍。

 

实验:我方场上有水晶工匠坎格尔,一个双维(上限)达到炉石上界的光照元素,光照元素损失了1点生命值。我放打出猢狲医者,为光照元素回复到满血。

现象:猢狲医者回复0血。

推测:治疗量本等于炉石上界,翻倍后溢出,溢出归零。因而回复0血。


5.攻击力溢出

实验:使用神圣之灵使得随从生命值正好达到炉石上界,并使用心灵之火使得随从攻击力等于血量。然后用叫嚣的中士增加攻击力使攻击力+2,溢出。

现象:随从双维均达到最大,攻击力+2后,随从攻击力显示为0。回合结束后,随从攻击力-2,并变回了原数值。

分析:见实验原理,溢出部分。

推测结论:攻击力是可以为负数的,不会因为溢出(不是正数了)而清零。

相关现象:被虚弱诅咒到负攻击的随从,在加攻击力依然可能显示为0。



损失血量溢出

实验一:对一个已经损失了2点生命的紫罗兰法师造成等于炉石上界的伤害。

现象:紫罗兰法师回复到了满血。

推测:(2^31-1)+2>2^31-1,推测炉石传说计算随从血量时维护两个数据,一随从的血量上限,二已损失血量。已损失血量超过炉石上界时自动置为零,看起来就像没有损失生命值一样。

 

实验二:对一个满血的紫罗兰法师造成等于炉石上界的伤害。

现象:紫罗兰法师正常扣血,死亡。

推测:已损失血量没有超过上界,所以不溢出,正常。

 

战斗前

战斗中
战斗后


实验三:同理对地狱咆哮重复上述2个实验。

现象:英雄结算和随从一样。

小光头会回满血

 

小光头会死


结论:受到伤害时,炉石代码里可能是先计算“已损失血量”,如果不溢出,则当前生命值=生命上限-已损失血量;如果溢出,由于“已损失血量”的非负性,则置零,然后,当前生命值=生命上限-已损失血量,所以回满血。

什么变量可以刷到溢出?

指数增加具有极高的效率。手动+X/+X刷,刷到地老天荒也刷不到炉石上界。

炉石里部分数值

理论上来说所有变量都可以刷到溢出(需要先配合无限时间)。只是有翻倍的道具的变量刷到溢出容易一点。如血量翻倍神圣之灵,攻击翻倍受祝福的勇士。或者间接翻倍心灵之火等等。

 

 

实验原理

说明:如果对原理不感兴趣,或者已经学过,请直接跳过。

如果你想也做一遍实验,或者想搞清楚,那么请全部阅读“实验原理”。

原理部分假设你已经学会高中的等比数列、指数运算等相关知识。

1.什么是二进制

简单的来说我们中小学学习的数字叫“十进制”,就是逢十进一,这主要是因为人有10个手指。0数到9,在数就不够用了,于是要“进位”,变成10,我们定义它比9多1。十进制里1021=10^3+2*10^1+10^0,每高一位代表的数乘十。同样类比,二进制里是这样数数的:0,1,10,11,100,101……逢二进一,二进制的10001表示十进制的2^4+2^0=17。

下文中,不做特意说明的地方,默认十进制,如果是二进制,会在末尾加B,例如“1000 0000B”。

 

2.什么是补码、什么是int32

因为计算机只能存储0101,所以整数在计算机里存储时,需要限定格式。补码就是大部分整数在计算机里的格式,如果一个整数i,在计算机里占用8位(8bits=1B)那么补码的规定如下:

  • 第一位0表示非负数,1表示负数

  • 非负数后7位表示大小,例如0000 0001B=1、0111 1111B=127、 0000 0000表示0。

  • 负数加对应的正数,应该和是1 0000 0000B。例如-1=1111 1111B,那么-1+1=0表示为:1111 1111B +0000 0001B = 1 0000 0000B(简单的二进制加法,逢二进一,列竖式),由于计算机只能存储8位,所以“1 0000 0000B”的最高位1,被计算器舍弃了,达到了-1+1=0的运算。

  • 特殊规定:“1000 0000B”表示-2^7=-128

8位的-1

8位补码数据范围:[-128,127] 共2^8=256个数


 

对了,你需要在程序员模式下使用

Int32就是32位的补码,数据范围 [-2^31,2^31-1] = [ -2147483648, 2147483647],所以我们称这2个最值为:炉石下界、炉石上界


3.什么是溢出

溢出发生在当数据大小超出内存可以表示的范围时。例如,你让一个已经是炉石上界(2147483647)的变量x,再增加1,就会溢出。表现为这个数变成了炉石下界(- 2147483648),这是因为计算机里的二进制数直接相加,加完以后符号位变成了1。同理,用炉石下界减去1,也可以得到炉石上界。

首先选32位,然后把最低的31位都点成1
然后按+1

 

变成了负数,即下界


4.如何达到最大值2^31-1

本处只讨论如何让生命值上限达到2^31-1,心灵之火即可转化为攻击力,其他变量也可以通过各种方法转化。

直接使用神圣之灵是不能达到炉石上界的,为了让生命值达到炉石上界,我们需要复习一下等比数列通项公式:

所以只需要找到一个满血且血上限是2^n-1的随从,然后疯狂让它神圣之灵翻倍、吃香蕉,重复直到达到炉石上界即可!

 

结论复述

不知道你再看一遍这3句话,有没有更深刻的了解了呢?

 

  1. 炉石传说里大部分数值是int32(关于什么是int32,可以阅读“什么是int32”部分)

  2.  如果变量可以是负数,int32超限时按补码溢出,但显示为0 (关于具体溢出方式,可以看“什么是溢出”部分);如果变量不允许是负数,溢出置零。(攻击力允许是负数,法力消耗允许,生命值允许,已损失生命值不允许,生命上限不允许,护甲不允许。)

  3. 显示零攻击的单位无法攻击,零点血量的单位直接结算死亡。显示为0的负数,只有在加减等数值运算时,按负数运算,但负数总显示0。

 

 

 

 

实验感想

土豆的感想

在发了上次的群体狂乱计算器之后,蒸发君联系了我,我们才彼此认识。这个最值实验从我大一学习int32的时候就有想法了,时至今日已经过了2年多了,其间做过多次实验,前后有三四个小伙伴参与,甚至还有了炉石的翻倍的bug被我试了出来(现在没了)。在蒸发君的怂恿和帮助下,我终于做出了完整的实验,并得到了合理的解释。

蒸发的感想

  • 研究炉石的数值比上传说还要好玩/

  • 营地老哥各个都是人才超喜欢这里的

  • Sorry,会点编程真的可以为所欲为。

(本文转自旅法师营地,是同一作者。原文链接https://www.iyingdi.com/web/article/search/68309)

土豆的小伙伴交流群:596948803


剪视频真的累,希望大家多多支持。B站视频:链接



写在最后

本文是毕业前在营地投稿的,此间发生了诸多事情:认识了蒸发等人,混了营地的稿费,被朝菌拉入【炉石科技】,结实茗凰等大佬,学习丟兽,拿到了b站的第一笔钱提现,此后毕业,进入月圆之夜项目组实习,最后回来读研。此间有太多故事和经历,心态也经历了一些变化。之前就有人让我把这个文章转到b站,一直没当回事,现在发了一篇专栏,就顺便转一下。


本文在注明出处并给我留言(b站私信或其他)后,在不侵犯旅法师营地权利的情况下可以任意转载,不需要得到我的授权。




炉石溢出和最值研究的评论 (共 条)

分享到微博请遵守国家法律