解析类Dota游戏天梯匹配系统的实现方式
什么是类Dota游戏的天梯匹配
玩过Dota或者LOL的人都知道 . 天梯匹配系统是一套将 玩家的实力 量化,并进行实时分配组队游戏 , 结算的系统. 旨在将单局游戏的胜率控制在50%左右. 避免出现虐菜,被暴虐,单边木桶短板效应, 实力悬殊的局面 . 以提供更好的游戏体验 .
)
带着如上所说的目的 . 我们从技术角度聊聊这套系统该如何实现 .
系统设计
首先说量化
量化本质上是一个利用数学公式 ax+by+cz = result
求结果的过程 . abc xyz 代表各种因子(如 杀人数, 死亡数, 助攻数 ,网络线路等 ) ,得出一个具体的分数. 分数相近的人如果进行对战 . 他们胜负的概率将会无限接近50% . 比较出名的算法有ELO ,
具体的算法我们这里不再表述 . 回到主题, 既然有一个量化的过程 , 那我们在设计系统的时候 . 需要预留两个点:
get量化值 , 对应到匹配时的分值排序
set量化值 , 对应到结算
即匹配
时获取量化值 , 结算
时更新量化值 :
匹配 + 结算
再说说组队游戏
组队对战 在前端常见的表现的形式为 开房
(不要想歪了) , 即将多个人聚合在一起 . 本质上是一个链表
, 存有先后进入关系 . 第一个进入的人开房
并开门
, 人数足够后可以关门
, 即关闭房间入口 . 不足则开门
,即开放房间入口. 没人了则 退房
.
即:
开房
退房
关门
开门
业务流程梳理
终端玩家(手机/电脑) 通过互联网接入服务器 . 并发送匹配请求 , 服务器识别用户身份 . 进行匹配组队,分配房间 . 游戏结束后 , 进行结算. 更新匹配分数 .
综上所述, 我们天梯匹配
梳理的整个过程如下所示.
Matchvs类天梯匹配系统的实现
Matchvs是如何提供这样的能力的呢? 这里就有必要谈到JoinRoomWithProperties这个接口了.
条件匹配
条件匹配JoinRoomWithProperties
JoinRoomWithProperties(roomProperty,userProfile)复制代码
roomProperty是匹配标签,让开发者可以描述“玩家想进一个什么样的房间”。提供maxPlayer(房间最大人数),mode(游戏模式,默认为0),can_watch(允许观战,默认不允许)固定字段。 开发者可以自定义房间属性用于精准匹配,比如:开发者获取到玩家当前积分500,于是在roomProperty里定义“range”:“400 - 600”。服务端收到请求后,将完全按照key-value进行匹配,即将携带相同的roomProperty的玩家匹配到一起。对于上述开发者自定义内容,服务端是帮该500分的玩家找到分值波动范围100的水平相近的其他玩家。
上面说到 如何 实现天梯式的匹配加入 , 没有说道这类房间如何创建 . 那么再说下Matchvs的另外两个接口.
CreateRoom
场景: 游戏中允许玩家自己创建房间并设置相应规则。比如:你画我猜。房主可以踢出其他玩家,如果房主掉线或退房,则转移房主,房主转移规则按加入顺序进行转移。提供创建房间的接口用于玩家创建房间,玩家主动创建的房间和系统自动创建的房间隔离。即随机匹配(条件匹配)和指定房间匹配分离,随机匹配不能匹配到玩家创建的房间里去。
CreateRoom(roomName,roomProperty,userProfile)复制代码
创建房间,roomName是房间名,password是密码,密码可以为空(此处考虑对外是分开两个接口还是只有一个)。roomProperty为房间属性,可被修改,只能被创建者修改。roomProperty设置固定字段“房间是否可见”,玩家创建房间后将该玩家加入房间。玩家创建的房间不能被随机加入,其它玩家只能通过“加入指定房间”进入。
GetRoomList
获取房间列表
getRoomList(GameID,mode,roomType,roomProperty)复制代码
获取游戏里由玩家主动创建(通过调用createRoom接口创建)的房间的列表。默认为获取指定场次的可见房间列表。可以参考详细设计里返回指定排序、指定类型列表。 客户端可以请求获取指定房间属性的房间列表,比如游戏里创建的有3人房间、4人房间,客户端可以只获取3人房间列表。3.1.5 踢除房间成员
kickPlayer
踢除玩家
kickPlayer(roomID,userID)复制代码
踢除玩家,开发者可以调用该接口将玩家从房间踢出。如果房间ID或者用户ID不存在,则给出对应错误信息。该接口客户端和gameServer均能使用。 在玩家创建的房间里,只有房主才能踢;MVS创建的房间不对踢除操作进行限制。
HashGet&HashSet
而上文中提到的量化 ,以及 JoinRoomWithProperties ,那么对这个Properties, 则可以由开发者自己去开发复合游戏特色的 量化
算法.并由自己去实现 get
和 set
. 也可以借助Matchvs
提供这样自定义存储
接口 , 持久化存储用户的Properties.
将量化
算法从系统设计中剥离处理 , 使得Matchvs
的设计不会与具体游戏强耦合 , 又允许开发者高程度的自定义 , 不同的系统间可以良好协作 , 是一个很好的设计方案 .
流程图
上述接口调用的流程图如下:
解析类Dota游戏天梯匹配系统的实现方式相关推荐
- 关于类DOTA游戏多样化技能系统的设计思考
在游戏里,每一个人物都有很多的技能.像DOTA,英雄联盟一样,技能也不都是单一的直线判断,而是有很多的花样.这类游戏的技能系统是如何设计的呢? 这里想从自动机的角度来抽象这个问题,以期得到一个更泛化的 ...
- 战旗类DotA游戏原代码及项目报告
C语言程序设计实践的课程设计我们写了个游戏,差点拿满分,先将代码与项目报告与大家分享^_^ 先上截图: 游戏名称:DotA圣战 类型:回合制RPG战棋类游戏 分工: SwordHoly:游戏主程序,英 ...
- 计算机游戏系统分析,计算机游戏引擎fly3D系统的实现方式及应用技巧
摘要: 引擎的概念是在机器化作业的背景下诞生的.为最大限度的缩短平均开发周期和减少重复劳动,借用类似题材游戏中的部分代码作为新游戏的基本框架以节省开发时间和开发费用是十分必要的.这里所谓的" ...
- java用接口回调回合制游戏_类DOTA游戏如何设计多样化的技能系统?
这个嘛,我觉得我还是能答的,因为我曾经设计了DOTA2的一款RPG,虽然未完(逃 有道云笔记 有道云笔记 有道云笔记 有道云笔记 当然没翻译完,因为弃坑了233 以上是数据驱动类型的技能,还有脚本驱动 ...
- 创建Dota游戏中的兵营类(Barrack),创建3个兵营,通过控制台为每个兵营定义兵营名称,并指定该兵营需要创建的士兵人数。
上面图标里的这个类是创建的兵营类,下面的代码是兵营类的测试类: package com.xjc; /任务一, 1.创建Dota游戏中的兵营类(Barrack),该类中有一个类成员变量count(类属性 ...
- 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防御塔所在的位置
返回本章节 返回作业目录 需求说明: 创建Dota游戏中的防御塔类 通过两个坐属性显示防御塔所在的位置 实现思路: 创建防御塔(TowerDefense)类 在该类中定义了两个属性,分别是int类型横 ...
- 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。
返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...
- 类Fomo3D游戏漏洞与修复机制全解析
摘要: 无论是 Fomo3D 山寨版还是正宗原版都摆脱不了"一轮就凉凉"的宿命,这与其智能合约的设计漏洞不无关系.本文从合约安全开发的角度出发,详细分析了类 Fomo3D 游戏的两 ...
- Springboot实现匹配系统(上)
匹配系统的流程 要实现匹配系统起码要有两个客户端client1,client2,当客户端打开对战页面并开始匹配时,会给后端服务器server发送一个请求,而匹配是一个异步的过程,什么时候返回结果是不可 ...
最新文章
- 员工培训案例分析答案_培训主管的技巧:培训教材问题解析、培训实施分析报告(附案例)...
- 模拟实现string其中的一些知识点
- IOC操作Bean管理XML方式(有参构造注入属性)
- java时间聚类_mongodb 按照时间聚类 java
- js designMode contentEditable 编辑在线网页
- 解决了昨天差点让人崩溃的问题.
- 查看编译class文件时,使用的JDK版本(只能查看到大版本)
- 二级c语言 考生文件夹下,二级C语言上机新题库.doc
- 2019-5-6作业
- (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子
- 离散数学杜忠复版答案_离散数学第2版答案
- 怎么创建自己的小程序?10分钟搞定
- 蒙特卡罗模拟计算定积分(R)
- Web 应用防火墙如何添加域名
- 记:应聘浙江农信,软件开发工程师
- 柔性电子 --基于碳纳米管的柔性压力传感器
- 小知识:随机生成26个字母中(一个或多个)的字母
- 2020 新的一年加油!
- PyCharm Community 2021.2 安装与汉化
- MSRA实习申请经验分享
热门文章
- manjaro使用Spark-Wehcat输入框出现中文乱码框框
- 【C++】逆波兰表达式 + 反向迭代器的实现
- 中国石油大学 计算机考试试题,中国石油大学 计算机考试A卷.doc
- Android Spider JDAX-GUI 反编译工具下载使用以及相关技术介绍
- 自然语言处理中的数据获取与清洗总结(未更新完)
- png图片自动转ttf字体(使用python实现)
- 乐优商城笔记六:商品详情页
- js php 实时更新数字,js实现股票实时刷新数据案例
- 怎么样在html中直接使用图片,如何在css中引用图片
- 在路由引入时应用路由策略 实验详解