请选择 进入手机版 | 继续访问电脑版

 找回密码
 点一下
查看: 4083|回复: 14

一个网络游戏掉落系统的设计实例

[复制链接]
发表于 2013-3-18 21:57:52 | 显示全部楼层 |阅读模式
本帖最后由 theninth1985 于 2013-4-9 18:42 编辑




序言

  最近比较忙,主要是在找工作和设计自己的地图,就没太关注设计区的事情,这两天闲了自己补一篇原创的内容来将功补过吧,写的不好,大家轻喷。>_<


  在游戏设计中,并不是所有的系统都像玩法设计一样需要大量的原创设计,很多服务型的系统,他们只需要照搬已有的成熟设计方案就可以了,比如:物品系统、掉落系统、背包系统、拍卖行系统、聊天系统、邮件系统等等。


  总结现有的设计,借鉴成熟的方案,能够节省很多时间。我想把能想到的这类无需原创的系统设计方案,都总结一下,方便自己和以后用到的人,希望能对大家的设计有些帮助。


  必须说明的是这些设计案例都是我个人的一些经验总结,难免会有粗鄙、疏漏之处,请大家帮我指正,我会不断改进这些设计按,并且让它们都达到“执行案”的程度,这样才能真正方便大家应用。


  第一篇从掉落系统开始吧。


1.  为了DNF!!!

  最开始研究掉落系统是为了玩DNF这个游戏,在DNF里想自己刷极品装备是非常困难的,用RMB直接买的话,随便一件装备都要两三百块,而玩DNF的时候我刚工作不久,月薪只有1800块……

  可是好想要啊!!!

  于是只好看看有没有其他歪门邪道的装备获取手段了,经过观察,我发现DNF里有一种“开罐子”的抽奖方式,有几率抽出极品装备来。这种抽奖方式,一个角色每天最多抽奖30次(开30个罐子)。

  我觉得对这样一个极品装备产出方式的产量是要进行控制的,不能太多也不能太少,太多的话会对经济系统造成冲击,太少的话这种物品产出的方式会被玩家认为很“坑爹”,玩家们就不会来抽奖了,但这种开罐子的方式,抽奖次数是通过角色进行限制的,一个账号下面可能有多个角色,并且服务器有大量的账号是闲置的,那么单纯的用低概率(1/100000这样的)来控制极品装备的产量是很难得到一个合适的概率的。

  如此说来这样的方式可能相对合理,首先设置一个较高的中奖概率,比如5/1000,然后让服务器记录某些珍惜物品的产量,当产量达到一定值的时候,即使再次被玩家抽中,也会被服务器悄悄的替换成其他的非珍惜物品,这样就能达到一个比较好的效果了。玩家经常能看到别人抽中,所以自己抽不中完全就是“人品问题”了……

  按照上面的假设,服务器记录一定时间之内的珍惜物品产量,但它肯定有把记录归零的时间点,来实现周期性发放一定数量装备的效果,如果在一定时间内玩家们抽奖的次数是固定的,比如每分钟都有200人抽奖,那么中奖分布比较密集的时间,就是服务器记录清零的时间点,经过观察我发现整点前后经常有玩家中奖,那么极品装备获取方案就诞生了:

  首先要在整点前后进行抽奖,其次要保证同时抽奖的玩家比较少,你才有比较高的概率中奖,于是我选择23:00之后抽奖,30次抽奖要消耗90万游戏币,而如果抽中的话随便一件装备都能卖两三千万游戏币,实际实行的结果就是我的角色什么装备都有了~~~

  以上的DNF产出机制完全出自我的假设,可能内部的实现机制和我说的完全不同,但不可否认的是,从外部表现上完全符合我假设的规则,而且我也通过这个方式获得了大量的极品装备,什么CC、王星、流星落,不过可怜我那时完全没想到的是如果把这些装备拿到5173上买RMB,能使我当时拮据的生活改善不少,我的经济头脑可真是差劲……

  不管DNF的产出机制是怎样的,通过上面那个例子我们都可以知道,游戏对物品产出机制是有一定的“性能”需求的,比如限制某些物品的产量;随机选择产出物品(抽奖)等等。

  这篇文章就根据我的经验来分析一下物品产出系统的常见需求,同时分享一下我之前的一些设计方案。

  嗯,再提醒一下刚刚参加工作而待遇又比较差的新人策划,我们也是可以利用自己的专业知识赚点儿小钱的,如果工资实在不够花的话,就业余时间从其他游戏里找点儿零花钱吧~~~

2.  物品发放系统                         2.1    物品发放系统的结构

  这篇文章的标题是“一个网络游戏掉落系统的设计实例”,可上面讲了那么多“开罐子”的内容,这并不是跑题了,而是在我看来无论“掉落”还是“开罐子”,实现方式都是一致的,都是一个随机抽取一些物品给玩家的功能,只不过掉落系统大概是这个功能最广为人知的表现形式了。

  我把这系统叫“物品发放系统”,我通常这样设计它的结构,首先要有一个核心的“奖励库”,这个“奖励库”负责最基本的“互斥奖励物品”生成,即从一组预先配置好的物品中按概率随机挑选出一个物品(和这个物品的数量),之后不同系统会按照其特有规则调用这个奖励库,产生物品给玩家,比如“Npc死亡时从奖励库的3组和5组分别挑选1个物品给玩家”这样的规则,明显就是掉落系统的具体规则了。

                         2.2    奖励库的设计

  我们先来看看奖励库的逻辑设计,首先我们要建立奖励库的数据库结构,这应该是一个二维表,表头和含义如下:
  
表头
  
含义
奖励库ID
奖励库的主键,主键值相同的记录属于同一奖励库物品组
子ID
用于区分同一组物品中不同记录的子ID
概率
某一行记录中物品的出现概率,为[1,10000]之间的整数,同一组物品所有行的出现概率之和必须为10000
物品ID
生成具体物品时物品的ID,用以查找物品表
物品个数
生成物品时具体的生成个数


  实际填写一下这个表格相信大家能看得更清楚:
  
奖励库ID
  
子ID
概率
物品ID
物品个数
1
1
2500
262145(铜矿)
2
1
2
1000
262145(铜矿)
3
1
3
3000
262146(猫眼石)
1
1
4
3500
262147(黄水晶)
1
2
1
5000
65536(护腕)
1
2
2
5000
65537(腰带)
1

根据上面的表格,举例说明奖励库生成物品的逻辑:

1、  由调用奖励库的系统提供“奖励库ID”来确定由哪个组来生成物品。这里我们假设ID为1,也就是从1组中挑选1项物品。
2、  Roll一个1到10000的整数,确定从1组中挑选哪一条记录配置的物品来生成。这部分的逻辑稍微复杂:
  a)        首先安装1组中概率的配置生成4个区间,分别是[1,2500],[2501,3500],[3501,6500],[6501,10000]
  b)        根据之前Roll的那个[1,10000]的随机数属于上面哪个区间,来决定生成对应的物品。比如Roll了6750,那么就应该生成1组中“子ID”为4的记录所配置的物品。
  c)        当然这个是人的思考模式,换成程序逻辑的话应该是先把同一组内按照“子ID”升序排列,拿Roll到的值和每条记录概率值的累加值相比较,当Roll到的值小于累加值时,就是这行物品。
3、  之后根据“物品ID”在物品表中寻找到此物品的信息,再根据“物品个数”生成指定数量的此物品。


  大家可以看到,由于生成的概率区间没有交集,所以这个物品生成规则是互斥的。

  另外说明一点,之所以要在奖励库的字段中加上“物品个数”,是由于可能有这样的需求“挖奥术水晶的时候,有时产生1个,有时产生两个”,那么我们只要在奖励库中配置一组“奥术水晶”掉落组,1个的概率是80%,2个是20%就OK了,非常方便,只需要调用一次奖励库。

  而且有时候的确会有比较蛋疼的需求,比如:掉落A物品1000个,那这个时候你要是用调用奖励库1000次来生成这1000个物品,效率是很低的,所以还是在奖励库上加一个“物品个数”字段比较方便。
至于概率为啥要用整数而不用小数,这是由于服务器处理整数的效率要高于浮点数,所以用整数更科学~~~

3.  掉落系统

  上面讲了奖励库的实现,现在终于轮到标题的内容了“掉落系统”。其实掉落系统的实现无非是根据Npc死亡时的一些信息来筛选奖励库中的奖励组的过程,重点是归纳好筛选条件,这些筛选条件是根据实际的掉落需求而来的。
那么让我们总结一下一般网游有哪些常用的筛选条件:

1、  根据级别掉落。这个是个尝试了,高级怪掉落高级物品,低级怪掉落低级物品。
2、  根据地域掉落。不同地域的Npc掉落内容也是不同的,比如这种掉落需求:A副本产出金沙,B副本产出钻石。
3、  根据种族掉落。比如,人形怪掉落各种布料,野兽掉落毛发。
4、  特殊Npc掉落。比如拉格纳罗斯掉落炎魔之手。

  等等。

  我们就暂时总结这么多筛选条件,如果大家用到的时候有独特的筛选条件可以举一反三自行处理。我们用以上这些条件建立一个掉落系统的筛选逻辑。

  还是需要先建立一个掉落筛选数据库,同样是一个二维表歌,字段如下:



  
分组
  
表头
含义
筛选条件
Id
掉落组Id,作为主键
地图ID
用地图Id进行掉落筛选
级别下限
用级别进行掉落筛选时的级别下限
级别上限
用级别进行掉落筛选时的级别上限
种族Id
用种族Id进行掉落筛选
NpcId
用NpcId进行掉落筛选
调用方式
掉落概率
掉落被触发的概率,小于10000的整数
掉落次数
掉落被触发时执行的次数
奖励库Id
此次掉落调用的奖励库的奖励组Id

  我们尝试一下数据填充:
  
Id
  
地图ID
级别下限
级别上限
种族Id
NpcId
掉落概率
掉落次数
奖励库Id
1
101
5
10
0
0
5000
1
1
2
101
0
0
1(人形Npc)
0
1000
2
2
3
101
0
0
0
57(尤达)
3000
1
3
4
102
5
10
0
0
1000
1
1
5
102
0
0
0
0
500
1
2
6
103
5
10
0
0
500
1
3
7
0
5
10
0
0
500
1
4

  以上面这个表格为例,我们来讲一下筛选逻辑:

1、             首先筛选条件是有优先级别的,比如“地图ID”字段就是被首先判断的条件,如果地图ID不符合条件,那么后面的就根本不看了,但也有特殊情况,比如“所有地图的人形Npc死后都掉落布料”这样的需求,所以需要和程序约定一下,在筛选逻辑中,如果地图Id一项填的是0,那么这项就是对任何地图都适用的。
2、             其次符合筛选条件的记录可能有很多条,我们需要对每条记录Roll一次10000,如果Roll的值在[1,“掉落概率”字段中的值]区间内,则词条掉落被触发。
3、             一条掉落配置被触发,则调用指定的奖励组进行物品生成,生成的次数为“掉落次数”字段中的值。
4、             将所有掉落记录中生成的物品作为此次掉落的最终结果。

  上面就是用奖励库和掉落规则实现掉落系统的基础逻辑。用上面的逻辑,我们能够实现WOW中的一些Boss掉落,比如“MC8号Boss死亡时,掉落两件胸甲和其他一些物品”这种需求,我们只需要配置一个所有职业胸甲的奖励库组,然后在指定MC8号NpcId,在其死亡时用此奖励组生成两次物品就OK了。

  除了掉落系统之外,运用这种模式,我们可以实现很多的功能,比如开宝箱获得物品、分解装备得到材料等等,方法都是一致的。

  这种方法有个好处,就是只要用这套规则搭建起来的系统,其生成物品都是配置在奖励库表格中的,在以后的维护中非常方便查阅,而且程序猿使用的也都是一个接口,方便Debug和监测产量这些,总之好处很多。
4.  物品发放的一些限制

  我们回到开始DNF那个例子中,在生成物品的时候,有时会需要对一些类型的物品产量进行控制,通过上面讲的这套物品发放机制,我们可以明白,只需要设定一些监测机制,就能满足我们的需求,比如:

1、  监测并记录某珍惜物品掉落组被调用的次数
2、  监测并记录某物品Id被生成的次数

  就不再多说了,大家都懂的。

  这篇东西还有一个比较通用的需求没有提到,那就是任务物品掉落,这部分的逻辑以后再不上吧,就到这里了,希望大家指正。

发表于 2013-3-18 23:16:26 | 显示全部楼层
其实没必要这么麻烦啦。
为每件可以被抽中的物品分配一个整数值,作为比重,然后所有物品的比重之和(如果设空奖,还应加上空奖权重)作为随机数上限,1作为随机数下限,随机一下就可以了。比如神器刀比重为1,上品刀比重为50,下品刀比重为1000,空奖比重为2000,那么就随机数1-3051,如果随中1就是神器,2-51就是上品,52-1051为下品,其余就是空奖了。上下限都是用权重累加计算出来的。当产出一个物品后,就在该物品比重中减去1,这样改物品被抽中的概率就会降低,如果允许发放的数量全部发放了,比重就降到了0,就不会产生该物品了。另外,过一定时间后,某项物品的比重增加1,,比如打算1分钟发放一个下品刀,那么就1分钟增加一次下品刀的比重,这样就能连续动态的发放物品了。发放的数量可以在比较长的时间内无线接近预期值。

点评

0.0,你动态修改物品掉落权重的思路对我很有启发 这个方法主要是针对大型客户端游戏的,注重的是清晰性和可维护性  详情 回复 发表于 2013-3-19 13:56
回复

使用道具 举报

发表于 2013-3-19 12:45:21 | 显示全部楼层
喂喂喂~~TN这不是硬盘图么?~~

点评

头目,我用投影仪只能投影自己的帖子啊…………这样怎么推荐别人的帖子啊?  详情 回复 发表于 2013-3-19 13:52
回复

使用道具 举报

发表于 2013-3-19 13:05:10 | 显示全部楼层
看了感觉很有启发呢~
不过对于星际2目前的地图系统,想实现类似这样的奖励或掉落系统基本不可能哎。。
除非BLZ开放在线存档并且给每张地图一个公共服务端。
回复

使用道具 举报

发表于 2013-3-19 13:05:16 | 显示全部楼层
file:///C:/Users/user/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif


大亮~

点评

哎,一样滴邪恶。其实小彬没看懂的呀,毕竟很纯洁嘛。  详情 回复 发表于 2013-3-19 13:59
回复

使用道具 举报

 楼主| 发表于 2013-3-19 13:51:46 | 显示全部楼层
T_T
file:///C:/Users/user/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
这东西怎么处理啊……………………

点评

编辑之即可。  发表于 2013-3-19 13:59
回复

使用道具 举报

 楼主| 发表于 2013-3-19 13:52:24 | 显示全部楼层
麦德三世 发表于 2013-3-19 12:45
喂喂喂~~TN这不是硬盘图么?~~

头目,我用投影仪只能投影自己的帖子啊…………这样怎么推荐别人的帖子啊?

点评

论坛出了bug,部分路人等级丢失了。 你也在其中。我现在加回去了。你可以在帖子最顶部找到投影操作。可以无限投影自己区的帖子,不需要买投影仪。  详情 回复 发表于 2013-3-19 14:24
回复

使用道具 举报

 楼主| 发表于 2013-3-19 13:56:58 | 显示全部楼层
yxxiaobin 发表于 2013-3-18 23:16
其实没必要这么麻烦啦。
为每件可以被抽中的物品分配一个整数值,作为比重,然后所有物品的比重之和(如果 ...

0.0,你动态修改物品掉落权重的思路对我很有启发

这个方法主要是针对大型客户端游戏的,注重的是清晰性和可维护性

点评

其实我也是随便说说了,大型游戏啥的我完全不懂。这个思路能做些小游戏倒是可以满足需要啦,主要是简单嘛。看你写的这些,倒是对此蛮有研究的,有时间的话向你请教一下。  详情 回复 发表于 2013-3-19 14:09
回复

使用道具 举报

发表于 2013-3-19 13:59:11 | 显示全部楼层
chilled 发表于 2013-3-19 13:05
大亮~

哎,一样滴邪恶。其实小彬没看懂的呀,毕竟很纯洁嘛。
回复

使用道具 举报

发表于 2013-3-19 14:09:15 | 显示全部楼层
theninth1985 发表于 2013-3-19 13:56
0.0,你动态修改物品掉落权重的思路对我很有启发

这个方法主要是针对大型客户端游戏的,注重的是清晰性 ...

其实我也是随便说说了,大型游戏啥的我完全不懂。这个思路能做些小游戏倒是可以满足需要啦,主要是简单嘛。看你写的这些,倒是对此蛮有研究的,有时间的话向你请教一下。
回复

使用道具 举报

发表于 2013-3-19 14:24:34 | 显示全部楼层
theninth1985 发表于 2013-3-19 13:52
头目,我用投影仪只能投影自己的帖子啊…………这样怎么推荐别人的帖子啊?

论坛出了bug,部分路人等级丢失了。

你也在其中。我现在加回去了。你可以在帖子最顶部找到投影操作。可以无限投影自己区的帖子,不需要买投影仪。
回复

使用道具 举报

 楼主| 发表于 2013-3-19 14:27:07 | 显示全部楼层
麦德三世 发表于 2013-3-19 14:24
论坛出了bug,部分路人等级丢失了。

你也在其中。我现在加回去了。你可以在帖子最顶部找到投影操作。可 ...

我竟然成了路人?!?!
压力山大啊!

点评

不明真相的TN  详情 回复 发表于 2013-4-9 21:53
回复

使用道具 举报

发表于 2013-4-9 21:45:23 | 显示全部楼层
猫眼石和犹达。还有三位数的地图ID,让我想起了一款早已倒闭的网游,叫做天使。
回复

使用道具 举报

发表于 2013-4-9 21:53:19 | 显示全部楼层
theninth1985 发表于 2013-3-19 14:27
我竟然成了路人?!?!
压力山大啊!

不明真相的TN
回复

使用道具 举报

发表于 2013-4-10 10:11:50 | 显示全部楼层
我们赶快去DNF刷盒子吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-19 00:45 , Processed in 0.329167 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表