您的位置:首页 > 理论基础 > 计算机网络

关于“自动生成”的一些小伎俩(一)

2004-07-11 00:20 337 查看
同单机游戏不同的是,一般的网络游戏都需要大量的资源,比如技能、道具、任务什么的,这些东西不可能全部“手工”完成,那样做是极为愚蠢的,我们一般都会使用很多小伎俩来“自动”生成大量的、不重复的东西。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
假设你现在正在做这样一款网络游戏,它需要大量的装备来满足玩家的收集欲望,那么这个自动生成体系有可能是这样的。  
首先,我们来做一些假设,假设你的游戏是这样的。玩家角色拥有很多项属性,列表如下:  
力量 敏捷 智慧 体力 攻击力 防御力 HP MP  
噢,实际的游戏应该比这复杂很多,不过我们只是举个例子来说明,那上面的这个东西就足够了。  
这个游戏中的装备看起来是这样的,比如有一把叫做 烈火之剑 的东东,当玩家检查它时,会发现上面写着: 力量 + 10 体力 + 5 攻击力 + 20  
哦,太好了,这把剑不错,其他的玩家马上就会开始寻找这把剑,他们发现杀死某个可怜的哥布林就能得到这把烈火之剑,于是开始行动了。 等等,难道所有的玩家得到的 烈火之剑 都是一模一样、毫无区别的吗?那太没劲了,我们得想点法子来搞点变化出来。  
首先我们在数值上做点手脚。我们不妨规定,杀掉哥布林时掉出的烈火之剑,攻击力的数值是随机的,比如说,在16~25之间随机。那么,玩家获得的烈火之剑会有10个版本,攻击力从16到25不等。 等等,也许你会说,这10个版本出现的概率是相等的,都是 1/10,也许为了某种游戏的平衡,我需要更多的控制权,比如说,我希望它们出现的概率是这样的:  
16           17           18           19           20           21           22           23           24           25 0.055      0.065      0.075      0.085      0.095      0.105      0.115      0.125      0.135      0.145  
程序员觉得这样太麻烦了,于是你决定使用某个函数来统一的描述概率和攻击力之间的关系,f(x) = (x-15) * 0.01 + 0.045 ,嗯,现在看起来它工作得不错。  
我们马上就要涉及到一个很重要的问题,那就是在设计这种自动生成机制时,需要做到什么样的程度。 我们的目的是让机器自动生成,这样做的好处是减少了“手工”的工作量,但是却是以失去一定的控制权为代价的。到底要做到什么样的程度,是一个需要好好权衡的问题。在上面的例子中,可以认为在大多数情况下,让10个版本的烈火之剑以相同的概率出现,已经能够满足我们的要求了,我们无须为了获得更多的控制权,而去手动制定每一种情况出现的概率,或者去拟定什么公式,这样做实际上又增加了我们“手工”的工作量,来换取对系统的控制权。 请不要纠缠于我所举的这个具体例子,你可以说是用公式来控制是必要的。我只是要说明,“度”是非常重要的,请仔细考虑你所面临的具体的情况,自行取舍。  
好了,接着我们上面的例子继续说。  
仅仅是数值上的简单变化还不足以满足玩家的需要,他们很快发现,无论如何努力,他们获得的烈火之剑总是10个版本中的一个,他们有被愚弄的感觉,这可不妙。  
我们可以进一步,在数据项上再做点文章,比如说:有些版本的烈火之剑只有一项属性:  
攻击力 +25  
而另一个版本的烈火之剑有多项属性: 攻击力 + 18 力量   + 5 体力   + 10 MP    + 20  
嗯,让我们考虑一下如何拟定一套规则,让系统能够自动生成拥有不同数据项的烈火之剑。 我们直观的想到了用一个数据来控制有多少项属性会出现,不过你看,对于一把剑,我们总会让“攻击力”这一项出现的,所以我们不妨把出现的项分为两类:基础项和附加项,而刚才我们要添加了这个数据是用来描述有多少个附加项会出现,而且,这次我们给定一个表格来说明了它们各自出现的概率。  
现在看起来我们做出了一个 烈火之剑 的“模版”,它可以按照一定的规则生成大量不重复的烈火之剑。  
烈火之剑 模版  
基础项                  最小值                  最大值 攻击力          16                         25 附加项        力量              5                          10        体力              8                          16        HP                 10                         25        MP                15                         30 概率表        0            1            2            3            4        0.5          0.2          0.15        0.1          0.05  
按照我们规则,有0.5的概率掉出的烈火之剑将只有攻击力一项属性,而仅有0.05的概率掉出一把拥有5项属性的烈火之剑(1个基础项,4个附加项)。有0.15的概率掉出有2个附加性的烈火之剑。 嗯,我们还需要制定一条规则。当决定有两个附加项时,到底应该在4个附加项里取那两项呢?我们可以简单的认为每个附加项出现的概率是一样的,那么4个附加项里选取两个,将会有6种情况,也就是这6种情况出现的概率全部相等,都是1/6。  
看起来我们的任务已经完成了,这个自动生成机制似乎工作得很好,我们只需要少量的工作(填写一个模版),就可以生成很多把不同的烈火之剑(你可以自己算算到底有多少把)。  
但是从直觉上我并不满意现在的这个东西,总觉得哪里少了点什么,思考片刻后我觉得那个用来描述有多少个附加项出现的东西有点蹩脚,之后还添加了一个概率表,而他们做出来的还会让每个数据项出现的概率都相同,我决定做一些小小的改动,改动后的模版看起来是这样的:  
烈火之剑 模版  
基础项                  最小值                  最大值 攻击力          16                         25 附加项                                                                   概率        力量              5                          10                  50%        体力              8                          16                  30%        HP                 10                         25                  20%        MP                15                         30                  5%  
我们给每个附加项添加了一个叫“概率”的东西,生成规则也改了:对每个附加项都进行一次运算,在0~1之间取一个随机数,如果大于概率,则生成的烈火之剑就用这项属性。 和改动前相比,这种做法几乎没有增加日后的工作量,但是却获得了更多的系统控制权,我很满意这次改动。 好了,这个例子举玩了,我们的自动生成系统也完成了。  
和一个实际游戏项目中的实例相比,这个例子过于简陋,实际的情况会比这复杂得多,需要考虑的东西也要多得多。但是,我希望读者通过阅读这篇文章获得3点认知:首先,在你的游戏中设计一些“自动生成”系统是非常有必要的,你不可能全部手动完成所有的东西;其次,掌握“度”是很重要的一件事,做出合适的选择不是很容易,这需要丰富的经验和良好的大局观;再次,本文简单地演示了一下一种迭代式的设计方法,如何一次次的改进前一步的设计,让它越来越完善,越来越优雅。  
又:本来想附上一段 python 代码来演示本例的这个自动生成系统,后来想想,可能会占用大量的版面,加之我也不太愿意展示我那拙劣的编程水平,不过如果您想更为直观的了解这个自动生成机制,我很乐意向您提供一些质量低下的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息