上篇关于王者荣耀匹配的实现,我们讲了他的大致思路,这篇我会更加细节的讲解王者荣耀实现的细节。
要实现王者荣耀这个游戏的人的匹配逻辑,上篇我们说把匹配分成三个队了,单人队列,三人队列,五人队列,然后从队列里面取人组队。其实这样的思路实现是问题不大,后面我进行深入思考,需要考虑更多的细节,提高体验等问题,我们将如何实现这个匹配呢?下面我们来看,需要考虑什么问题,比如用户匹配了多次都没有匹配成功,如何通过算法,调整匹配的组队的人员的技术水平?围绕下面几个问题我们再分析一下怎么更好的实现这个匹配的功能。
1:如何处理用户匹配多次还没有成功呢?
答:如果一个用户没有匹配多次还没成功,那我们肯定要提高这个用户的匹配权重,匹配权重高的优先匹配,对应的如果出现多个用户匹配多次不成功,肯定是有其他用户出现中途退出,没有确认参赛,那这个时候需要逻辑处理那些中途退赛的用户,多少时间内不让参赛。
2:如何处理当前参与游戏人数不够的问题呢?
答:这个的话,人数不够怎么办?怎么可能王者荣耀玩的人这么少呢?目前我们来看可能基本不可能出现这个情况,但是我们代码还是需要考虑这个问题,这个时候我们就需要处理人数不够的问题,最好的方式当然就是加入机器人来玩,初期的游戏应该都是这个思路,最大了就不用考虑这样的问题了。
3:如何处理匹配人的水平问题呢?
答:关于这个,我们肯定是需要一个算法服务来判断这个用户是位于什么水平,非常高的荣耀级别肯定不能直接和低的进行匹配,如果出现这样匹配会严重影响游戏的体验,所以从逻辑实现层面要完全过滤掉这种匹配,如果人不够,则可能给一个同等水平的机器人。
这三个问题是匹配中比较核心的了,然后我们看看涉及到这三个问题,我们如何更好地来实现匹配逻辑。关于上次的匹配图,我们首先要调整的是单人匹配池和三人匹配池的队列实现,由于队列只是从里面拿数据,匹配的时候只能拿完数据,再做匹配。如果要基于分数排序,队列是不好使的。我们想想?如果用zset(有序集合)来实现是不是更加好呢?zset(有序集合)默认自带score的功能,我们正是需要这个来实现权重,我们默认从zset拿出来最大的权重的人,redis的zpopmax 正是我们需要的。从官方的看:ZPOPMAX key [count]:删除并返回有序集合key中的最多count个具有最高得分的成员。非常符合我们的实现需要。然后我们要解决匹配人的王者等级的问题,那我们需要通过不同的等级,实现基于不同等级的组成不同的zset匹配池。这个话有点绕,其实就是key的生成,加上不同等级的属性,这样不同的等级就有不同的zset匹配池,不同的等级匹配,可以在代码中控制哪几个等级能够匹配,哪些等级不能匹配,最后去拿对应能匹配的等级的zset匹配池的人去匹配即可。
最后我们贴一下这个匹配实现的逻辑图如下:
最新的更新的图地址:
https://www.processon.com/view/link/5fd56b557d9c0806f72f6282