六文丿鱼丸 发表于 2014-2-4 23:02:52

人工智能AI初入

一、浅入,初识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-lineability-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来看一下一些基础进攻脚本的结构,只截取一部分,看看自己能否看懂。

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


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

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



续见沙发

六文丿鱼丸 发表于 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小时时间,自己理解的部分很多,如有疏漏请多指教。

六文丿鱼丸 发表于 2014-2-4 23:10:53

对不起,我被论坛破格式弄怕了,不敢编辑了,这边放修正。感谢孟清华TT帮忙纠正

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

逸轩帝国制作组 发表于 2014-2-5 03:46:57

前排
又见AI。又见基础语言。
没怎么研究过先收藏
对了帝国里面有否则(Else)么,
这个相当经典的规则没看见唉

六文丿鱼丸 发表于 2014-2-5 10:59:47

逸轩帝国制作组 发表于 2014-2-5 03:46 static/image/common/back.gif
前排
又见AI。又见基础语言。
没怎么研究过先收藏


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

搜来的,有的

ImTomsony 发表于 2014-2-5 12:58:51

感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不知道具体怎么用。
至于defconst我是搞懂了的。 我希望可以有详细的讲解数字AI用法的帖子。
还有就是数字AI是不是只可以给玩家2用啊。 还是每个玩家可以用不同的数字AI。

beg 发表于 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更新没?

beg 发表于 2014-2-21 14:42:46

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

beg 发表于 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 每张地图是相同的吗?

beg 发表于 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

这或许能够帮你~

beg 发表于 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不错,不过似乎还要加插件;论坛提供的编写工具蛮简便,但是不知道插件哪里下)
一般我是先建好框架在写具体内容;因为这个脚本涉及不到底层,对效率影响不大,其实技术活不高,所以单纯码农工资不高、、、

ImTomsony 发表于 2014-2-23 13:32:49

beg 发表于 2014-2-23 09:08
那个手册是很好,但是有些编程习惯要说说:
1要学会写注释,以";"开头。
2 学会划分模块,模块一般以实 ...

那请问一下load到底怎么使用的呢?

beg 发表于 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:你能回答下我爆弓箭手为什么对日本弱势??

ImTomsony 发表于 2014-2-24 18:28:02

beg 发表于 2014-2-23 22:50
手册里那两个熟练掌握就好了,你需要代码样本吗?我们编程序也是先看别人怎么写,然后再自己创新。如果你 ...

应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。

beg 发表于 2014-2-25 10:16:23

ImTomsony 发表于 2014-2-24 18:28
应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。

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

54AI 发表于 2014-7-5 22:51:40

先收藏,慢慢研究

武定侯 发表于 2014-11-5 16:42:50

ImTomsony 发表于 2014-2-5 12:58
感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不 ...

看什么书呀?求推荐

13767872100 发表于 2020-4-29 19:48:54

纯萌新,请问这是要用什么软件来写?

nwlzq 发表于 2021-2-26 16:31:00

这个教程很不错啊,我顶一下。。。

1145141 发表于 2022-3-4 21:09:00

请问怎么让电脑引猪?
页: [1]
查看完整版本: 人工智能AI初入