王者荣耀的匹配算法是怎么实现的?

最近沉迷一款很火的5V5手游,王者农药,它的画面精美,大概是这样的:

clipboard.png

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

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

  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. 数据量大,耗时小,多线程数据安全,这些都是匹配系统需要解决的问题。

随之而来的就是问题:
如何设计一个王者荣耀级别的匹配系统?
求大致思路即可,有具体算法名字更好。

阅读 11.8k
1 个回答

王者荣耀的没有查到

找到个这个TrueSkill

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题