|
一、浅入,初识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-build
can-build-gate
building-count
cheats-enabled
map-size
wood-amount
分别是
can-build 现在能够建造
can-build-gate 现在能够建造城门
building-count 计算当前建筑数
cheats-enabled 能够作弊
map-size 检测地图的大小
wood-amount 检测木材量
动作(即效果):
do-nothing
attack-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来看一下一些基础进攻脚本的结构,只截取一部分,看看自己能否看懂。
红色加粗为我加上的说明文字。
===========================
==============================
续见沙发
|
|