比赛模式怎么做: 核心匹配规则
比赛模式是在线棋牌类游戏最重要的游戏模式之一,之前写过文章介绍如何安排比赛数值以达到收支平衡。
然而,笼络了一堆玩家前来参加比赛之后,要如何组织好这些玩家呢?这就涉及到系统如何将玩家组织配对,这就是比赛模式除了配平收支之外最核心的机制了。
我的另外一篇文章里介绍了目前棋牌游戏常用的几种模式,现在我们就用使用最广泛的“生存赛”为例,介绍几种常用的系统配对方式:
- 顺序法
这是最简单的一种方法。
一般的棋牌游戏的大厅都以桌为单位,上古时代的棋牌大厅都是让玩家自行寻找位置入座,现在移动端都是系统按照玩家请求的时间,按循序将其一个个放置在桌子上。当某个桌子已满(通常以游戏人数为上线,例如麻将就是4人),则自动开启一个新的桌子迎接新入场的玩家。
这种方法实现简单,表现给玩家就是入桌的人是一个一个地入座游戏的。
但这种方法缺点也很明显:既然是比赛,玩家完全可以约定好几个人同一时间一起进入,有很大的几率被安排在同一桌,有作弊的风险。
正是考虑到了这一点,所以有一些系统采用“错位排序”的方式:
按照顺序,将玩家安排在不同的位置上,避免同时进入的玩家被安排在同一个桌子上。但这种方法指标不治本,由于不是同时进入,玩家完全可以进入之后看一下是不是自己人,不是自己人的大不了退出重新再排过。
- 队列法
其实顺序法的问题不在于顺序,而是开始的机制,只要是玩家可以自由进出,就不能避免他们想按照自己意愿入座的行为。
所以,玩家进入比赛场之后,系统不安排其入座,先将其置入队列,等待队列人数到达一定数量后,一次性将玩家置入桌子并直接开始。
队列法应用广泛,《QQ斗地主》采用的就是这种方法。但使用队列法就需要一定的时间等待玩家填满队列,界面表现为“等待中”,表示其当前既不在大厅也不在桌子,而是在“排队”。
那么队列应该如何配置,玩家应该如何安排呢,这里就介绍一下我们用方法:
- 预制队列
玩家进入匹配状态中,系统首先将其丢入一个队列,可以是单线程队列(仅一条),或是多线程队列(多条)。
这里简单介绍一下设置多线程队列的意义:
1、 有不少游戏是通过ELO系统(也就是LOL等游戏使用的评级系统)来评价玩家的水平的,理论上讲,评分数值越接近,玩家的水平就越接近,虽然可以通过低级场、中级场、高级场入口来分流不同水平的玩家,毕竟入口数量有限(也不可能太多),所以在进行匹配时如果根据评分设置多个区间,可以进一步细化,同水平的玩家更容易排到一起,下文也会详细介绍到。
2、 当比赛的规模大、奖励高时,对防作弊的要求也高了。作弊者时常采用的做法就是:尽可能短的时间、尽可能冷门的时间,多个账号同时涌入,为的就是能让其“自己人”同桌游戏。多个线程进一步打散了玩家,提高了作弊者的成本,降低了比赛被舞弊的风险。
当然了,多线程队列是对参加人数的规模有要求的,人数不够,线程还多,人为分流玩家,拉长了匹配的时间,造成不好的体验。
选择使用多线程队列,根据一定的标准将玩家安排进入某个队列,您可以自己定义这个标准,比如进入时间、胜率、评分、金币等,我们就先以评分为标准举例:
| 评分 |
1阶 | 1001~1100 |
2阶 | 1101~1200 |
3阶 | 1201~1300 |
4阶 | 1301~1400 |
- 预制筛选
我们想象一下,如果某个游戏中所有玩家都在同一场比赛中,根据评分高低,那玩家的分布情况会如何呢?
底分玩家多,高分玩家少
进入老年期的游戏,中间多两边少
不管是哪种分布,由于我们之前制定了1阶~4阶的多个线程,必然会造成某个阶人数很多一下子就匹配好了,某个阶人数很少匹配时间很长甚至迟迟不开始,那么要如何平衡这个矛盾呢?
队列法最关键的就是如何安排好匹配时间,合理的匹配时间玩家有耐心等待,同时可以让系统能更好地部署,但是一旦匹配时间过长,会造成极差的用户体验。
根据以往的经验,最理想的等待时间应该是10~15秒(对于玩家来说当然是越短越好),最好不要超过30秒,到达45秒以上乃至好几分钟就无法忍耐了。
45秒后无法忍受?其实更早就开始了
此外,当前的在线玩家数,也对匹配时间有着影响,同等条件下,人多意味着更短的匹配时间。所以我们可以根据当前的在线人数,动态调整我们的策略,将平均匹配时间维持在30秒以下。
思路:一般情况下,高阶人数少、低阶人数多,那么当高阶人数不尽人意时,可以略微放宽条件,将其“滑入”较低档次的队列,以保证匹配时间维持在一个良好的水平。(“降维攻击”,笑)
所以,我们定制了3种方案:
严格筛选状态 | 玩家进入游戏场,根据其金币数量,将其置入对应的队列,等待若干秒,称为严格筛选状态 相应的容器大于若干人,则进入匹配阶段。 |
宽松筛选状态 | 玩家进入游戏场,严格筛选时间结束后,依然没有开始游戏,则将其降级到前一个级别的队列,等待若干秒,称为宽松筛选状态,若在等待时间内没有开始,则继续降级。 |
自由筛选状态 | 玩家进入游戏场,总共匹配时间超过若干秒(项目5),无论当前在哪个容器,直接将其置入最低档次的队列。 此状态称为“死线”,即匹配时间太长了,无论如何都要开始游戏了,所以也不管什么条件就匹配去吧(慎用)。 |
根据当前人数情况,系统自动调配当前状态,以适应当前状态的变化:
状态1 | 开放的线程队列、数量 |
状态2 | 严格筛选状态时间,默认10秒 |
状态3 | 队列进入筛选的最小人数,默认9人 |
状态4 | 宽松筛选状态时间,默认10秒 |
状态5 | 自由筛选状态时间,默认60秒 |
状态6 | 是否同IP禁止 |
最后,根据当前场内的人数,进行动态调整:
人数 | 状态2 | 状态3 | 状态4 | 状态5 | 状态6 |
0-100 | 20 | 9 | 10 | 60 | 是 |
101-300 | 15 | 18 | 10 | 60 | 是 |
300-500 | 10 | 27 | 5 | 30 | 是 |
500以上 | 5 | 36 | 5 | 30 | 是 |
以上的数值只是举例,需要在运营过程中不断调配到达最优,让匹配时间和匹配度达成一个相对的平衡。
- 匹配进行
队列布置好后,玩家陆续进入队列,队列人数满了,系统就开始配桌,玩家被安置在桌上后游戏即刻开始。
系统根据进入该队列的时间,将队列中的玩家错位排序,同一行的玩家安排在同一桌,就可以顺利开始游戏了:
1 | 8 | 15 |
2 | 9 | 16 |
3 | 10 | 17 |
4 | 11 | 18 |
5 | 12 | 19 |
6 | 13 | 20 |
7 | 14 | 21 |
这是一个3*X的矩阵,X为3~9随机数且 3*X必须小于项目3中的数值。
以3人的游戏为例子,如果4个人的游戏(如麻将)则再多加一列成为4列。
某些对作弊敏感度高的游戏,还会加入同IP限制(甚至是定位限制),符合条件的人无法被安排在同一桌。
有这种特殊条件,其实是比较难处理的,我们尝试了一种方法:当若干名玩家匹配成功后,系统检查是否存在同段IP,如果是,则保留1名同IP玩家,踢走其他同IP玩家进入队列继续排列,立即将队列候补玩家补上,如果没有候补玩家则解散所有人重新返回到队列。
这种野蛮粗暴的做法会带来不太好用户体验,所幸除了作弊者,同IP出现的情况不太多,本方法也仅供参考,慎用。