人工智能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来看一下一些基础进攻脚本的结构,只截取一部分,看看自己能否看懂。
红色加粗为我加上的说明文字。
===========================
==============================
续见沙发
(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小时时间,自己理解的部分很多,如有疏漏请多指教。
对不起,我被论坛破格式弄怕了,不敢编辑了,这边放修正。感谢孟清华TT帮忙纠正
错误:大于等于要打成>=
错误:雄鹰战士字打错= =
错误:暂时攻击力似乎还是没办法检测的
错误:watch-tower是瞭望塔 前排
又见AI。又见基础语言。
没怎么研究过先收藏
对了帝国里面有否则(Else)么,
这个相当经典的规则没看见唉 逸轩帝国制作组 发表于 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
搜来的,有的 感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不知道具体怎么用。
至于defconst我是搞懂了的。 我希望可以有详细的讲解数字AI用法的帖子。
还有就是数字AI是不是只可以给玩家2用啊。 还是每个玩家可以用不同的数字AI。
本帖最后由 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更新没?
还有一点忘说了,barbarian AI里面有些排除玛雅、阿兹特克的地方没有排除印加,虽然多人对决的时候不会几家都是印加,但是单挑时仍会电脑判断失误,出一部分长枪、、、不知道这个AI更新没?
#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 每张地图是相同的吗?
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 22:55 编辑
那个手册是很好,但是有些编程习惯要说说:
1要学会写注释,以";"开头。
2 学会划分模块,模块一般以实现特定单一功能为要,不要所有的功能都加入。
3 补充2,函数不要跨模块,这会给维护工作带来麻烦;(Barbarian.per里面不小心删了一个 #end-if,调试的时候想不起来哪里删了,经细查发现跨模块了,后面一万多行代码只有再写个程序查找,完全不必要的麻烦)
书写习惯:
写了"(defrule" 就马上写 "=>" 和")",
写一个"#load"就接一个"#end-if".注意缩进我感觉是一个Tab,但是正规编程要被师傅骂、、、(建议用专门编写工具UltraEditer不错,不过似乎还要加插件;论坛提供的编写工具蛮简便,但是不知道插件哪里下)
一般我是先建好框架在写具体内容;因为这个脚本涉及不到底层,对效率影响不大,其实技术活不高,所以单纯码农工资不高、、、
beg 发表于 2014-2-23 09:08
那个手册是很好,但是有些编程习惯要说说:
1要学会写注释,以";"开头。
2 学会划分模块,模块一般以实 ...
那请问一下load到底怎么使用的呢?
本帖最后由 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:你能回答下我爆弓箭手为什么对日本弱势??
beg 发表于 2014-2-23 22:50
手册里那两个熟练掌握就好了,你需要代码样本吗?我们编程序也是先看别人怎么写,然后再自己创新。如果你 ...
应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。 ImTomsony 发表于 2014-2-24 18:28
应该不会吧,不会弱势,但绝对不是最强势。
最强势的是早火枪兵,因为火枪打步兵有加成。
嗯嘿,谢谢哩。
你一般玩的话什么AI? 先收藏,慢慢研究 ImTomsony 发表于 2014-2-5 12:58
感觉这些我都会。 就是load没有搞懂,虽然看了书。 但是还是搞不懂,好像用load可以搞出随机的效果。但是不 ...
看什么书呀?求推荐 纯萌新,请问这是要用什么软件来写? 这个教程很不错啊,我顶一下。。。 请问怎么让电脑引猪?
页:
[1]