从《阴阳师》到《原神》,抽卡中的程序算法

简介: 收集类的抽卡手游,是玩家们喜闻乐见的一类游戏,他们背后又有哪些程序算法?我们一起来探讨

曾经,网易凭借旗下一款叫做《阴阳师》的手机游戏登顶全球第一手游发行商的位置。最近,米哈游的《原神》又在国内外备受好评。
这两款游戏本质上还是一款抽卡 + 战斗类游戏,玩家需要通过抽卡获得式神(宠物)进行战斗。
image.png

式神卡片按照稀有程度进行分类,分为N,R,SR,SSR。

  • N:Normal,一般的卡片
  • R:Rare,相对稀少的卡片
  • SR:Super Rare,非常稀少的卡片
  • SSR:Super Super Rare,非常非常稀少的卡片

这个分类系统继承自日本的卡片类游戏,比如著名的Love Live
所以,显而易见,SSR是每个玩家梦寐以求的卡片,通常战斗力也最强。“你有没有SSR”也成为玩家聊天中最首要的话题。连日本的晴明神社也被玩家们的许愿占领。
image.png

然而抽卡这个行为就带来了随机性。导致玩家被分为了欧洲人(手气好,有多个SSR),亚洲人(手气正常),非洲人(脸黑,没有SSR)。

这时程序员的问题就来了:在这类游戏中,如何设计算法来保证玩家抽卡的概率和体验。我也和业内人士进行了一些讨论,通常有以下几种:

最直接的方法:阈值计数

对每个玩家抽卡的数量进行计数,达到阈值,出现SSR卡牌。简单来说,比如玩家抽到第100张,必定会有一个SSR,在SSR卡池内随机选取一张出现(其实这个计数器在阴阳师中也是有的,600连抽没有SSR会得到非洲大阴阳师的成就)

是不是有点简单的出乎意料,不要小看这个简单的算法,这个算法的优点是:

  1. 概率准确,不同玩家之间差异小。
  2. 如果你想从非洲偷渡到欧洲,只要充钱抽卡就行。

当然缺点就是缺少惊喜。改进方法是可以对于阈值进行随机处理。

最随机的方法:概率随机

玩家每次抽卡计算一次随机数,如果落在概率范围内(比如5%),则去SSR卡池里抽一张。这个算法中玩家实际的抽卡分布大概是这样,集中在标准概率附近的玩家很多,离概率越远玩家越少,看上去很美。

image.png

然而这个算法最严重的问题是,抽中SSR的间隔是满足指数分布的。

image.png

也就是说从玩家的实际体验来说差别很大。可能有些欧洲人富得流油,连抽连出SSR,而有些非洲人脸黑的出奇,连抽无数次也不出SSR。满满的都是惊喜。

混合算法

而一般游戏中实际使用的方法更多的是这两种方法的结合,比如:在初始或者抽到SSR时随机设定下一次的抽卡阈值次数,或者根据抽卡次数或者氪金(充值)的数量调整概率范围等等。

随机性带来的问题

这里就带来了另外一个问题,一切都是黑盒,实际的数据无从知晓。大家是否还记得小时候在公园里经常遇到的一个套路:小贩用磁铁控制抽奖转盘的旋转,你永远也不可能抽到你想要的东西。

当然,像网易这样的公司还是有些良心的,就身边的玩家反馈概率还比较平衡。但是并没有人来监管这一点。日本游戏《碧蓝幻想》就曾经因随机性大引发巨大争议,被指暗箱操作
image.png
某日本玩家在Niconico上直播抽卡,花了68万100日元(约合人民币37814元)、2276连抽才抽到当时的稀有角色“猴女”,而这一角色却被知名声优田中理惠第一次10连抽就抽中,并发在推特上炫耀,引发日本玩家的轩然大波

所以,日本网游协会(日本オンラインゲーム協会)就提出了对与扭蛋类游戏的共识,其主要指导方针仅有三点,很简单,但也直击要害:

  1. 扭蛋获得道具的最高课金上限额为5万日元(约合人民币2880元),也就是说,花5万日元必得目标道具。
  2. 道具要明确类别、明示中奖率。
  3. 手游公司内的运营责任人必须保留有关道具中奖率设定的明确记录。

国内目前也同日本一样,要求对游戏的概率进行公示,并增加保底机制。让这类抽卡类游戏能够更加健康的发展下去

目录
相关文章
|
4月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
105 1
|
29天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
37 3
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
2月前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
6月前
|
机器学习/深度学习 并行计算 搜索推荐
程序技术好文:桶排序算法及其Java实现
程序技术好文:桶排序算法及其Java实现
41 0
|
6月前
|
存储 人工智能 算法
程序与技术分享:Acwing算法笔记
程序与技术分享:Acwing算法笔记
|
6月前
|
人工智能 算法
程序技术好文:算法与数据结构
程序技术好文:算法与数据结构
|
6月前
|
算法 vr&ar C语言
程序技术好文:欧几里德算法
程序技术好文:欧几里德算法
45 0
|
6月前
|
算法 数据挖掘 计算机视觉
程序技术好文:聚类算法一(Kmeans、层次类聚、谱类聚)
程序技术好文:聚类算法一(Kmeans、层次类聚、谱类聚)
41 0