最近沉迷一款很火的5V5手游,王者农药,它的画面精美,大概是这样的:
沉迷同时,不禁想了解下「王者荣耀的匹配算法是怎么实现的」。
看了下一些网友给出的方案,大致步骤如下:
产生一些预匹配队伍,可能是一个人匹配,也可能是两人,三人先组队再匹配。
将这些预匹配队伍放入一个HashMap。
根据预匹配队伍人数分类,比如4人黑店,3人黑店,保存结构为Map<人数,此人数下预匹配队伍List>,称为classifyTeamMap,即为匹配池。
计算每个队伍中选手的平均积分。
优先为4人黑店匹配,在classifyTeamMap.get(1)中找与之平均积分最接近的1人进行组队。之后依次为3人,2人...匹配。
匹配完成后,将队伍ID加入一个已匹配的HashSet中做记录,并没用从匹配池classifyTeamMap中删除匹配完成的队伍。
小伙伴们基本都找到队友了,选出平均积分接近的两个队伍加入战场。
敌军还有30秒到达战场...
随之产生的疑问:
在数据量大的时候,用HashMap作为匹配池是否合适?或者说,这么保存匹配池?用户未登陆的时,信息保存在持久化数据库,但在匹配时,又该怎么保存呢?
匹配完成后,上诉方法并没有从匹配池中移除该队伍,匹配池会逐渐膨胀。
正常情况下是一个玩家或者一组玩家点击匹配,就该开始跑匹配算法,即涉及到多线程问题。后果:匹配池不是想清就能清,假设队伍A和队伍B刚好五人匹配上,正要将其从匹配池中移除时,队伍C已读取队伍B信息,正在检查它们是否匹配。这时候一旦移除就是一个妥妥的NPE。况且从HashMap中remove的成本也不低。
数据量大,耗时小,多线程数据安全,这些都是匹配系统需要解决的问题。
随之而来的就是问题:
如何设计一个王者荣耀级别的匹配系统?
求大致思路即可,有具体算法名字更好。
王者荣耀的没有查到
找到个这个TrueSkill