1、FACULTY OF SOFTWARE1游戏开发中人工智能-脚本AI及脚本引擎游戏开发中的人工智能第1页FACULTY OF SOFTWARE2脚本概述脚本引擎实例AI脚本语言危险开发脚本语言注意事项脚本AI及脚本引擎游戏开发中的人工智能第2页FACULTY OF SOFTWARE3脚本概述脚本概述概述开发脚本语言动机脚本语言剖析编译器游戏开发中的人工智能第3页FACULTY OF SOFTWARE4脚本是为了简化某种特定程序复杂任务而设计一个编程语言。所以,脚本是依据程序特点定制,它使用范围在很大程度上取决于所需要处理问题。脚本机制能够说是游戏开发过程中不可或缺一部分,它能够让游戏设计师而不
2、是游戏程序员撰写出游戏巧妙之处,并给予精细化。玩家也能够利用脚本语言,建立或修改其所处游戏世界或等级。脚本系统怎样及怎样操作,主要取决于该系统使用者。开发脚本系统时还应该考虑其它原因,比如:加密、开发描述编译器等,使得最终结果难以让人阅读。脚本概述游戏开发中的人工智能第4页FACULTY OF SOFTWARE5并行开发:脚本语言能够允许设计人员在独立于程序开发人员情况下结构很多新特征并做修改。易于使用:脚本语言提供了一个比专业编程语言更简单,开发环境更受保护工具。数据驱动设计开发速度快安全性:脚本语言在一个受保护环境中运行,能够确保脚本内致命错误不会使游戏瓦解,最坏情况就是脚本被停顿执行。可
3、扩展性:允许游戏使用者扩展AI开发脚本语言动机游戏开发中的人工智能第5页FACULTY OF SOFTWARE6一个脚本语言通常由两部分组成:语言和引擎脚本语言与任何一个编程语言一样,要求了一组特定语法,脚本语言能够经过转化或编译变换为引擎能够处理格式。脚本引擎也称为解释器,用来执行经过编译脚本。经过编译脚本称为字节码流(bytecode stream),它包含了脚本需要解释器所执行全部内容。脚本语言剖析游戏开发中的人工智能第6页FACULTY OF SOFTWARE7编译器概述词法分析器语法分析器代码生成器语法分析树游戏开发中的人工智能第7页FACULTY OF SOFTWARE8编译器概述
4、编译器负责把开发人员编写源文件转化为计算机能够执行代码。脚本语言编译器与传统编译器直接产生可执行代码不一样,它生成字节码流,字节码流包含了脚本需要解释器所执行全部内容。游戏开发中的人工智能第8页FACULTY OF SOFTWARE9编译器转换步骤:词法分析器首先用来处理词组,读入源代码,然后把它们分解为一些基本单元,即脚本语言中任何一个单独结构(construct),称为Token。比如:-,*,=,if,void,MyFunction。Token被传送给语法分析器。语法分析器负责定义语言合理结构,确保当前脚本是一段合理程序,负责把脚根源代码转换为编译器能够了解结构,即语法分析树。语法分析树
5、被交给代码生成器生成字节码流。代码生成器递归地遍历整个语法分析树以处理其中每一个节点,并生成对应能够执行命令。游戏开发中的人工智能第9页FACULTY OF SOFTWARE10语法分析树语法分析树是程序员所写脚根源代码另一个表现形式,它能被编译器所了解。因为绝大多数编程语言都是高度结构化,所以它们能被表示为一个树状结构。树上每一个节点都对应了语言中一个结构类型(比如,条件语句,函数调用,表示式等),这些节点子节点是对应语言结构所需要操作数。游戏开发中的人工智能第10页FACULTY OF SOFTWARE11语法分析树游戏开发中的人工智能第11页FACULTY OF SOFTWARE12脚本
6、引擎堆栈机堆栈机执行控制代码流游戏开发中的人工智能第12页FACULTY OF SOFTWARE13脚本引擎堆栈机任何一个脚本语言都需要一个用来执行程序员所编写脚本引擎,即翻译器,负责脚本执行各个方面工作。因为翻译器执行指令集并不是特定汇编代码,所以称之为虚拟机(VM),负责执行编译器所生成字节码流。堆栈机是脚本语言虚拟机技术中普遍采取一个基本形式。堆栈机操作码首先从堆栈中弹出将被操作数据,然后把得到答案压入同一个堆栈中。不停重复该过程,直到整个字节码流都被执行后结束。由此可知,操作仅需要堆栈和指令指针(用来指向字节码流中将被执行下一条指令)。游戏开发中的人工智能第13页FACULTY OF
7、SOFTWARE14实现堆栈机最直接方法就是结构一个类,包含堆栈数据,指令指针以及用来处理各种操作码逻辑过程(操作码处理器)。操作码处理器是结构堆栈机关键,它负责处理每一个操作码所需要工作。因为每一个操作码处理器是类中唯一一个组员函数,能够经过一个函数指针表来正确地调用。操作码值由堆栈机定义,它需要定义从0开始连续整数,来作为函数指针表索引。每个操作码处理器都返回一个布尔变量来表明操作码所定义操作是否成功,若操作失败则停顿对字节码流执行,调用错误恢复程序后清空。脚本引擎堆栈机游戏开发中的人工智能第14页FACULTY OF SOFTWARE15堆栈机比如:Class VM bool Handl
8、ePush(Opeode op)/.typedef bool(VM:*OpcodeHandler)(opcode);OpcodeHandler m_opHandlersNnm_opcode;每个函数处理器被OpcodeHandler定义,都以一个操作码为参数。经过把当前指令操作码传递给处理器,对应不一样操作就分别调用某个固定处理器来执行。游戏开发中的人工智能第15页FACULTY OF SOFTWARE16堆栈机中还包含一个堆栈数据组员,用来存放各种操作所需操作数。因为STL容器向量提供了常数时间插入和删除操作,而且对于每一个数据项随机访问操作都是常数时间,所以非常适适用来结构这种堆栈。堆栈机
9、中还包含一个指令指针,指令指针一直指向所需执行下一条指令,表现为指向字节码流操作码指针。脚本引擎堆栈机游戏开发中的人工智能第16页FACULTY OF SOFTWARE17初始化,即清空堆栈、将指令指针指向字节码流起始位置。进入循环,依次执行每条指令。首先,指令指针所指向操作码被取得,作为索引传递给操作码处理器用来调用正确操作处理函数。循环直到整个字节流码被执行完成后结束。操作码处理器完成堆栈操作全部细节,比如:出栈、入栈、相加操作等。堆栈机执行游戏开发中的人工智能第17页FACULTY OF SOFTWARE18控制代码流条件语句对于简单条件语句,即只含有条件为真时所执行程序块。首先得到条件
10、表示式取值,然后把它压入堆栈顶部,接着执行“为0时跳转”操作,即首先把堆栈顶部操作数弹出,若值为假,则按照字节流码中给出偏移量进行跳转(跳到条件语句后第一条语句);若值为真,则执行条件语句中程序块。对于含有条件为真和为假程序块而言,偏移量指向条件表示式为假时所需执行程序块第一句。编译器会在条件表示式为真时,所需执行程序块结束地方,生成一条相对跳转语句,用来跳过紧跟在后面条件为假时所需执行程序块。游戏开发中的人工智能第18页FACULTY OF SOFTWARE19控制代码流循环语句循环语句执行时混合使用条件转移和相对转移指令。比如:C格调for循环会生成以下伪汇编代码:Perform prel
11、oop expression.A:Perform loop conditional expression.Jump to label B if top-stack element is zero.Perform loop body statements.Perform loop incremental expression.Jump to label A.B:First statement after the for-loop.游戏开发中的人工智能第19页FACULTY OF SOFTWARE20控制代码流函数因为当函数执行完成时需要返回到调用它代码所在位置,所以虚拟机需要经过维护一个指令指针
12、地址堆栈来对函数调用状态进行跟踪,方便当函数返回时对指令指针值进行更新。即当函数被调用时,当前指令指针值被压入这个堆栈顶部,然后函数中第一条指令地址值被赋给指令指针。当函数执行完成时,函数堆栈顶部数据被用来重置指令指针值,方便程序执行回到函数调用地方。虚拟机用堆栈帧(stack frames)来存放函数返回值、参数和局部变量。经过帧指针(frame pointer)指向第一个局部变量来访问堆栈帧中任何参数和局部变量。处于激活状态堆栈帧都维护在一个链表中,而且被保留在调用堆栈(call stack)中,调用堆栈中包含每个堆栈帧指针和指令指针。游戏开发中的人工智能第20页FACULTY OF SO
13、FTWARE21实例指定对手属性:决定原因是游戏类型脚本基本分析影响对手行为增加预先定义好全局变量,并由游戏引擎赋值,以评定游戏世界里特殊情况。AI角色移动口语互动口语嘲讽辅助暗示触发事件及增加气氛游戏开发中的人工智能第21页FACULTY OF SOFTWARE22AI脚本语言缺点语言成熟性:改进、开发工具、参考手册缺乏含有完全特征开发、调试和统计工具脚本都是在运行时进行解释,所以含有更大性能负担固定性AI脚本会使得游戏重玩性大大降低设计正确界面(编辑器)设计者与AI交互决定AI实体初始位置、提供附加AI实体参数、指定运动路径、指定AI实体之间或AI实体和游戏中对象关系、设计偶然被触发事件游戏开发中的人工智能第22页FACULTY OF SOFTWARE23开发脚本语言注意事项注意被固化在AI中能力,假如AI能独立地做越多工作,则脚本语言所需补充东西就越少脚本语言是否适当需求是否需要一个特征完备编程语言还是一个简单触发系统考虑使用已经有编程语言考虑设计者能够使用调试工具考虑运行时性能问题注意所开发出脚本灵活性游戏开发中的人工智能第23页