初学帝国2的AI,不知还有没有玩。
;这是我写的先研发织布技术,再建造房屋的例子;set-goal和goal不生效,不知是不是这样用,搞不懂,有大侠指点一下吗?
(defconst Goal-Research-Ri-loom 0);这里是定义变量且初始量为0的意思吗??
;研发织布技术
(defrule
(current-age == dark-age)
(game-time > 30)
(can-research ri-loom)
=>
(chat-to-all "研发织布技术")
(research ri-loom)
(set-goal Goal-Research-Ri-loom 1);这样是改变量值吗??
)
;建造居住房舍
(defrule
(current-age == dark-age)
(goal Goal-Research-Ri-loom 1);这样是判断变量值吗??
(can-build house)
=>
(chat-to-all "建造居住房舍")
(build house)
)
帝国2是童年时的情怀,虽然不玩很多年了,出来工作后懂一点IT技术,想自编一个AI,找回童年时的感觉。{:146:} 這個GOAL其實不用寫
取而代之用這個來判斷便可
(research-completed ri-loom) chriscca 发表于 2018-3-1 10:57
這個GOAL其實不用寫
取而代之用這個來判斷便可
主要还是想学习set-goal和goal的使用,查了论坛和相关手册看不懂。{:146:} 本帖最后由 捕影侠 于 2018-3-1 13:16 编辑
三楼说的用research-completed ri-loom是一种方法,不过你要问goal的话我就用goal给你说明下
你可这样试试:
( X随意取个指定范围内的整数(-32768—32767) )
(defconst R-LOOM X) ;便于理解,否则你不知道X所代表的意义,这在后面的goal里会作为变量
(defrule
(true)
=>
(set-goal R-LOOM Y) ;数字Y随意设置,此处我设为0代表关闭。仅代表该变量的具体数值,范围0—40
(disable-self)
)
(defrule
(goal R-LOOM 0) ;如上,我个人将Y值设为0
(current-age == dark-age)
(can-research ri-loom)
(game-time > 30)
=>
(chat-local-to-self "研发织布技术") ;如果你想对所有人说就改回chat-to-all
(research ri-loom)
(set-goal R-LOOM 1) ;这里将R-LOOM的取值换成1,作为下面的条件
(disable-self)
)
(defrule
(goal R-LOOM 1) ;此时R-LOOM的goal值为1作为了条件,触发造房效果
(can-build house)
(housing-headroom <= 2)
=>
(chat-local-to-self "建造居住房舍")
(build house)
)
goal值的变化相当于一种触发开关,可以在战役中加以运用丰富内容和可玩性,以上希望对楼主有所帮助
捕影侠 发表于 2018-3-1 12:49
三楼说的用research-completed ri-loom是一种方法,不过你要问goal的话我就用goal给你说明下
你可这样试试 ...
是不是我理解有问题还是不会用
(defconst R-LOOM 0)
(defrule
(goal R-LOOM 0)
=>
(chat-local"R-LOOM 0")
(set-goal R-LOOM 1)
)
(defrule
(goal R-LOOM 1)
=>
(chat-local"R-LOOM 1")
(set-goal R-LOOM 0)
) poplarshine 发表于 2018-3-1 14:46
是不是我理解有问题还是不会用
就我这段AI运行不生效
(defconst R-LOOM 0)
(defrule
(goal R-LOOM 0)
=>
(chat-local"R-LOOM 0")
(set-goal R-LOOM 1)
)
(defrule
(goal R-LOOM 1)
=>
(chat-local"R-LOOM 1")
(set-goal R-LOOM 0)
) 本帖最后由 捕影侠 于 2018-3-1 18:27 编辑
poplarshine 发表于 2018-3-1 17:17
就我这段AI运行不生效
(defconst R-LOOM 0)
你这段代码本来就在游戏里什么都体现不出来嘛{:5_432:},而且还有在使用任何goal值前一定要给它取定某个定值,否则这还是个无用的goal 捕影侠 发表于 2018-3-1 18:20
你这段代码本来就在游戏里什么都体现不出来嘛,而且还有在使用任何goal值前一定要给它取定某个 ...
那怎么改过来,我就想当R-LOOM为0时喊一声"R-LOOM 0",并且设R-LOOM为1;当R-LOOM为1时喊一声"R-LOOM 1",并且设R-LOOM为0 本帖最后由 捕影侠 于 2018-3-11 12:44 编辑
poplarshine 发表于 2018-3-1 22:19
那怎么改过来,我就想当R-LOOM为0时喊一声"R-LOOM 0",并且设R-LOOM为1;当R-LOOM为1时喊一声"R-LOOM 1" ...
我在此先解释不是循环执行的时候
(defconst R-LOOM 5) ;定义一个数字5代表的变量R-LOOM,现在仅仅只定义了这么一
;个未知变量而已,还没有赋值,但是注意范围1--40
(defrule
(game-time >= 4)
(true)
=>
(set-goal R-LOOM 0) ;赋一个初始值0(这里的初始值实际是自己随便选一个数,我选0作为初始值)
(disable-self) ;你总不能让它一直重复执行吧......
)
(defrule
(game-time >= 6)
(goal R-LOOM 0) ;根据你刚才选的数字作为条件
=>
(chat-local"xxx") ;输出你所要的内容
(set-goal R-LOOM 1) ;同时将变量R-LOOM 的值换成1,作为下一步执行的条件)
(disable-self)
)
(defrule
(game-time >= 8)
(goal R-LOOM 1) ;R-LOOM值为1成立,执行下面的效果
=>
(chat-local"XXX") ;输出你所要的内容
(set-goal R-LOOM 0) ;又将R-LOOM值设为0,由于都是不循环,所以这里有没有该条都可以
(disable-self)
)
这样就是你要的效果,但是分别只能执行一次
谢谢,不过我执行上面代码时没任何内容输出,不知是什么问题 本帖最后由 捕影侠 于 2018-3-11 12:41 编辑
poplarshine 发表于 2018-3-11 10:58
谢谢,不过我执行上面代码时没任何内容输出,不知是什么问题
不好意思,在下有几个地方记错了。chat-local 也可以只不过是不会带上玩家颜色而已。以上代码两个地方改下,defconst那栏数字设为1--40之间。还有,几个地方加上计时器,否则对话无法体现。上面的代码修正了,亲测无误 谢谢可以了,原来不生效是因为定义时设了0,defconst R-LOOM 0
页:
[1]