翔鹰帝国网|帝国时代论坛|帝国时代系列|神话时代
 找回密码
 注册翔鹰会员(昵称)
搜索
查看: 9666|回复: 20

[教程] 人工智能AI初入

  [复制链接]

1374

主题

13

精华

4万

积分

教皇

耕战
4669
鹰币
19736
天龙币
0
回帖
13525

特级皇家勋章一级翔鹰勋章特级嘉禾勋章特级帝国勋章鹰之王者雄鹰勋章蛟龙勋章第七届火箭筒杯优秀战役第七届火箭筒杯最佳新人

附庸关系1
发表于 2014-2-4 23:02:52 | 显示全部楼层 |阅读模式
一、浅入,初识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当中还有两种重要语句,即defconstload,分别是定义常数读取的作用。对于初学者来说,这两种暂时不需要掌握。如有兴趣自己研究一下。

如上文所述,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来看一下一些基础进攻脚本的结构,只截取一部分,看看自己能否看懂。

红色加粗为我加上的说明文字。


===========================

==============================



续见沙发

回复

使用道具 举报

1374

主题

13

精华

4万

积分

教皇

耕战
4669
鹰币
19736
天龙币
0
回帖
13525

特级皇家勋章一级翔鹰勋章特级嘉禾勋章特级帝国勋章鹰之王者雄鹰勋章蛟龙勋章第七届火箭筒杯优秀战役第七届火箭筒杯最佳新人

附庸关系1
 楼主| 发表于 2014-2-4 23:10:33 | 显示全部楼层

(defrule        (game-time > 2)游戏时间大于2秒
=>        (chat-to-all " ======== BooM II AI 阿拉伯之王 ========")对所有人说话        
(chat-to-all "               编写者: 闲闲 翔鹰工作室")        
(disable-self)不循环
)==============================
(defrule        (game-time > 10)        (goal GOAL-PVP 1)达成定义值,单人游戏1VS1
=>        (chat-to-all "这是 1V1 游戏")        
(disable-self)
)
(defrule        (game-time > 10)游戏时间大于10s        
(or                (or (goal GOAL-PVP 2) (goal GOAL-PVP 3))               
(or (goal GOAL-PVP 4) (goal GOAL-PVP 5))达成定义值多人游戏(里面的pvp就是游戏玩家组))
=>        
(chat-to-all "这是多人游戏")
        (disable-self)
)
==============================


开局经济政策
(defrule        
(true)
=>
        (set-strategic-number sn-percent-civilian-gatherers 90)让百分之90的村民收集资源        
(set-strategic-number sn-percent-civilian-builders 10)让百分之10的村民建筑        
(set-strategic-number sn-percent-civilian-explorers 0)不要村民探索
(set-strategic-number sn-number-build-attempts-before-skip 3)忽略建造所需建造次数3次
(set-strategic-number sn-food-gatherer-percentage 100)百分百的村民收集食物        
(set-strategic-number sn-wood-gatherer-percentage 0)        
(set-strategic-number sn-gold-gatherer-percentage 0)        
(set-strategic-number sn-stone-gatherer-percentage 0)        
(disable-self)
)


==============================
发现敌人
(defrule        (goal GOAL-ANTI-KNIGHT 0)当前定义条件反骑士值为0,即未进入反骑士状态        
(players-unit-type-count any-enemy knight-line > 8)视野内任何敌人的骑士系单位数量大于8
=>
        (chat-to-allies "发现敌人的骑士群")        
(set-goal GOAL-ANTI-KNIGHT 1)将定义条件反骑士值改为1,即进入反骑士状态
)

(defrule        
(current-age == dark-age)开始时代黑暗时代        
(game-time < 640)游戏时间小于640秒        
(players-current-age any-human >= feudal-age)任何人类玩家达到了封建时代
=>        
(chat-to-player this-any-human "升得真快!")说升的真快        (disable-self)
)
这里存在逻辑未达成则可触发,有点三联触发的意味


==============================



遇到黑快
(defrule
        (goal GOAL-DEF-DRUSH 1)定义条件黑快达成值1
(timer-triggered TIMER-SPECIAL-AID)达成触发计时器特殊救援
=>        
(chat-to-player any-human-enemy "二十一世纪最缺什么? 黑快的人才!")
        (chat-to-all "9")对所有人打出id=9的嘲讽        
(set-goal GOAL-SPECIAL-AID 0)设特殊救援值为0
        (disable-timer TIMER-SPECIAL-AID)停止特殊救援计时器
        (disable-self)达成黑快预定条件,发送求救信号
)
==============================
语音嘲弄
(defrule        (current-age <= castle-age)低于或等于城堡时代
        (goal GOAL-SPECIAL-AID 0)特殊救援值为0,未处于特殊时期        
        (players-building-type-count 能看见的指定玩家指定建筑数这个事实检查 <游戏者编号> 的游戏者已建造该类 <建筑物> 和建造中该类 <建筑物> 的 <数量> 。计算机游戏者不会作弊,故只有不被战雾掩盖而又可视的该类 <建筑物> 会被计算在内。 any-enemy 任何敌人 watch-tower 瞭望塔<= 0)能看见的塔爆为0,即不在塔爆状态        
        (or (players-building-type-count any-enemy palisade-wall >= 3)               
        (players-building-type-count any-enemy stone-wall >= 3))此时任意敌人木墙或石墙大于等于3
=>        

          (chat-to-player this-any-enemy "30(这个30是语音嘲弄)农民伯伯加油干呀,")        
          (chat-to-player this-any-enemy "修起墙墙保平安哪~~~")        
         (disable-self)
)
==============================




(defrule
        (taunt-detected my-player-number 49)收到49信号
=>        (acknowledge-taunt my-player-number 49)回应49
        (set-strategic-number sn-percent-attack-soldiers 100)为attack-now的预设值让所有军事单位行动        
       (attack-now)现在进攻)

==============================

(defrule
       (current-age >= feudal-age)时代在封建及以上        
       (taunt-detected my-player-number 48)
=>        
        (acknowledge-taunt my-player-number 48)
        (set-goal GOAL-TOWN-SIZE-ATTACK 1)设定塔爆状态)

(defrule        
           (goal GOAL-TOWN-SIZE-ATTACK 1)当处于塔爆状态
=>        
           (disable-timer TIMER-TSA)停止计时器TSA,关于TSA(town-size-attack)见https://www.hawkaoe.net/bbs/thread-26411-1-1.html
        
(enable-timer TIMER-TSA 30) 启动TSA30s        
(set-strategic-number sn-percent-attack-soldiers 100) 设定所有军事单位        
(set-strategic-number sn-enemy-sighted-response-distance 250)预设定对敌进攻距离250        
(set-goal GOAL-TOWN-SIZE-ATTACK 2))

==============================

进攻指令
(defrule        (current-age >= castle-age)达到城堡时代        
                (taunt-detected my-player-number 50)
=>        (acknowledge-taunt my-player-number 50)
        (set-goal GOAL-FAST-ATTACK 1)设定GFA值为1)

这里的代码只占boom2中国民族情况下的百分之二左右,所以要编写一个完整的对战AI,还需要大量的积累。ps.到这里已经基本满足战役制作需要了。

小结:在认识这些的基础上,对于参数的修改就不会太难了。比如我们现在写一个设定

(defrule
    (game-time > 2)
    (defend-soldier-count >= 20)军事单位大于等于20
=>
    (attack-now)执行开始进攻
    (enable-timer 10 1)启动时间器10值为1
    (disable-self)
)
(defrule
    (timer-triggered 10)达成时间器10
    (defend-soldier-count >= 20)军事单位大于等于20
=>
    (set-strategic-number sn-number-attack-groups 3)预设定策略值:分3队进攻
    (set-strategic-number sn-maximum-attack-group-size 10)预设定策略值:每队最大10人



以上这些值都可以随便你设定,这样一个简单的进攻AI脚本就完成可以用了。

各种参数都能查得到的,自己看下面两个工具和教程查吧。

三、工具

AI编写主要是两个工具,一个是AI Editor,还有一个是AOK AI Script Builder

https://www.hawkaoe.net/bbs/thread-25735-1-1.html
https://www.hawkaoe.net/bbs/thread-24013-1-1.html

第一个有各种参赛说明而且有标颜色,第二个则有很多现成的模版可以用,我目前是两个混着用。如果你是高手的话可以直接用Uedit这些来写。

这两个工具都可以安装插件,在置顶的导航中有链接。
https://www.hawkaoe.net/bbs/thread-25790-1-1.html
下载之后放到这两个程序对应文件夹中即可使用。


另外最好下载一下官方教程https://www.hawkaoe.net/bbs/thread-4697-1-1.html

这里面的语言比较难懂,不过建议善用一下电子书搜索功能来寻找你需要的参数。


对了关于如何新建AI文件,引述一下尼克的教程,不过这两个工具保存的时候都能自己生成就是了,如果你要用其他工具写就是要自己生成一下per,ai。

首先要知道怎么做**.ai、**.per文件,可以运行WINDOWS自带的“记事本”,然后点击“另存为”,这将打开一个新的窗口,在“文件名” 处敲“**.per”或者“**.ai”,将 “保存类型” 下拉菜单定 义为: “所有文件”,最后点确定,OK,就生成了一个“**.per”或者“**. ai”。  

四、了解AI相关的文件
AI主要是定义文件(ai)和脚本文件(per)组成。
你在游戏中选择的时候选择的是ai文件,但是执行的是per。
另外需要说明的是很多AI,尤其是多民族AI的作者会把各个民族单独开一个per,并放入文件夹中,这个文件夹也放在AI文件夹中。所以这个AI总共有20个文件(一个ai,一个分支per,18个民族per)



五、战役中AI的使用


1.将AI的ai、per文件放好后,可以在标准游戏中左击玩家和电脑名字进行选择

2.进入地图编辑器,选择需要的那个游戏者,找到性格栏,进行选择。


六、AI界现状

目前国内AI几乎处于停滞状态,主要是userpatch比较多在国外流行,在打了userpatch环境的征服者当中,比原先的AI又会开放更多的功能,但是国内这边没有太多的关注,期待新秀的崛起。


================

ps.本人是AI新手,昨天第一次认识defrule,看看前辈的教程不过2小时时间,自己理解的部分很多,如有疏漏请多指教。
回复

使用道具 举报

1374

主题

13

精华

4万

积分

教皇

耕战
4669
鹰币
19736
天龙币
0
回帖
13525

特级皇家勋章一级翔鹰勋章特级嘉禾勋章特级帝国勋章鹰之王者雄鹰勋章蛟龙勋章第七届火箭筒杯优秀战役第七届火箭筒杯最佳新人

附庸关系1
 楼主| 发表于 2014-2-4 23:10:53 | 显示全部楼层
对不起,我被论坛破格式弄怕了,不敢编辑了,这边放修正。感谢孟清华TT帮忙纠正

错误:大于等于要打成>=
错误:雄鹰战士字打错= =
错误:暂时攻击力似乎还是没办法检测的
错误:watch-tower是瞭望塔
回复

使用道具 举报

43

主题

0

精华

9947

积分

皇帝

耕战
1867
鹰币
45222
天龙币
0
回帖
1408

翔鹰建站十周年纪念章活跃者

附庸关系0
发表于 2014-2-5 03:46:57 | 显示全部楼层
前排
又见AI。又见基础语言。
没怎么研究过先收藏
对了帝国里面有否则(Else)么,
这个相当经典的规则没看见唉
回复

使用道具 举报

1374

主题

13

精华

4万

积分

教皇

耕战
4669
鹰币
19736
天龙币
0
回帖
13525

特级皇家勋章一级翔鹰勋章特级嘉禾勋章特级帝国勋章鹰之王者雄鹰勋章蛟龙勋章第七届火箭筒杯优秀战役第七届火箭筒杯最佳新人

附庸关系1
 楼主| 发表于 2014-2-5 10:59:47 | 显示全部楼层
逸轩帝国制作组 发表于 2014-2-5 03:46
前排
又见AI。又见基础语言。
没怎么研究过先收藏

load-if-defined DEATH-MATCH
  (defconst dark-age-villagers 6)
else
  (defconst dark-age-villagers 22)
end-if

搜来的,有的
回复

使用道具 举报

10

主题

3

精华

1万

积分

皇帝

耕战
1893
鹰币
215
天龙币
0
回帖
231

活跃者翔鹰建站十周年纪念章

附庸关系0
发表于 2014-2-5 12:58:51 | 显示全部楼层
感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不知道具体怎么用。
至于defconst我是搞懂了的。 我希望可以有详细的讲解数字AI用法的帖子。
还有就是数字AI是不是只可以给玩家2用啊。 还是每个玩家可以用不同的数字AI。

点评

看什么书呀?求推荐  发表于 2014-11-5 16:42
希望有更多的人加入翔鹰帝国,别老是游客了
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-21 14:40:02 | 显示全部楼层
本帖最后由 beg 于 2014-2-22 18:37 编辑

1barbarian.per 里面爆弓箭手为什么怕日本?
(defrule
        (up-compare-goal gl-current-age >= gv-dark-up)
        (goal gl-feudal-trash YES)
        (current-age == dark-age)
        (or        (players-civ every-enemy gothic)
                (players-civ every-enemy japanese))
        (not        (player-valid 3))
=>
        (set-goal gl-feudal-archery archer-skirm)
        (set-goal gl-feudal-infantry 0)
        (set-goal gl-feudal-trash 0)
        (set-strategic-number sn-skip-first-mining-camp 0)
        (chat-to-player my-player-number "2No trash against goths or japs")
        (disable-self)
)

...

(defrule
        (goal gl-strategy default)
        (up-compare-const gv-feudal-age-end == 1)
        (or        (nor        (civ-selected japanese)
                        (civ-selected gothic))
                (up-compare-goal gl-my-villager-count-total > 80))
        (or        (up-research-status c: ri-bloodlines >= research-pending)
                (research-available ri-bloodlines))
        (food-amount > 129)
        (can-train scout-cavalry-line)
=>
        (train scout-cavalry-line)
)

...
(defrule
        (goal gl-feudal-trash YES)
        (players-building-type-count target-player watch-tower < 3)
        (or        (and        (unit-type-count-total archer-line < 4)
                        (players-unit-type-count any-enemy militiaman-line > 0))
                (or        (players-unit-type-count any-enemy militiaman-line > 2)
                        (or        (players-civ any-enemy gothic)
                                (players-civ any-enemy japanese))))
        (unit-type-count-total archer-line < 11)
        (can-train archer-line)
=>
        (train archer-line)
)


怕哥特我懂,为什么怕日本?

2barbarian AI里面有些排除玛雅、阿兹特克的地方没有排除印加,虽然多人对决的时候不会几家都是印加,但是单挑时仍会电脑判断失误,出一部分长枪、、、不知道这个AI更新没?
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-21 14:42:46 | 显示全部楼层
还有一点忘说了,barbarian AI里面有些排除玛雅、阿兹特克的地方没有排除印加,虽然多人对决的时候不会几家都是印加,但是单挑时仍会电脑判断失误,出一部分长枪、、、不知道这个AI更新没?
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-21 14:54:45 | 显示全部楼层
#load-if-not-defined HUN-CIV
(defrule
        (or        (and        (goal gl-strategy xbow-rush)
                        (players-building-type-count target-player castle > 0))
                (and        (goal gl-strategy skirm-boom)
                        (and        (game-time < 985)
                                (players-military-population every-enemy < 2))))
        (game-time > 975)
        (game-time < 1500)
        (or        (stone-amount >= 100)
                (building-type-count-total town-center > 1))
=>
        (set-goal gl-strategy xbow-boom)
        (set-goal gl-strategy-aggressiveness-level LOW)
)

#load-if-defined UP-2-PLAYER-GAME
(defrule
        (goal gl-strategy skirm-boom)
        (or        (players-unit-type-count focus-player militiaman-line > 2)
                (or        (players-unit-type-count focus-player eagle-warrior-line > 2)
                        (players-unit-type-count focus-player knight-line > 1)))
=>
        (set-goal gl-strategy xbow-boom)
        (set-goal gl-strategy-aggressiveness-level LOW)
        (disable-self)
)

#load-if-not-defined SPANISH-CIV
(defrule
        (goal gl-strategy skirm-boom)
        (commodity-selling-price stone < default-stone-price)
        (goal gl-rush-suitability-on-map GOOD)
        (game-time < 1160)
        (players-building-type-count target-player castle < 1)
=>
        (set-goal gl-strategy xbow-rush)
        (set-goal gl-strategy-aggressiveness-level HIGH)
        (set-goal gl-disable-mining-upgrades NO)
        (chat-to-player my-player-number "1Threat of getting outnumbered detected!")
        (set-strategic-number sn-target-evaluation-hitpoints 1)
        (disable-self)
)
#end-if
#end-if
#else
(defrule
        (or        (and        (goal gl-strategy CA-rush)
                        (players-building-type-count target-player castle > 0))
                (and        (goal gl-strategy skirm-boom)
                        (and        (game-time < 985)
                                (players-military-population every-enemy < 2))))
        (game-time > 975)
        (game-time < 1500)
        (or        (stone-amount >= 100)
                (building-type-count-total town-center > 1))
=>
        (set-goal gl-strategy CA-boom)
        (set-goal gl-strategy-aggressiveness-level LOW)
)

#load-if-defined UP-2-PLAYER-GAME
(defrule
        (goal gl-strategy skirm-boom)
        (or        (players-unit-type-count focus-player militiaman-line > 2)
                (or        (players-unit-type-count focus-player eagle-warrior-line > 2)
                        (players-unit-type-count focus-player knight-line > 1)))
=>
        (set-goal gl-strategy CA-boom)
        (set-goal gl-strategy-aggressiveness-level LOW)
        (disable-self)
)

(defrule
        (goal gl-strategy skirm-boom)
        (commodity-selling-price stone < default-stone-price) ;注,这个东西什么有用
        (goal gl-rush-suitability-on-map GOOD)
        (game-time < 1160)
        (players-building-type-count target-player castle < 1)
=>
        (set-goal gl-strategy CA-rush)
        (set-goal gl-strategy-aggressiveness-level HIGH)
        (set-goal gl-disable-mining-upgrades NO)
        (chat-to-player my-player-number "1Threat of getting outnumbered detected!")
        (set-strategic-number sn-target-evaluation-hitpoints 1)
        (disable-self)
)
#end-if
#end-if


顺便帮科普,类似这里有好几个 #end-if,总是和最近的 #load 对应。
求助: 1 #load-if-not-defined HUN-CIV 和 #load-if-not-defined SPANISH-CIV 为何不写在一起,难道作者肯定知道西班牙不会弓爆;
           2 default-stone-price 每张地图是相同的吗?
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-23 08:57:51 | 显示全部楼层
ImTomsony 发表于 2014-2-5 12:58
感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不 ...

#load-if-defined VICTORY-STANDARD
(load-random +chance-for-wonder "Barbarian_2.0\WonderVictory")
#end-if

这或许能够帮你~
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-23 09:08:26 | 显示全部楼层
本帖最后由 beg 于 2014-2-23 22:55 编辑

那个手册是很好,但是有些编程习惯要说说:
1  要学会写注释,以";"开头。
2 学会划分模块,模块一般以实现特定单一功能为要,不要所有的功能都加入。
3 补充2,函数不要跨模块,这会给维护工作带来麻烦;(Barbarian.per里面不小心删了一个 #end-if,调试的时候想不起来哪里删了,经细查发现跨模块了,后面一万多行代码只有再写个程序查找,完全不必要的麻烦)

书写习惯:
写了"(defrule" 就马上写 "=>" 和")",
写一个"#load"就接一个"#end-if".注意缩进我感觉是一个Tab,但是正规编程要被师傅骂、、、(建议用专门编写工具UltraEditer不错,不过似乎还要加插件;论坛提供的编写工具蛮简便,但是不知道插件哪里下)
一般我是先建好框架在写具体内容;因为这个脚本涉及不到底层,对效率影响不大,其实技术活不高,所以单纯码农工资不高、、、
回复

使用道具 举报

10

主题

3

精华

1万

积分

皇帝

耕战
1893
鹰币
215
天龙币
0
回帖
231

活跃者翔鹰建站十周年纪念章

附庸关系0
发表于 2014-2-23 13:32:49 | 显示全部楼层
beg 发表于 2014-2-23 09:08
那个手册是很好,但是有些编程习惯要说说:
1  要学会写注释,以";"开头。
2 学会划分模块,模块一般以实 ...

那请问一下load到底怎么使用的呢?
希望有更多的人加入翔鹰帝国,别老是游客了
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-23 22:50:01 | 显示全部楼层
本帖最后由 beg 于 2014-2-23 22:55 编辑
ImTomsony 发表于 2014-2-23 13:32
那请问一下load到底怎么使用的呢?

手册里那两个熟练掌握就好了,你需要代码样本吗?我们编程序也是先看别人怎么写,然后再自己创新。如果你英文够好,可以来这里https://aok.heavengames.com/cgi-bin/forums/display.cgi?action=t&fn=28&f=28,,270,0
ps:你能回答下我爆弓箭手为什么对日本弱势??

回复

使用道具 举报

10

主题

3

精华

1万

积分

皇帝

耕战
1893
鹰币
215
天龙币
0
回帖
231

活跃者翔鹰建站十周年纪念章

附庸关系0
发表于 2014-2-24 18:28:02 | 显示全部楼层
beg 发表于 2014-2-23 22:50
手册里那两个熟练掌握就好了,你需要代码样本吗?我们编程序也是先看别人怎么写,然后再自己创新。如果你 ...

应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。
希望有更多的人加入翔鹰帝国,别老是游客了
回复

使用道具 举报

67

主题

0

精华

366

积分

子爵

耕战
6
鹰币
802
天龙币
0
回帖
352
附庸关系0
发表于 2014-2-25 10:16:23 | 显示全部楼层
ImTomsony 发表于 2014-2-24 18:28
应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。

嗯嘿,谢谢哩。
你一般玩的话什么AI?
回复

使用道具 举报

0

主题

0

精华

0

积分

扈从

耕战
0
鹰币
10
天龙币
0
回帖
1
附庸关系0
发表于 2014-7-5 22:51:40 | 显示全部楼层
先收藏,慢慢研究
回复

使用道具 举报

6

主题

0

精华

808

积分

伯爵

耕战
130
鹰币
2017
天龙币
0
回帖
70

翔鹰建站十周年纪念章

附庸关系0
发表于 2014-11-5 16:42:50 | 显示全部楼层
ImTomsony 发表于 2014-2-5 12:58
感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不 ...

看什么书呀?求推荐
吾之所行,皆是开创之路。人生的乐趣就在于冒险,就在于一切都是未知数。
回复

使用道具 举报

4

主题

0

精华

55

积分

骑士

耕战
0
鹰币
30
天龙币
0
回帖
27
附庸关系0
发表于 2020-4-29 19:48:54 | 显示全部楼层
纯萌新,请问这是要用什么软件来写?
回复

使用道具 举报

0

主题

0

精华

36

积分

骑士

耕战
0
鹰币
4
天龙币
0
回帖
22
附庸关系0
发表于 2021-2-26 16:31:00 | 显示全部楼层
这个教程很不错啊,我顶一下。。。
回复

使用道具 举报

2

主题

0

精华

19

积分

骑士

耕战
0
鹰币
10
天龙币
0
回帖
14
附庸关系0
发表于 2022-3-4 21:09:00 | 显示全部楼层
请问怎么让电脑引猪?
回复

使用道具 举报

本版积分规则

排行榜|小黑屋|翔鹰帝国

GMT+8, 2024-11-15 21:44 , Processed in 0.238026 second(s), 224 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

Copyright © 2001-2023, Hawkaoe.net All Rights Reserved

快速回复 返回顶部 返回列表