【英雄联盟】人数与战力的基本关系
在现实中,设想A同时与B、C打斗,相比B、C对A进行车轮战,A想要获胜显然是更难的,那么为什么呢?
最简单的解释就是,因为B、C同时进攻,他们在每个时间单位内对A造成的伤害是车轮战情况下的两倍,他们的战力更强。
那么,战力又是什么呢?这是一个很笼统的说法,我们在此没有必要纠结它到底是什么,因为本文的主题是英雄联盟(LOL),因此我们用“全歼”敌方后胜方的剩余人数来描述战力,无论是小兵还是英雄之间。
接着,为了简化这个问题,我们只考虑每个人的攻击力(在每个时间单位内对某个敌方目标造成的血量损失)和血量,并记作攻击力-血量,如1-3就是指攻击力为1,血量为3的一个作战单位(类似一些卡牌游戏的记法)。
并且,我们在此先假设每个人的攻击力-血量数值完全相同,并且双方同时攻击,同时结算。
对于开头所说的情景,我们假设它们均为1-2。
同时(的战斗过程/情况):
1-2 1-2 1-2
1-0 1-1 1-2
车轮战:
1-2 1-2|1-2
1-0 1-0|1-2
(当然,这里的时间指的并不是离散的,或者说按回合的,比如两个人的对战中完全有一个瞬间可以是1-3.5 1-1.5)
结果当然不出意料,那么接下来我们由浅入深地去深究其中的原因。

整体
最简单的一种思考方式,就是将一方所有人的数据相加,看作一个整体来进行分析。
比如对于a个m-n和b个m-n,我们将它们看作am-an和bm-bn之间的对战。
当然,这种简化的问题也是显而易见的,因为人数减损之后,整体的攻击力显然会下降。

不过,我们还是暂且先去这么思考。
我们假设a>b,那么胜方显然是a方,且获胜的时间等同于b方血量耗尽的时间,那么
当然,还需对其向下取整才是具体的人数;不过,这也只是对实际情况的一种简化,我们可以认为剩余人数大概在这个值左右。
比如,2对3,敌方大概剩余5/3≈1.67人,5对3,我方大概剩余16/5=3.2人。
同时,我们可以注意到
也就是说,按照这种整体的思想,a对b(a>b),a方会损失b^2/a^2的血量。
比如2对3,敌方会损失4/9的血量,5对3,我方会损失9/25的血量。

连续
接下来,我们就把“人数减损之后,整体的攻击力会下降”这一点考虑进去。
在上面的简化中,双方整体的攻击力是始终不变的,都是人数乘以个体的攻击力,但现在攻击力与生命值挂钩,生命值又和对方的攻击力挂钩。
那么,我们以时间t为基准,设双方人数关于时间的函数各自为
且
由简单的“高数”知识可以得到
两式相除得到
而我们要求的是y(t1)=0时,x(t1)的值,也就是a方的剩余人数,对两边积分得到
那么5对3,我方大概会剩余4人,显然大于前面的3.2人。
也就是说,当b<<a的时候,二者是相近的;不难理解,因为此时b方的攻击力相比a方的血量太小了,它的变化可以忽略不计,同时b方的攻击力对a方的血量造成的损失也可以忽略不计,因此a方的攻击力也几乎没有变化。

攻击力的离散化
在第一种方法中,我们忽略了攻击力的变化,在第二种方法中,我们认为攻击力的变化的连续的,但实际上,攻击力的变化是离散的。
不难理解,在英雄联盟中,我残血和我满血时的“攻击力”实际上可以近似认为是完全一样的。
我们来看下面这个例子。
例1:
1-4 1-4 1-4 1-4 1-4 1-4(经过1个单位时间)
1-2 1-4 1-4 1-4 1-0 1-4(经过1个单位时间)
1-1 1-4 1-4 1-4 1-0 1-0
(不难理解,至少在每个人的攻击力-血量数值完全相同的情况下,集火显然是最优策略,因为这是使对面攻击力下降得最快的策略)
左边的剩余血量为13,但按照第一种方法,4-16 2-8,血量为为16-8/4*2=12;第二种方法则为4*sqrt(16-4)≈13.86。
不难理解,13>12是因为右边减员了,攻击力下降,对左边造成的伤害减少,而第一种方法并没有考虑这一点;13<13.86是因为在这两段1个单位时间中,右边的攻击力总是为2和1,并没有按第二种方法的假设每时每刻都按比例减少,同时左边的攻击力变化相比之下并不大,因此右边对左边造成的总伤害会变高。
换句话说,就是对于am-an和bm-bn,双方每受到n伤害就会损失m攻击力。
因此,对于这种方法,我们需要比较双方到达各自n倍数伤害的时间点来考虑,其中的计算时比较复杂的;并且我的数学知识也比较贫瘠,再加上我没有那么多时间,对于这种情形,就当作抛砖引玉了。
例2:
1-4 1-4 1-4 1-4 1-4 1-4 1-4(经过1个单位时间)
1-1 1-4 1-4 1-4 1-0 1-4 1-4(经过1/2个单位时间)
1-0 1-4 1-4 1-4 1-0 1-2 1-4(经过2/3个单位时间)
1-0 1-8/3 1-4 1-4 1-0 1-0 1-4(经过4/3个单位时间)
1-0 1-4/3 1-4 1-4 1-0 1-0 1-0

时间的离散化
可以看到,攻击力的离散化使解决问题的过程中会出现许多繁琐的分数形式,并且其中可能会出现一些过于小的时间量,它们也是不符实际的,因此,我们尝试再加上时间的离散化,也就是按回合(1个单位时间)来计算。
那么例2就变为
例2':
1-4 1-4 1-4 1-4 1-4 1-4 1-4
1-1 1-4 1-4 1-4 1-0 1-4 1-4
1-0 1-3 1-4 1-4 1-0 1-0 1-4
1-0 1-2 1-4 1-4 1-0 1-0 1-1
1-0 1-1 1-4 1-4 1-0 1-0 1-0

伤害溢出
在前文中,我之所以假设个人数据为1-4,是因为1能够整除4,如果是2-3,那么对他的最后一击,攻击者会有1点伤害是溢出的;当然,你也可以假设这一点伤害可以延续到下一个人来简化问题,但考虑溢出显然是更符合实际的。
如果不考虑溢出
例3:
2-3 2-3 2-3 2-3 2-3
2-0 2-2 2-3 2-0 2-0
如果考虑溢出
例3':
2-3 2-3 2-3 2-3 2-3
2-0 2-3 2-3 2-0 2-1
2-0 2-1 2-3 2-0 2-0

策略相关
我们在前文中提到过一个策略,也就是集火,它在我目前的假设下显然是双方的最优策略;但实际情况下,集火往往也会存在额外的溢出,比如可以是一次攻击,甚至极端一点,所有人都必须攻击这个单位,它就不再是最优策略了。
我们也可以随便想到许多简单的策略,比如随机攻击,优先不产生溢出的随机攻击等等;
如果再去除“每个人的攻击力-血量数值完全相同”这个假设,策略就更丰富了,也会随之产生许多博弈。
比如对于没有额外溢出的集火而言,
集火低血的单位可以快速减少敌方的攻击力,也可以减慢我方的血量和攻击力损耗等等;
而集火高攻高血的单位需要花费多个回合,即便这个行为对此后回合的收益是更大的;
…………
对于这些策略的选择,我们就需要去权衡利弊了,并且它们在不同的具体情况中互有胜负,很难存在一个通用的最优策略。
例4:
1.(双方都优先使对方减员)
2-1 3-5 1-1 3-6
2-0 3-2 1-0 3-3
2-0 3-0 1-0 3-0(平局)
2.(1调整为左边优先集火强力单位)
2-1 3-5 1-1 3-6
2-0 3-2 1-1 3-1
2-0 3-0 1-1 3-0(右胜)
3.(1调整为右边优先集火强力单位)
2-1 3-5 1-1 3-6
2-1 3-1 1-0 3-3
2-1 3-0 1-0 3-0(左胜)
4.(双方都优先集火强力单位)
2-1 3-5 1-1 3-6
2-1 3-1 1-1 3-1
2-0 3-0 1-0 3-0(平局)

不难理解,基于这种情况,双方最理性的选择都是优先减员,因此结果也“注定”是平局,也因此不这么思考的人在作出选择时会很吃亏。
当然,我举的这个例子过于简单了,对于更复杂的情况下,存在无穷无尽的策略,更不用说引入先后手了。
可以发现,比如假设我们可以精确地控制每一个棋子等等,基于这个相对简单的问题,再加上各种各样的“机制”去增加其复杂程度,那么就逐渐发展为了一些我们所熟知的卡牌游戏、棋类游戏等等,它们在本质上当然也是“数字游戏”。
关于博弈和游戏等等的更详细的内容可见我的专栏:

纯纯干货!
当然,即便有些脱离,但本文的内容还是基于我对英雄联盟这款游戏的一些思考延伸而出的(可能会更适合RTS游戏,虽然我完全没有玩过这类游戏),同时我觉得本文中的一些思维在英雄联盟的各种地方也都是通用的。
之后,我还会制作一些英雄联盟中机制相关的一些内容,敬请期待!