|  | 
 
| 一、浅入,初识AI 战役需要AI,战役没有AI就像人没有灵魂。
 AI,人工智能。如果说触发是山谷,AI就是连着精彩世界的一线天。
 早年的国内帝国界,大家还完全不知道AI为何物,引述一下大叔回忆录里的一段
 
 
 当时的翔鹰吸引了绝大多数战役爱好者的到来,也在一种非常令人振奋的氛围下,短时间内诞生了很多作品,但以今天的眼光来看,这些战役基本都属于劣质战役,恐怕能得到3分的寥寥无几。其中一个很重要的因素,当时的制作者压根没有人知道AI的存在,这玩意儿太高级了,以至于他们完全不能理解,直到又一位推动战役制作史的人物出现——SonicX。
 SonicX称得上大陆帝国AI第一人,他不但破解AI,更提供了战役制作中非常基本且重要的不动AI,还写过简单的AI教程。随着不动AI的到来,亚联帝国战役版块愈发的红火了,也终于吸引来了一位身披霞光,聪明睿智,注定要改变帝国界历史的人物——阿木。
就是那个我们现在做战役必备的不动AI,它的来到也并不容易。
 
 AI能够做什么?
 单位的每一次进攻,多少人,什么兵种,单位带了多少资源,距离敌人多远,地图信号的位置,战略的判断,敌人有多少,敌人是什么策略,收到了多少进贡,外交策略等等等等,甚至现在可以检测单位血量等等。
 只要是你在帝国中能判断的决定的,AI几乎都可以做到。
 最典型的如不动的AI,让你的所有单位不动而不是乱跑,Boom2,强大的对战AI,能力超过很多中手。
 AI的每一个参数基本相当于一个触发条件或效果,AI有多少参数?上千个,拥有AI,就像触发编辑器多出了很多很多功能。
 
 
 二、AI认识初步
 AI的编写,很大程度上吓退了新手。这个帖子非常非常简单,且并不要求大家会编写一个复杂的AI,而只需要掌握AI的基本使用、认识、修改。只要你识字,几乎都能看懂和做简单的修改。
 
 在数学课程当中,有一章内容叫算法,知道的同学可以类比一下,不知道的也不要紧,看成是触发的代码化即可。
 人看字、单词,电脑只认数字,AI的作用就是把词汇转化为数字让电脑识别并运行。
 我们先来了解一个最最基本的结构
 
 触发:
 条件:某条件
 
 if 达成条件
 
 则=>
 
 效果:某效果
以上就是个最基本的计算机逻辑语句,和触发十分类似。AI也一样。
 
 在AI当中,我们称条件为事实 并用代码单词:defrule 来书写
 例如:
 (defrule ;如果
 
 (某个条件)
 
 =>
 
 (某个效果)
 
 )
 
 以上就是一个完整的AI结构,怎么样,简单吧。
 
 将一个真实可以运行的AI语句做例子,不添加注释
 
 (defrule
 (game-time > 60)
 =>
 (chat-to-all "你好!")
 )
 
 注释版
 
 
 (defrule  如果(game-time > 60)  游戏时间超过60秒 ps:在AI当中时间单位都是秒
 =>那么
 (chat-to-all "你好!") 对所有人说:你好!
 )结束在这里从defrule前的括号“(”到结束二字前的括号“)”
 
 就是一个完整的包括,即这两个括号内就是一个完整的AI结构。
 
 在AI当中,所有的参数都是用类似game-time这样xxx-xxx-xxx的结构来书写的,引号表示内容,符号表示比较等等。
再来一个
 
 
 (defrule   (difficulty == hard)
 =>
 (cc-add-resource food 100)
 (disable-self) ) 注释版
 (defrule   如果
 (difficulty == hard) 难度是困难,必须打两个等号,如果是大于等于则必须打成>=
 =>那么
 (cc-add-resource food 100)   给自己增加100食物
 (disable-self)不重复
 )
难度有5种,分别是
 easiest最易 easy标准 normal中等 hard难 hardest极难
 
 以上AI句子就是说难度为困难时,给自己加一次100食物。
 如果没有(disable-self)的话AI就会循环加食物了间隔似乎比秒还要短。
 
 另外,如果希望去掉条件,就像触发中只写效果,就需要将这个效果写成
 
 
 (defrule   (true) 永远成立
 =>
 (cc-add-resource food 100)
 (disable-self) )
或者永远不成立,就改成false即可。
 
 除了defrule,AI当中还有两种重要语句,即defconst和load,分别是定义常数和读取的作用。对于初学者来说,这两种暂时不需要掌握。如有兴趣自己研究一下。
 
 如上文所述,AI的很大一部分内容在于语句的运用和参数的书写。
 
 下面我们来简单练习一下,可能需要一些英语基础,我找了一些比较简单的单词组。
 
 事实(即条件):
 
 can-buildcan-build-gate
 building-count
 cheats-enabled
 map-size
 wood-amount
分别是
 
 
 can-build 现在能够建造can-build-gate 现在能够建造城门
 building-count 计算当前建筑数
 cheats-enabled 能够作弊
 map-size 检测地图的大小
 wood-amount 检测木材量
动作(即效果):
 
 do-nothingattack-now
 build-gate
 cc-add-resource
 chat-local
 delete-unit
 build-wall
 train do-nothing什么也不做  attack-now开始进攻
 build-gate建造城门
 cc-add-resource增加自己的资源
 chat-local自言自语
 delete-unit删除单位
 build-wall建造墙
 train训练
以上都是语句的基本,并不是完整的语句,例如上面的cc-add-resource,还需要加上参数"food"(资源种类)“100”(数量)
 
 
 写成cc-add-resource food 100,train后面也是需要加单位参数的,例如spearman-line枪兵系
 
 然后是一些参数和定义
 
 this-any-computer-ally watch-tower-line eagle-warrior-line  ability-to-dodge-missiles ability-to-maintain-distance POPULATION-CAP-200 POST-IMPERIAL-AGE-START
 
 
 this-any-computer-ally任何电脑盟友watch-tower-line塔系
 eagle-warrior-line雄鹰战士系
 ability-to-dodge-missiles躲避远程攻击的概率
 ability-to-maintain-distance保持距离的概率
 POPULATION-CAP-200人口上限200
 POST-IMPERIAL-AGE-START开始时代后帝王
大致的基本参数就是这些。
 
 我们再来看一看不动的AI究竟写了什么
 
 
 
 
 (defrule(true)
 =>
 (set-strategic-number sn-maximum-food-drop-distance 0)
 (set-strategic-number sn-maximum-wood-drop-distance 0)
 (set-strategic-number sn-maximum-gold-drop-distance 0)
 (set-strategic-number sn-maximum-stone-drop-distance 0)
 (disable-self)
 )
 (defrule
 (true)
 =>
 (set-strategic-number sn-percent-civilian-gatherers 0)
 (set-strategic-number sn-percent-civilian-builders 0)
 (set-strategic-number sn-percent-civilian-explorers 0)
 (disable-self)
 )
 (defrule
 (true)
 =>
 (set-strategic-number sn-task-ungrouped-soldiers 0)
 (disable-self)
 )
相比起对战AI,这里真的是太少了。
 
 
 (defrule    (true)=>    (set-strategic-number sn-maximum-food-drop-distance 0) 设置策略值:最大采集食物距离为0
 (set-strategic-number sn-maximum-wood-drop-distance 0)
 设置策略值:最大采集木材距离为0
 (set-strategic-number sn-maximum-gold-drop-distance 0)
 设置策略值:最大采集金子距离为0
 (set-strategic-number sn-maximum-stone-drop-distance 0)
 设置策略值:最大采集石头距离为0
 (disable-self))
 (defrule    (true)=>    (set-strategic-number sn-percent-civilian-gatherers 0)
 设置策略值:采集者比例0
 (set-strategic-number sn-percent-civilian-builders 0)
 设置策略值:建筑比例为0
 (set-strategic-number sn-percent-civilian-explorers 0)
 设置策略值:采集者比例0
 (disable-self))(defrule    (true)=>    (set-strategic-number sn-task-ungrouped-soldiers 0)
 设置策略值:指派未归队士兵0
 (disable-self))
 
 以上可以看到,不动AI实际上就是用set-strategic-number设定策略值令本来应该有大于零绝对值的那些参数变成0,因此当值为0的时候就是指派0人去工作,也就是不指派。不动效果达成,很灵活吧。
 
 再看看数字AI的基本模型
 
 
 
 (defrule(taunt-detected 1 15) 玩家1输入嘲讽语音15
 =>
 (cc-add-resouce food 100)得到100食物
 )
这里的效果部分是可以由触发代替的,所以我们拆开1-255数字AI看看
 
 
 (defrule (taunt-detected 1 2)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 2)
 )
 (defrule
 (taunt-detected 1 3)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 3)
 )
 (defrule
 (taunt-detected 1 4)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 4)
 )
 (defrule
 (taunt-detected 1 5)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 5)
 )
 (defrule
 (taunt-detected 1 6)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 6)
 )
 (defrule
 (taunt-detected 1 7)
 =>
 (acknowledge-taunt 1 1)
 (set-signal 7)
 )
一模一样的格式,只不过这里的效果部分我们可以看到,是
 
 (acknowledge-taunt 1 1) 回答玩家1:”1“
 set-signal 10) 设置AI信号10
 这里设置AI信号10,这样在触发的条件当中要求就达成了
 
 这也就是数字的AI最基本使用方法了。
 
 下面我们来研究一下稍微复杂的boom2来看一下一些基础进攻脚本的结构,只截取一部分,看看自己能否看懂。
 
 红色加粗为我加上的说明文字。
 
 
 ===========================
 
 ==============================
 
 
 
 续见沙发
 
 
 | 
 |