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

原创 2004年07月11日 00:20:00

同单机游戏不同的是,一般的网络游戏都需要大量的资源,比如技能、道具、任务什么的,这些东西不可能全部“手工”完成,那样做是极为愚蠢的,我们一般都会使用很多小伎俩来“自动”生成大量的、不重复的东西。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

假设你现在正在做这样一款网络游戏,它需要大量的装备来满足玩家的收集欲望,那么这个自动生成体系有可能是这样的。

 

首先,我们来做一些假设,假设你的游戏是这样的。玩家角色拥有很多项属性,列表如下:

 

力量 敏捷 智慧 体力 攻击力 防御力 HP MP

 

噢,实际的游戏应该比这复杂很多,不过我们只是举个例子来说明,那上面的这个东西就足够了。

 

这个游戏中的装备看起来是这样的,比如有一把叫做 烈火之剑 的东东,当玩家检查它时,会发现上面写着:

力量 + 10

体力 + 5

攻击力 + 20

 

哦,太好了,这把剑不错,其他的玩家马上就会开始寻找这把剑,他们发现杀死某个可怜的哥布林就能得到这把烈火之剑,于是开始行动了。

等等,难道所有的玩家得到的 烈火之剑 都是一模一样、毫无区别的吗?那太没劲了,我们得想点法子来搞点变化出来。

 

首先我们在数值上做点手脚。我们不妨规定,杀掉哥布林时掉出的烈火之剑,攻击力的数值是随机的,比如说,在16~25之间随机。那么,玩家获得的烈火之剑会有10个版本,攻击力从1625不等。

等等,也许你会说,这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 代码来演示本例的这个自动生成系统,后来想想,可能会占用大量的版面,加之我也不太愿意展示我那拙劣的编程水平,不过如果您想更为直观的了解这个自动生成机制,我很乐意向您提供一些质量低下的代码。

微信小程序应用都有哪些

【主要内容:】 1. 如何搜索微信小程序 2.目前发布的小程序都有哪些 一、 如何搜索微信小程序 小程序搜索目前好像还不支持模糊搜索,但是有些非常知名的除外,比如:滴滴、京东。...
  • CrazyZhang1990
  • CrazyZhang1990
  • 2017年01月09日 15:26
  • 1381

java中自动生成编码,例如18位,20位等

/*** * * getCommonBh:(获得通用的编号:前缀(一般是单位的前N位+当前时间(自定义格式)+格式化的sequence值:00001)). * @au...
  • u011410254
  • u011410254
  • 2015年07月21日 20:27
  • 5748

用python自动生成代码

如何用用python解析简单的C++的头文件提取类的元数据,并据此结合模板自动生成代码。这里给出了一个简单的工作实例,希望对有相关需求的同学可以有所帮助。...
  • oowgsoo
  • oowgsoo
  • 2016年07月27日 22:45
  • 3044

根据mysql数据库自动生成mvc三层代码及jsp页,极速开发srpingmvc+mybatis+bootstrap项目。

最近开发web总感觉增删改查,mvc三层重复开发的套路代码太多,于是有了一个想法:能不能一键生成增删改查各层代码,于是开发了这个项目,项目主要的功能:根据mysql数据库(表和字段要有注释)自动生成m...
  • zhou8622
  • zhou8622
  • 2015年12月19日 20:17
  • 6388

android mvp快速开发框架介绍(自动生成android代码工具介绍)

android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 如果不了解这个框架的话请先阅...
  • s297165331
  • s297165331
  • 2016年01月29日 13:25
  • 2405

表单实现表单自动生成工厂

index.html实现代码 task-32     * { margin: 0; padding: 0; } table { position:relati...
  • qq_26297581
  • qq_26297581
  • 2016年05月06日 10:37
  • 1940

理解C语言——从小菜到大神的晋级之路(15)——完结篇:C编程风格

本期视频链接:点击这里 有人说过:“程序源代码其实是跟人阅读的,只是恰好机器可以编译而已”。编程初学者常常会有这样一个观念,就是我的程序只要编译通过了,运行没有问题那就万事大吉了。至于代码的编写规不...
  • shaqoneal
  • shaqoneal
  • 2016年03月28日 21:03
  • 1724

代码自动生成(三)

在上两篇文章中讲述了如何使用freemarker生成代码的方法,在第二篇的代码中存在几个ftl格式的文件,那么在这篇文章中将贴出来对应的代码; 本来是打算在上一篇中完善好直接放上去的,中间因为牵涉到...
  • liunian02050328
  • liunian02050328
  • 2017年07月27日 09:27
  • 190

程序自动生成地图

简介 PCG是程序生成游戏内容的简称,它使用了随机或者伪随机数的技术,给游戏带来了无限的可能。相比于传统的由设计师将游戏世界中的一草一木都精心配制,PCG的方法是去配置一些生成的规则,然后由生成算法...
  • w6316485
  • w6316485
  • 2017年08月04日 11:10
  • 531

用maven插件自动生成mybatis代码

mybatis-generator maven插件用法
  • yinkgh
  • yinkgh
  • 2016年09月12日 14:49
  • 5707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于“自动生成”的一些小伎俩(一)
举报原因:
原因补充:

(最多只允许输入30个字)