以王者荣耀例子来解释方案,并非是王者荣耀真实方案

业务需求分析

在王者荣耀中,我们会打排位,而且我们想展示我们的段位会有很多个排行榜,比如段位排行榜。而段位排行榜是我们经常关注的,我们会看我们的段位在区服的排名情况,在好友列表中的排名情况。

根据以上需求,我们可以分析出排行榜需要提供两个功能:

  1. 查看段位排行榜
  2. 查看自己的排名

设计方案

在做设计方案之前,有个细节得注意:段位在数据库和后端计算都是分数形式,比如青铜三,三颗星:13

那怎么设计这个方案呢?

有同学就会说,直接将数据保存在MySQL中,然后在玩家登录进行计算,得出各个所有排行榜。这种方案是可以,但是登录时需要计算,如果单个区服数据过多,就会导致玩家登录的RT太长了。

所以,对于现在来说比较好的设计方案是使用Redis的有序集合

方案细节

我们将段位保存在MySQL的个人排位信息表中,在Redis中会存储多个排行榜,比如全区段位榜,好友段位榜等等;当我们打完一局排位后我们在进行结算时同时也会更新多个段位排行榜(在DDD中一般用领域事件去更新排行榜)。

数据结构

Redis有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

分数设计

对于分数设计,我们其实可以直接将段位的分数设置为score即可,但是需要考虑一种情况,就是两个玩家分数相同时,我们一般是将分数+时间戳进行组合,成为一个新的分数。

分数封装和解析代码如下:

//封装成分数
func packScore(score int64) float64 {now := time.Now().Unix()return float64(score*TimeLength +now)//如果排行榜支持负数//if score >= 0 {// return float64(score*TimeLength + now)//} else {// return float64(score*TimeLength + now - TimeLength)//}
}//将分数解析
func parseScore(score float64) int64 {return int64(score / TimeLength)
}

Demo源码

https://github.com/Eternallyc/leaderboard

如何实现游戏中的段位排行榜?相关推荐

  1. 用 Redis 搞定游戏中的实时排行榜,附源码!

    原文:segmentfault.com/a/1190000019139010 1. 前言 前段时间刚为项目(手游)实现了一个实时排行榜功能, 主要特性: 实时全服排名 可查询单个玩家排名 支持双维排序 ...

  2. [原创]游戏中的实时排行榜实现

    1. 前言 2. 排行榜分类 3. 思路 4. 实现 复合排序 4.1 等级排行榜 4.2 通天塔排行榜 4.3 坦克排行榜 5. 排名数据的动态更新 6. 取排行榜 7. Show The Code ...

  3. 游戏中排行榜代码实现

    游戏设计中常常使用排行榜,根据排行发送排名奖励. 排行容器的组成 记录排行的容器是一个由内部由vector和map组成的模板类 1.1.容器为什么这么设计 1.1.1vector部分的结构 其中vec ...

  4. 基于cocos2dx,在android的游戏中加入google play game排行榜。

    国内关于google play game service的例子实在太少,而最近做的一款游戏要用到排行榜. 顺便打个广告,小弟做的一款答题休闲类Dogface GaGa游戏在苹果谷歌以及国内各大平台已经 ...

  5. threejs 微信小游戏中的离屏渲染做UI和排行榜

    微信小游戏对threejs真的是一次桎酷啊...呵呵. 规定不能用html锁死了我们之前两个html标签的可能了... 不过微信还是允许了大家的离屏渲染,要不是我们在跳一跳之类的游戏中也看不到排行榜和 ...

  6. Elo Rating System 简介及其在游戏中的运用

    不知道大家在玩游戏的时候,是不是都产生过这样的疑问: <王者荣耀>排位五连胜后遭遇九连跪,是不是游戏操控胜率? <英雄联盟>渡劫局总匹配神对手猪队友,是不是有意制裁我? < ...

  7. redis+lua现实游戏中的一些常用功能

    为什么80%的码农都做不了架构师?>>>    游戏中一些常用的功能,仅仅使用redis提供的命令来实现,恐怕难度比较大.好在redis支持lua,能让一系列的操作变为原子操作,让这 ...

  8. java能做三国杀的特效吗_能不能在游戏中关闭将灵攻击特效,太恶心了

    查看: 2692|回复: 8 能不能在游戏中关闭将灵攻击特效,太恶心了 当前离线UID经验21 粮饷14 最后登录2020-12-3 在线时间0 小时 一骑讨, 积分 21, 距离下一级还需 29 积 ...

  9. 十大笔记本电脑排行_2020双十一,十大高性价比游戏笔记本电脑值得买排行榜之搭载144Hz电竞屏机型(配置推荐)福利放送...

    最新文章已更新20201028,戳下方⏬文章链接看最新排行 Leo Leung:双十一更新,预算万元以下144Hz广色域电竞屏游戏笔记本电脑十大高性价比机型排行榜.福利放送!​zhuanlan.zhi ...

最新文章

  1. java表单 mysql 乱码_java web当中表单提交到后台出现乱码的解决方法
  2. 优化SQl语句的十个重要步骤
  3. python运行过程中会被编译成二进制_Python代码在运行过程中,会被编译成二进制代码。_学小易找答案...
  4. [云炬商业计划书阅读分享]洗车店创业计划书
  5. 如何选择MBA教育 读MBA前必答10个问题
  6. 如何控制油门更准确?
  7. 工作项跟踪管理系统需求
  8. 9-4push方式整合Spark streaming.
  9. linux下mysql区分大小写的内容
  10. JavaScript:堆栈溢出内存泄漏
  11. mysql writing to net_mysql 提示 Writing to net_MySQL
  12. 帆软:像阿甘一样,奔跑在商业智能的赛道上!
  13. DevExpress WPF控件3D打印应用场景 - 实现3D打印系统可视化窗口
  14. Qt -QQ音乐歌词桌面
  15. 云存储及分布式文件系统
  16. 西安电子科技大学计算机系分数线,西安电子科技大学2017年分专业录取分数
  17. AI燃到爆!中关村人工智能产业论坛十位大咖演讲干货
  18. sprintboot验证码kaptcha 自定义图片样式
  19. ZooKeeper作为注册中心
  20. 微信PC端技术研究(2)-拿下语音

热门文章

  1. DateUtils 工具类:获取指定月份第一天时间,最后一天时间
  2. 如何在Linux(Ubuntu 14.04 LTS)上安装搜狗拼音输入法
  3. Mindjet MindManager思维导图使用技巧
  4. 个人计算机和家用计算机的区别,量子计算机与普通计算机的区别?
  5. Python程序员面向对象技巧梳理
  6. zookeeper3.4.6配置实现自动清理日志【转】
  7. StarRocks官网摘要笔记
  8. 康耐视ViDi如何实现工具之间的关联
  9. 统计学的入世与出世观----谢邦昌
  10. 论文阅读笔记 | 目标检测算法——YOLOX