傲世苍龙 发表于 2003-3-8 19:39:25

SonicX 的AI教程

SonicX 的AI教程

AI脚本制作教程(不权威指导)—第一章 入门
(本人前些时候写的教程可能有些错误,所有内容以此篇为准)

帝国时代2中的战役编辑器给于广大玩家新的空间,能够按自己意愿创造出属于自己风格的
战役,而其中又以RPG类较为出色。由于帝国时代2设计初衷是为战斗,讲究快速出兵彻底消
灭敌人,而作为RPG却恰恰相反。好在微软考虑的很周到,我们可以编写自己的AI脚本来弥
补上述的困惑。
★当你在阅读本教程时最好能同时对照CPSB.doc文件,他包含在帝国时代2 CD安装光盘
内。

第一步 如何创建AI文件

1、在帝国时代2的AI目录下创建2个文件,分别为
创建 文件1 my_ai.ai
创建 文件2 my_ai.per

2、使用Windows自带的“记事本”程序打开my_ai.per

3、在内写入:
(defrule
(civilian-population == 3)
=>
(chat-to-all "My first rule")
)

4、保存这个文件

5、启动帝国时代2的随机建立一个地图(不做任何改动),在“玩家”设置中把2号玩家中
的“个人”选项设为my_ai

6、测试,然后就能看到2号玩家循环提示的“My first rule”


第二步 理解规则
什么是“rule”,英文解释为规则。让我们看看规则是怎样的
(defrule ; 起始规则
(civilian-population == 3) ; 一个事实或一个条件
=> ; 这总在事实和方式之间
(chat-to-all "My first rule") ; 这是方式
); 结束规则
★“;”符号后面的文字在执行时将被忽略,一般用来为脚本写注释

现在我们可以得出规则的框架即
(defrule
(事实或条件)
=>
(方式)
)
当事实为true(真)则执行,反之fales(假)则不执行。
为了更好的说明这个规则,我们以Visual Basic的句式来套用一下
(defrule ; if
(事实) ;事实为true
=> ;then
(方式) ; 执行某个方式
)
这是AI执行时唯一个规则,没有事件写在此规则以外。AI可以看做是规则的集合,如果你知
道什么是规则就能看懂AI脚本。

第三步 理解“事实”(CPSB.doc第17页)
Facts即事实。事实只有2中形态即true和fales(在AI脚本中true将永远为true,false也永
远为false。因此当一个规则为true时,将循环不断的执行。类似“多层触发”)
假设
事实: 这里有3个村民
如果有更多或不足3名村民,则这个事实为false
如果刚好有3个村民,则事实为true
但AI并不知道当有3个村民时要他做什么。我们需要使用AI脚本专用的语言来告诉他。对于
大小等量关系AI中解释为(rel-op)
(rel-op) 的形态有
== 相等
!= 不相等
< 小于
> 大于
<= 小于或等于
>= 大于或等于
你可以试着改写上面的例子:
(civilian-population == 3) ; 正好有3个村民
(civilian-population != 3) ; 正好不是3个村民
(civilian-population < 3) ; 小于3个村民
(civilian-population > 3) ; 大于3个村民
(civilian-population <= 3) ; 小于或等于3个村民
(civilian-population >= 3) ; 大于或等于3个村民
看看各中情况。

你可以有多个事实,他们之间的连接方式解释为"and"
例如:
(defrule
(military-population == 1)
(civilian-population == 3)
=>
(chat-to-all "我有1个军事单位及3个村民")
)
这条很容易解释:当有1个军事单位及3个村民则送出聊天通知大家

第四步 理解“方式”(CPSB.doc第35页)
Actions(方式)很容易理解,典型的有
(attack-now) ;进攻
(train villager) ;产生一个村民
(build barracks) ;建造一个兵营
(chat-to-all ) ;送出聊天
例子:
(defrule
(civilian-population == 3)
=>
(attack-now)
(chat-to-all "开始进攻,但没有军事单位……")
)

(defrule
(civilian-population == 3)
=>
(train villager)
(chat-to-all "开始训练一个村民")
)
打开my_ai.per,删除前面的例子将这个例子写入测试效果
很容易理解不是吗?

第五步 填写参数 (CPSB.doc第46页)
系统的讲解完AI脚本规则,是否能看懂AI脚本格式了呢?如果回答是“YES”接着往下看本
章的最后一节
在CPSB.doc第17页你可以看到如下一行
attack-soldier-count
在<....>内的在这里解释为Parameters(参数)。参数是必须填写的项目,自CPSB.doc第46
页起是参数目录,可以对照填写。
例如:
前面提到的
(train villager) 解释为训练一个村民
我们在CPSB第36页查得为
train
值可以在CPSB第56页找到对应的单位

总结:本章叙述了AI脚本的制作方法及语句规则,下一章将对更深入介绍AI脚本制作中复杂
规则
---------------------------------------------------------
AI脚本制作教程(不权威指导)—第二章 进阶深入

(本人前些时候写的教程可能有些错误,所有内容以此篇为准)

★当你在阅读本教程时最好能同时对照CPSB.doc文件,他包含在帝国时代2 CD安装光盘
内。

上一章讲述了如何创建一个AI脚本文件,这章将接着上一章节阐述AI脚本制作中一些较为高
级的语法

第一节 如何引用其他AI脚本文件

制作复杂的AI脚本时,往往有很多单元,我们应该养成分类书写的习惯。一般可以分为内政
(资源开发)、外交(同盟等)、战斗(进攻)及贸易等多个部分。
如果把他们写在一个AI脚本中文件会非常臃肿及难以修改,因此在AI脚本用引入了
(load "filename")语法
(load "filename") 非常容易
例如
(load "my_ai2")
这样"my_ai2.per"文件在游戏时会自动整合到原先的AI脚本中

第二节 随机引用AI脚本

在制作高级战役时,如果能产生点随机发生的事件这对游戏者有着更大的吸引力!AI脚本考
虑的非常周详,一样引入了随机事件加载能力
(load-random
20 "filename1"
10 "filename2"
40 "filename3"
"filename4")
即为随机加载模式语句,这个例子解释为"filename1.per"有20%的机会被加
载、"filename2.per"有10%的机会被加载、"filename3.per"有40%的机会被加载、当前面的
文件都未被加载时则加载"filename4.per"。这里要说明的是随机机会的总和不要超过100,
否则容易引起系统错误导致当机!

第三节 按条件加载需要的函数模块或AI脚本

有时在制作AI脚本时常常需要设想玩家会以什么方式开始游戏或者用什么类型的地图或什么
难度开始游戏。在AI脚本中专门设置了一个判断函数来识别这些问题
#load-if-defined
#load-if-not-defined
#else
#end-if
这个句式学过些VB编程语言的朋友应该很眼熟,其实就是VB句式转换。举个简单的例子
#load-if-defined DIFFICULTY-EASIEST
(defrule
(true)
=>
(chat-to-all "Easiest")
(disable-self)
)
当你用“非常容易”这个难度开始游戏就会冒出这句

参数有很多常量,可以分为

Game Type(游戏模式):DEATH-MATCH(死亡模式),REGICIDE(弑君模式)
Starting Age(开始年龄):DARK-AGE-START,FEUDAL-AGE-START,CASTLE-AGE-START,
MPERIAL-AGE-START,POST-IMPERIAL-AGE-START
Starting Resources(开始资源):LOW-RESOURCES-START(低),MEDIUM-RESOURCES-
START(中),HIGH-RESOURCES-START(高)
Map Size(地图大小):TINY-MAP,SMALL-MAP,MEDIUM-MAP,NORMAL-MAP,LARGE-MAP,
GIANT-MAP
Map Type(地图类型)
Victory Type(胜利模式)
Difficulty(难度):DIFFICULTY-EASIEST,DIFFICULTY-EASY,DIFFICULTY-MODERATE,
DIFFICULTY-HARD,DIFFICULTY-HARDEST,
Population Cap(人口上限)
Game Speed Lock(游戏速度):GAME-SPEED-LOCKED(速度锁定)
Team Lock(组队模式):TEAMS-LOCKED(组队锁定)
Player’s Civ(游戏民族)

自CPSB.doc第14页开始有完整的常数列表,在这里就不一一说明了。

第四节 自定义常量

设置常量可以增加AI脚本的易读性,特别是较为庞大的AI脚本合理设置常量对于修改完善自
得AI脚本都很有帮助!
(defconst )就是常量的设置格式
举个例子
(defconst my-villagers 3)

(defrule
(civilian-population = my-villagers)
=>
(chat-to-all "我有3个村民啦!")
)

很简单吧

第五节 设置目标方案

Goals(目标)是AI脚本中最实用及最方便的函数!语法为:
goal (这是事实)
set-goal (这是方式)
设置范围为1~40
设置范围为1~100

既然这么好用,那怎么使用呢?还是用例子来说明吧
;********** 规则 1: 生产 20 村民
(defrule
(unit-type-count-total villager < 20)
(can-train villager)
=>
(train villager)
)

;********** 规则 2: 当有20个村民时设置目标信号1-1
(defrule
(unit-type-count-total villager >= 20)
=>
(set-goal 1 1)
)

;********** 规则 3: 如果目标信号1-1, 建立民兵
(defrule
(goal 1 1)
(unit-type-count-total militiaman-line < 10)
(can-train militiaman-line)
=>
(train militiaman-line)
)

;********** 规则 4: 当有10个民兵时设置目标信号1-2
(defrule
(current-age == dark-age)
(unit-type-count-total militiaman-line >= 10)
=>
(set-goal 1 2)
)

;********** 规则 5: 目标信号1-2时, 升级到封建时代
(defrule
(goal 1 2)
(can-research feudal-age)
=>
(research feudal-age)
)
怎么样?一个系统的升级模块就这样完成了!能够习惯使用“goal”函数对于模块化开发AI
脚本很有帮助!

第六节 计时器的应用

计时器在战役编辑器中的触发指令里也有,2者在原理上基本是一致的,在这里介绍用AI中
的计时器如何不段的发动进攻指令
计时器的语法:
timer-triggered (事实)
disable-timer (方式)
enable-timer (方式)
的使用方法为:计时器编号(1-10个) 时间(按秒计算)

具体看例子:
;********** 规则 1: 打开计时器,设定为300秒
(defrule
(true)
=>
(enable-timer 1 300)
)

;********** 规则 2: 当300秒到后发启一个进攻指令,并且以后每300秒都发启一次进攻
(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(chat-to-all "现在开始进攻")
(attack-now)
(enable-timer 1 300)
)

第七节 与触发机制互交应用

在地图编辑器中有2个指令一个为“AI信号”还有一个是“AI剧本目标”,这2个就是用来与
AI脚本互交的
具体语法包括:
(event-detected ) (收到一个AI信号)
(acknowledge-event ) (接受AI信号,并注销)
set-signal (发送一个AI信号)

参数说明:
只有一个形态即 trigger
可以设置为1~255中任意数值,以对应触发中的255个事件
可以设置为1~255中任意数值,以对应触发中的255个事件

例子
(defrule
(event-detected trigger 1) ;接受到AI信号1
=>
(acknowledge-event trigger 1) ;承认这个AI信号,并注销(千万要注销,否则会不停的
重复运行)
(set-signal 1) 向触发系统回应一个AI信号1
)

特别需要说明的:AI信号不存在玩家的概念,也就是说当任何一个玩家发送了AI了信号,那
所有的玩家都会接收到这个信号,如果所有的玩家使用同一个AI脚本则可能同时回应这个AI
信号。

总结:本章介绍了AI脚本中一些高级的语法,如果能巧妙运用这些规则及函数那对于AI脚本
编辑无疑又迈出了很大一步!下章将介绍一些实用的“Facts”函数。

超级战列舰 发表于 2004-2-9 16:34:37

太麻烦了,不如用AI 模块制造者 。

旧王孙 发表于 2004-2-10 01:36:03

这是基础

卧龙先生 发表于 2004-2-11 10:11:46

以下是引用超级战列舰在2004-2-9 16:34:37的发言:
太麻烦了,不如用AI 模块制造者 。


不能全依赖 AI 模块制造者,它内容不全!

AI 模块制造者是用于加快和方便 AI 的开发的.

築夢客 发表于 2004-2-13 16:03:56

給臥龍兄
小弟閱過此文,倍感喜悅,能否讓在下轉載。
如願意,定當標明出處!

龙卷风 发表于 2004-2-15 17:21:27

请注意:“SonicX 的AI教程”

yzf_2000 发表于 2007-3-19 11:29:26

后续是不是还没出来?

圣光骑士~剑圣 发表于 2007-11-11 21:13:35

这模块似乎不全。。。。

bklbklbk 发表于 2009-5-8 17:05:42

好深奥啊
!!!!!!!!!!!!!!!!

果果 发表于 2012-8-14 15:45:59

{:149:}{:155:}{:151:}

果果 发表于 2012-8-14 15:52:45

好深奥哦,妹纸偶建了学习个君羊:二二四六四九零四六{:149:}

小主教 发表于 2012-8-14 16:26:34

好古老的帖子,从2003聊到2012.{:152:}

ericzhu 发表于 2013-4-28 14:13:47

好,不过好复杂

jowto 发表于 2016-5-9 12:44:35

基础知识必不可少,就算之前学过。温故而知新可以为师矣

1145141 发表于 2022-5-3 13:09:18

好老的帖子……
页: [1]
查看完整版本: SonicX 的AI教程