王者荣耀的匹配算法与产品设计理念

乐清SEO_产品经理_ 乐清网2021-01-03 转载自:
回顾2017年的全球手游市场,腾讯推出的《王者荣耀》斩获了综合收入第二,下载量第三的成绩,堪称国货之光。这款游戏随着用户流量从PC到移动端转移的大潮不断成长,以MOBA(多人在线竞技)类游戏dota、英雄联盟为范本,并加以移动化轻量化改进,覆盖了更碎片的时间,更广泛的人群。

拿自己举例,在玩《王者荣耀》的这一年多中,不知不觉就打到了王者段位,粗略算来,总游戏时间600-700小时,比今年与朋友相处时间还长。

王者荣耀的匹配算法与产品设计理念-

如果把普通应用看做一台二手奥拓,那手游至少是辆大奔吧,本着造不出大奔就先拆大奔的心态,在对这款应用不断的使用和上瘾中,也试图找到一些产品背后的设计。目前觉得比较有趣的几个部分是:匹配,评分评级,成长流失。

1、玩《王者荣耀》的困扰

不知道在大家玩《王者荣耀》的时候有没有遇到这些困扰:

(1)、排位五连胜之后又来了一波七连跪,是不是系统故意给我比较强的对手?

(2)、排位赛为什么要5个英雄才能玩?匹配赛就不需要阿。

(3)、为什么匹配会遇到黄金玩家,我明明钻石了阿!

相信你看完今天的会对农药的匹配方法有一个比较具体的认知。

在王者荣耀中,最主要的两种游戏模式是匹配赛和排位赛,匹配是5v5标准模式,相当于基本款,排位赛在此基础上会计算等级排名。从最基本的用户需求出发,无论以上那种模式,当某一用户开启一局游戏时,首先需要为他找到4名队友与5名对手,而这9名用户的选择的依据很简单,就是实力相当(我们在这里先只考虑单排的情况,因为双,三,五排出现时变量太复杂)。

2、《王者荣耀》如何去衡量实力相当呢?

可以再简化一下题干:当有两名旗鼓相当的玩家进行对决后,对决结果该如何影响系统对他们实力的判定呢?如果能够定量的回答这个问题,那就非常厉害了。目前这个问题的最优解是由一个叫匈牙利裔美国物理学家Arpad Elo发明的,所以被命名为Elo rating system,它最早被用于象棋比赛中,目前被公认为衡量各类对弈竞技水平的权威评价方案,广泛用于国际象棋、围棋、足球、篮球比赛中,以及英雄联盟、魔兽世界、dota等竞技对战系统中。

Elo算法成立于以下前提:

(1)、每个玩家的表现都符合随机变量的正态分布。

(2)、无论个人在比赛中的表现如何,球员的平均价值都会慢慢增加。

正态分布可以说是统计学中最重要的分布(几乎相当于万金油了),不论考高数还是考概率论,都一定大考特考。上述提到的例子中,任何一名选手的即时表现都是符合正态分布的,因为选手水准的提高是缓慢的,非一蹴而就的,所以代练,作弊都会对系统造成破坏,严厉谴责。生活中类似的例子很多,比如社会收入分布,人群身高分布等等。

第二个条件可以理解为要求玩家主观上都以提升实力为目的,否则整个系统就失去了意义。

3、《王者荣耀》的匹配机制,隐藏分mmr和elo值算法

《王者荣耀》的匹配机制的基本原则也应是基于ELO等级分的模式(根据玩家对战中各方面数据计算出的综合实力积分,该积分适用于个人也适用于多人团队),即尽可能安排双方胜率都最接近50%的对局,并在特定条件下做出匹配时间和玩家实力上一定程度的扩宽。

王者最近的更新加入了玩家的详细对局数据,并以此计算战力值和能力示意图,包括KDA、参战率、每分钟获得金币数、每分钟造成的英雄伤害、每局承受伤害、每局对建筑伤害。这些数据就是对玩家当前实力的综合计算结果,很有可能也会给匹配结果带来一定程度的影响。

值得注意的是,对于手游玩家来说,简化并加速了的MOBA战局固然能带来更多的刺激,但同时也会让挫败感的产生变得更加频繁,粘性本就不低的玩家在遇到过于频繁的挫败体验时,流失的风险非常大,所以王者更多的是注重移动玩家的游戏节奏和游戏体验。

王者的处理方式较特别,是将人机模式隐形混入新手局当中,也就是玩家有时匹配到的真人其实是AI。

这样设计的目的在于保护新手,让新手拥有足够的过程去适应英雄,并降低挫败感。当新手玩家在低等级非排位匹配中连续失败,那么系统会按照玩家等级和连败的频率,给他安排AI对局,让玩家大比分爽赢一局。随着玩家等级提升,这样的福利局会越来越少并最后不再安排,同时福利局不会出现在排位比赛中。

先简单介绍下什么是MMR和ELO,以及为什么我总是排到一些坑货小学生?

(1)、排位是只按当前段位进行匹配。

(2)、匹配是按照每个玩家的实力隐藏分进行匹配,保证对战双方的隐藏总分一致。所以遇到坑队友是自己太强啦!

(3)、实力隐藏分的计算可以搜索下mmr或elo值算法。

MMR(MATCH MAKINGRATING):匹配等级。在系统的核心,每个玩家隐藏着一个被称作匹配等级的数字,或者缩写为MMR。匹配等级用来确保你能够和你的真实实力相近的玩家对抗,并且影响你在赛后能够获得或者输掉多少积分。经过一段时间,你的积分将会逐渐向你的隐藏MMR值靠近,但因为MMR值比起你的积分变化更快,你的MMR值永远不会固定为一个数字。

排位赛的配对方式还是由隐藏的elo值决定的配对机制仍取决于你的隐藏elo,与你所在组别无关,并不是青铜组只能和青铜组的人打,同时你在banpick时的楼层也由elo决定,白银组在1楼,黄金组的人在2楼,这种事也是会发生的。

说道这里,需要对ELO算法进行假设:

某个选手,在某一分段区间内的波动属于正常现象。

在某一分段区间内的选手,水平大致相同,胜出的期望也大致相同。

(4)、如果碰到队友段位比自己高很多的情况,那么说明队伍中有高段位和低段位组队的情况,或者有人段位不高但隐藏分很高的情况。

(5)、关于五排。五排是根据队伍中最高段位来进行匹配的。

4、Elo算法的逻辑解释

ELO等级分即埃洛等级分系统,是指由匈牙利裔美国物理学家阿帕德·埃洛创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估的公认的权威方法。被广泛用于国际象棋。埃洛排名系统是基于统计学的一个评估棋手水平的方法。美国国际象棋协会在1960年首先使用这种计分方法。由于它比先前的方法更公平客观,这种方法很快流行开来。1970年国际棋联正式开始使用这个系统。系统模型原先采用正态分布。但是实践显明棋手的表现并非呈正态分布,所以改进后的埃洛排名系统通常使用的是逻辑斯谛分布。

等级分系统通过计算双方的输赢概率,结合竞技后的结果来不断修正玩家的分数。如果一个较高分玩家赢了,那符合系统的预期,少量分数会从低分玩家方扣除,并加给高分玩家。反之,高分玩家会被扣除相对更多的分数,并把这些分数加给低分玩家。

定量计算:

王者荣耀的匹配算法与产品设计理念

A和B为两名玩家,R代表他们当前的rating,E为预期胜率,所以EA+EB=1。

当比赛结束后,实际胜负值S最多有三种情况,胜(1分),平(0.5分),负(0分)RA’,为一场比赛结束后的新rating:

王者荣耀的匹配算法与产品设计理念

K是一个常量,代表一次比赛对于选手得分的影响程度。较小的K值意味着较小的影响,不同的比赛性质与阶段可以选择不同的K值,国际象棋大师赛中,K=16;大部分游戏规则中,K=32。通常水平越高的比赛K越小,为了避免少数几场比赛就改变选手的排名。以上公式的证明不展开。

举个栗子感受一下:玩家A排位分数2000,玩家B1800,那么A的预期胜率为:EA=75.97%,EB=24.03%,如果在实际的对决中(取k=32),A胜利,则A将收获7.7分,B将损失7.7分;B胜利,则A将损失24.3分,B将收获24.3分。可以发现,不同结果出现时,每位选手的积分变量也不同。

接下来,我们再说说算法特点:

(1)、离散性

Elo 算法只需要知道三个要素即可进行迭代:选手赛前积分,对手赛前积分,比赛结果,计算和理解成本都很低(本质是因为积分操作在公式推导时已经被优化了)。

(2)、初始态的盲目性

Elo rating中新玩家要达到自的合理的积分范围需要较长的时间,这也是算法不断收敛的过程,在实际应用中,我们常会遇见这样的情况:1新玩家,2老玩家开新号。这时我们就需要其他策略来辅助决策定级,如果这一块做的不好,玩家就会觉得对手太强或者太弱,流失率会增高。反观王者荣耀的排位规则中,最低达到6级,最少拥有5个英雄才可以参加,这其实就是一种辅助定级定手段,让系统能够更准确的定位选手能力。

同时,农药的匹配模式是完全按照ELO值匹配队友和对手;排位赛是按照段位水平和ELO值综合评判并匹配的,这也能够解释为什么匹配时你会遇到和自己相差甚至一个大段位的队友/对手了,而排位不会。

当然这个特性也不是全然负面,我们经常看到游戏中代练代打等灰色行业大行其道,如果Elo rating更精确敏感,那作弊就会更容易了。

5、《王者荣耀》的匹配算法是怎么实现的?

沉迷同时,不禁想了解一下王者荣耀的匹配算法是怎么实现的?

看了下一些网友给出的方案,大致步骤如下:

(1)、产生一些预匹配队伍,可能是一个人匹配,也可能是两人,三人先组队再匹配。

(2)、将这些预匹配队伍放入一个HashMap。

(3)、根据预匹配队伍人数分类,比如4人黑店,3人黑店,保存结构为Map<人数,此人数下预匹配队伍List>,称为classifyTeamMap,即为匹配池。

(4)、计算每个队伍中选手的平均积分。

(5)、优先为4人黑店匹配,在classifyTeamMap.get(1)中找与之平均积分最接近的1人进行组队。之后依次为3人,2人...匹配。

(6)、匹配完成后,将队伍ID加入一个已匹配的HashSet中做记录,并没用从匹配池classifyTeamMap中删除匹配完成的队伍。

(7)、小伙伴们基本都找到队友了,选出平均积分接近的两个队伍加入战场。

(8)、敌军还有30秒到达战场...

随之产生的疑问:

(1)、在数据量大的时候,用HashMap作为匹配池是否合适?或者说,这么保存匹配池?用户未登陆的时,信息保存在持久化数据库,但在匹配时,又该怎么保存呢?

(2)、匹配完成后,上诉方法并没有从匹配池中移除该队伍,匹配池会逐渐膨胀。

(3)、正常情况下是一个玩家或者一组玩家点击匹配,就该开始跑匹配算法,即涉及到多线程问题。后果:匹配池不是想清就能清,假设队伍A和队伍B刚好五人匹配上,正要将其从匹配池中移除时,队伍C已读取队伍B信息,正在检查它们是否匹配。这时候一旦移除就是一个妥妥的NPE。况且从HashMap中remove的成本也不低。

(4)、数据量大,耗时小,多线程数据安全,这些都是匹配系统需要解决的问题。

6、实际应用中的问题

匹配算法要达成的目标,是尽可能将水平尽量相当的召唤师放入同一局比赛。匹配算法是基于长期的数据基础,评估出每位召唤师的综合能力。

(1)、为什么王者荣耀不直接使用Elo积分反应玩家水平?(dota的天梯积分就是直接使用的elo积分)

其实这完全是产品经理的小手段,我们会发现当用户的积分稳定下来以后,他对单场比赛的分数增减会越来越无感,这种刺激绝对比不上赢了加星星输了扣星星那么明确和有力,而且将数字转化为文字(黄金白银铂金钻石),更易于传播和理解。本质上,还是对于系统反馈的量化和包装。这也属于我们开头提到的轻量化改进中的一环,产品和用户是互相选择的,天梯积分决定了dota的竞技性,排位段位则让王者荣耀有了普适性,才会被新玩家大群体所接受(具体可查看《》的相关介绍)。

(2)、理论中都是1v1作战,那5v5时该如何进行Elo积分?

就像elo积分本身是一种目前的最优解,复杂变量的处理也有不同的处理方法,具体取决于业务需求,所以以下结论是猜想的,未经证实。

可行的方案可能是:将5名选手的elo 积分的算术平均作为团队积分,再根据不同玩家的单场KDA进行积分加权。但此处并未考虑多人排位的情况,假设出现了直男带妹上分,那以上规则不一定继续适用。而且考虑到不同队伍的排位方式不同,是否还应该进行小团队积分加权?(这些都没有数据支持所以暂不讨论)

(3)、还有什么产品用的了类似算法吗?

其实只要满足Elo rating成立前提的场景就可以套用该算法,可以根据业务的实际需求不断调整参数值使其更好地服务于系统。

举个栗子:FaceMash – Facebook前身,由扎克伯格于2003在哈佛大学的宿舍创建。FaceMash是哈佛版美女评选网站,每次将两张女生照片放置在一起,让用户选择哪一位更吸引人。网站引起了轰动,并获得哈佛大学学生的欢迎。FaceMash曾在第一夜吸引了450位访问用户,产生了2.2万页面浏览量,上线几天后被哈佛大学关停。所以这个公式也出现在以扎克伯格为蓝本的电影《社交网络》中:

王者荣耀的匹配算法与产品设计理念-

(4)、匹配机制和排位机制是独立分开的吗?

其实,王者荣耀的匹配机制和排位机制是独立分开的。

匹配机制是按照玩家的隐藏实力来匹配的,比如有的玩家虽然段位只是个小白银,但KDA评分70+,那就说明这位玩家的实力是很强的。那么匹配的时候就可能会匹配到段位比自己高很多的队友啦。

这就意味着大家可以通过匹配模式检测出自己真实的水平,如果你的段位为黄金却老是匹配到铂金或钻石的队友,那恭喜你,说明你已经有很高的操作水平,上钻石也不是什么大问题啦!

而排位机制又不一样了,是完全按照段位来匹配的。也就是黄金八成会匹配到黄金,钻石八成会匹配到钻石。出现跨几个段位队友的情况是不存在的。所以这也说明了一个问题:为什么高端局依然会遇到很多猪队友——因为他可能找了代打,明明是白银的水平,硬是代打到了钻石。

看了这个匹配机制是不是感觉突然顿悟了很多?想检测自己现在真实的段位水平吗?不如去打几局匹配,看看自己队友的平均水平,就可以推测出自己的真实水平啦!

点评:

系统根据评估得出的综合能力,计算和分组,形成10个召唤师的一局新游戏的匹配,但匹配成功之后,对局中每一位召唤师选择的什么位置,选取的什么英雄,甚至是具体发挥的如何,都是匹配算法无法进行判断与干预的。

总的来说,匹配的算法和规则本质是一个数学问题,而一局高质量的对局,由算法规则之外的很多综合因素共同决定。