比如一款麻将游戏。每个人点开始游戏后。系统会自动进行组合,选出4个人
作为一个房间,这个算法如何设计?
假设我点击开始游戏后,将我申请进入一局游戏的请求发送给服务器,就进入
等待环节,服务器在可以组成一个房间后,向该房间成员发出通知。满足要求
的人数不够等无法组成房间时,就等待。玩家等不及了,可退出等待环节。
要求:
①保证同一IP玩家不会被分到一个房间里(防止个人作弊,防止距离很近的人
合伙算计他人)
②尽量使组成一个房间的四个人水平大致相当(假设有一个整数的属性表明该
玩家水平,值越大水平越高)
③允许玩家提出附加要求,比如只和xx等级以上玩家玩(注意提出该要求的玩
家可以和符合该要求但未提出要求的玩家 或 同时符合双方要求的玩家 组合)
④效率,复杂度,内存占用等。尽量不在数据库中操作。
难度逐级增大啊,喜欢琢磨的琢磨一下吧。
PS.腾讯的游戏好像都是手动找座位的,国外的有些麻将游戏就是这样分配的。
1,2,3其实是三条rule。简单算法如下,
- 挑选一个人坐在某桌作为起始
- 首先抽取本桌candidate的集合set,(比如最近等待5分钟的全部的人),
- 问题转换为从一个set里面随机抽取三个人满足条件1,2,3的问题。
- 依次遍历集合的每个人,最先符合条件的三个人坐下剩下的三个空位
- 剩下N-3的人用3/4的概率任意替换前面4人中的某人。集合遍历结束可
- 以得到随机的四个人。
- 为了速度和效率,在抽取candidate集合的可以用一些算法加快。比如实
- 现根据rank形成不同的队列加快partition的过程。
本答案思路来自google的一道面试题:
You have a stream of infinite queries (ie: real time Google search queries
that people are entering). Describe how you would go about finding a
good estimate of 1000 samples from this never ending set of data and
then write code for it.
如果没有第三条,算法比较简单:有一个线程每隔一段时间把当前等待的人拿出来
按实力排好序,先确保上一轮未匹配的先配对(防止等待时间过长),然后从大到
小依次四个四个配对,遇到同IP配对的去掉相同的IP从后面选人递补进来,最后剩
下的进入下一轮等待。
如果有第三条的话,根据是否满足条件可以把等待选手变成一个有向图,问题就要
复杂得多了,而且满足第三条的时候可能会违背第二条。当然也可以简化成 和上面
差不多的算法,发现对手不符合要求的时候就把提出要求的玩家踢掉重新匹配,然
后下一轮优先匹配,如果设置条件的玩家不多的话还行,多的话用这个算法 可能根
本就匹配不上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步