— AI分享站

Archive
Tag "难易度"

(ecto真不好用,居然写得东西都没了,害我只能把这篇文章再写了一遍,郁闷啊,跪求一个mac下的支持wordpress的离线博客编辑软件)

提到参数,在我们写程序的时候,作为一个常用的提醒是,一般都会避免去使用“魔数”(Magic Number),因为它含义不清,比如if(i>5){...},如果没有任何注释的话,很难有人会理解这个“5”是什么意思。在AI中,这样静态的参数的使用更频繁,有时为了定义一些阈值,有时为了可以给游戏设计人员调整AI行为等等,当这些参数慢慢多起来的时候,就需要更好的来管理,修改和查看,所以,如何设计一个好的参数系统就很有必要了。这个想法也源自我上一个项目的一些教训,在上个项目中,我们最后一共定义了超过1600个参数,由于历史原因,由一个简单的参数系统来维护,但实际操作中,这样的简单系统存在很多问题,首先参数没有很好的文档化,导致游戏设计人员很难搞清楚这个参数到底是干什么的,最后需要程序员的不停参与,工作的粘合度就提高了,另外也没有做到逻辑的关联,无法了解这些参数之间的相互关系。总之,这样那样的问题促成了我对于设计一个新的参数系统的想法。

相较与原来那个参数系统的种种问题,对于一个新的参数系统,我希望它能有如下的特性:

  • 仅支持静态的参数:对于游戏来说是只读的,也就是游戏在运行时不允许修改这些参数,但可以通过外部工具进行调试
  • 支持文档化
  • 支持实时的修改:不需要重新启动游戏
  • 支持序列化到文件:可以将调整好的参数存成文件,以便下一次启动游戏时生效
  • 支持逻辑关联
  • 支持自动的合法性检查
  • 高效和便捷的定义和调用

以上列出的大部分特性还是比较容易理解的,对于第5点,我特别的说明一下,假设有一个参数A,当A的值发生变化的时候,逻辑上,参数(B1, B2, B3, … , Bn)也会相应发生变化,那我们就称A和(B1, B2, B3, … , Bn)有“逻辑关联”,也就是A的变化会影响到(B1, B2, B3, … , Bn)的值,反之不成立,也就是说,逻辑关联是单向的。举个例子,比如我们有一个可以调整游戏难度的参数,它关联到敌人的血量,攻击值,防御值,当把游戏难度调成“高”时,血量,攻击值,防御值会加倍,当把游戏的难度调成“低”时,血量,攻击值,防御值会减半。在我们原来的参数系统中,这种逻辑关联是隐含的,也就是说所有的参数并没有直接的相互关联,他们的结构是“平面化”的,彼此相互独立,所以当游戏设计人员想调高游戏难度的时候,他就需要记得相应的要去调整血量,攻击值,防御值。这样很容易造成错误和疏漏,而且这种隐含的逻辑关联无处可循,只能存与程序员活或者游戏设计人员的脑海中。

针对我们的需求,我定义了一个参数P所需要包含的各个部分

  • 可识别的名称
  • 当前值:该参数当前的值(一定是合法值),供游戏读取
  • 参数类型:表示这个参数是离散型的,还是连续型的
  • 上下限数组:给连续型参数检查合法性使用,如果值不在取值区间中,则为不合法的参数值,用数组的原因,主要是可能有多个取值区间,[Vmin1, Vmax1], [Vmin2, Vmax2], … , [Vminn, Vmaxn]
  • 候选值数组:给离散型参数检查合法性使用,如果值不在候选值数组中,则为不合法的参数值。
  • 参数描述:对于该参数的简要描述
  • 趋势描述:对于该参数的变化所带来的影响的简要描述
  • 逻辑关联项数组:该参数所影响的参数项列表(P1, P2, … , Pn)
  • 被逻辑关联项数组:能影响该参数的参数项列表(P1, P2, … , Pn)

作为补充说明,对于上下限的定义,还需要有一个标志来表示是开区间还是闭区间。在逻辑关联项的数组中,和每个参数项还需要绑定一个非常重要的“关联方式”的实现。关联方式是非常灵活的,可能非常简单,就像我们前面举的那个例子,仅仅是加倍和减半,但有时可能非常复杂,有更多的逻辑计算,所以,我想可以调用一段代码来计算关联方式,可以是虚函数,也可以是一段脚本。更新关联项的方式是递归的,直到所有的关联项都被更新为止。文档化有几个部分组成,一个是名称,要求要可以识别,一个是两段描述,这两个部分很难做到要写成什么格式(文档的东西一般都是自觉自愿),但作为规范是要求定义参数的人能详细填写的,另一个部分就是关联项和合法性提示,这个可以用代码来生成文档信息(试想一下开发环境中的代码提示功能)。

我想,有了这样一个参数结构的定义,要实现一个参数系统来满足我上面的要求,并不是一件很难的事情,当然现在的这些只是我一个粗略的想法,还没有实现,有兴趣的同学可以实现一个,我有时间的话,也会做一个出来,因为它很独立,可以作为第三方库用在任何的引擎中,实现技巧的话,我想用“反射”(Reflection)做的话,对于序列化,对于做一个可视化的编辑器,对于文档化,都是挺有帮助的,值得一试。

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More

游戏AI和游戏设计紧密相关,我也经常说,一个好的游戏AI,不在于算法的艰深和行为的完全拟真,而在于和整体游戏性的契合,在平时工作中,也是和游戏设计师打交道的最多,有这样一句话,一个好的AI程序员相当于半个游戏设计师 :) ,所以这次就来谈谈关于AI难度的设计问题。

谈到游戏设计,有些人觉得可能是灵光乍现的东西,只可意会不可言传,我以前也是这么认为的,但去年以AI程序员身份参加了一个为期两周的设计培训课程,感到收获颇丰,原来游戏设计通过总结前人对于游戏设计的实践,是可以形成一系列科学有效的方法的,好的游戏都有一些共性在里面,所以像《愤怒的小鸟》,《植物大战僵尸》这种游戏的成功,也绝不是偶然的。虽然在分工上,设计大部分都是游戏设计师的职责,但作为AI程序员,有时需要给出一些技术上的建议,并能提供一些技术上的支持。这次提到的关于AI难度的设计,也是我最近遇到的一个问题,我想如果运用一些科学的方法,就可以在设计时明确AI的方向和做法,这样对开发是有相当的益处的。

先假设一个场景,如下图所示(P代表玩家,E代表敌人,黑色的块代表障碍,黄色的圈代表目标),这是一个潜行类的游戏,游戏目的是控制游戏内的主人公拿到敌人基地内的情报图,而敌人会在基地内不停的巡逻,如果被发现就会Game Over。假设我们要做成关卡类的游戏,每一关都会比前一关难一点,关卡中的AI行为也要有难易之分。那作为AI程序员,自然就要去思考如何来AI的难度变化,来符合游戏设计人员的需要。

DifficultyOfAIs

当我们设计敌人的AI的时候,会先考察有多少因素会影响到敌人的AI难度,这些因素也是我们可以提供给关卡设计师的,值得说明的是,我们只考量AI层面的难度,不考察由关卡本身带来的难度,因为显而易见的一些因素,诸如敌人数量,敌人出生位置,障碍的位置等等,也是可以增加或者减少关卡难度的,虽然说我们在这里不考虑这些因素,但这些因素也是可以用我接下去的设计方法来设计的。

好,继续我们的AI难度设计,我们仔细分析问题之后,会列出如下可能影响到AI难度的因素

  • 巡逻方式:静止的,可预判的,不可预判的
  • 巡逻范围(用巡逻路线长度衡量):0,4米,8米,12米,无穷
  • 视野角度:0度,30度,60度,90度,120度,360度
  • 视野范围:0米,1米,3米,5米,7米,无穷
  • 移动速度:0米/秒,2米/秒,4米/秒,6米/秒,10米/秒
  • 声音感知范围:0米,1米,3米,5米,无穷

上面的这些因素后面的取值,都是由简单至难依次递增的,特别值得注意的一点是,每一个因素的第一个值都是最简单的情况,可以称之为“空值”,最后一个值是最不可能的情况,一般称之为“无穷值”,在空值和无穷值之间的值,是根据需求,按经验定义的,一般情况下(除巡逻方式外),我们不会取空值和无穷值。就拿“视野角度”这个因素来说,它的空值就是0度,表示这个敌人没有视野,它的无穷值是360度,表示这个敌人能看到周围所有的东西,在这之间的值都是比较合理的视野角度,可以任意取用。

有了这些因素,我们就可以用一张二维的表格来定义各种难度下的AI设置了,如下面这个表格

  巡逻方式 巡逻范围 视野角度 视野范围 移动速度 声音感知范围
AI1(新手) 静止 4米 30度 1米 2米/秒 1米
AI2(简单) 可预判 8米 60度 3米 2米/秒 1米
AI3(中等) 可预判 8米 90度 5米 4米/秒 3米
AI4(困难) 可预判 8米 120度 7米 6米/秒 3米
AI5(超神) 不可预判 12米 120度 7米 6米/秒 5米

这里我们通过设置不同的因素值,定义出了5种难度的AI设置,当把这些AI放入关卡中后,就会对关卡的难度产生影响,也帮助了关卡设计师来更好的设计和调整关卡的难度。

当然,作为AI程序员,可能我们并不需要参与到最后的关卡难度设计,但这样的设计方式,我觉得,是值得我们学习的,也可以帮助我们在实现AI的过程中,辅助游戏设计师,定义出可控的参数来,做到参数化的AI控制。我在现在的项目中,经常听到玩家的一些抱怨,什么AI太难啦,AI太简单啦什么的,而且有时游戏测试人员也需要一种“傻AI”模式来帮助他们测试,所以,如果我们能在实现AI初期,就把一些能够控制AI难度的因素定义出来,那也可以更好的来使我们的AI行为更可控,何乐而不为呢?

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More