weidongzi 发表于 2016-6-30 00:35:37

继续求问关于AI与触发之交互的问题

本帖最后由 weidongzi 于 2016-6-30 15:05 编辑

要感谢@条顿武士 前辈最近对我几乎是手把手的指导,解答了我对AI的许多疑惑。

其中,最主要的是关于AI与触发之交互的知识,比如通过资源法实现 AI → 触发 的飞跃。

不过,传统的资源法中,AI利用cc-add-resource这个语句向玩家进贡的资源局限于四种基础资源(食物、木材、黄金、石头)。运用四种基础资源发信号的劣势在于,“累积属性”检测的不是资源变化,而是资源总量大于等于某个值。为了保证检测的精确性,安装了包含这个语句的AI的玩家必须时刻将自己的基础资源清为零。这一点在RPG战役中影响不大,但我的目标是做一个建毁与夺城相结合的战役,玩家也比较多,都是要正常采集资源的。这样就需要对传统的资源法进行改进。

在我的一个提问贴子中,@条顿武士 前辈非常开拓性地发现,cc-add-resource这个语句也可以作用于隐藏资源,并举出第56号与15号隐藏资源的例子。

于是拿最近学到的东西小da试kai牛nao刀dong:想做一个4v1的夺城战役,浮士德率领堂吉诃德、好兵帅克与孙悟空要征服乌托邦,乌托邦有8座城堡,分别是Utopia, Ethiopia, Meriotpia, Technopia, Communiopia, Myopia, Consumenta, Natura;玩家6梅菲斯特与其他所有玩家同盟,承担判定功能。

血量判定与夺城触发的原理简述为:城堡血量低于960→_→AI进贡→_→城堡归玩家6,同时启动自动回血
城堡血量大于等于960→_→AI进贡→_→借助城堡里面的绵羊判定城堡属于哪个玩家,同时关闭自动回血
两个AI指令互相循环。

好吧,一开始想要小试牛刀,结果开始动手之后做到第二个城堡就已经乱套了。我是做完一个城堡就测试一下。第一个城堡的占领非常顺利。但是第二个城堡血量削至不足960之后,触发的却是占领第一个城堡的效果。似乎是资源判定上出了问题。

于是,为了检查这个触发系统是否可用,我简化了一下,弄了一个很简单的草地战役……玩家1夺玩家2的城堡,玩家3判定……玩家2的城堡也减至4个。但是玩到后面还是会出现混乱,即出现攻击一个城堡,另一个城堡却出现所有权转换的问题。当攻击顺序不一样,还会出现一些很微妙的差别……

因此,我在此求助。不知能否找出哪里出了差错?我怀疑56与15号资源的起始值可能不为0。不知能否证实?不知还有没有其他的方法可以实现AI与触发的交互?

附上我的地图文件与AI文件。第二个名字有点囧,是“小试牛刀”而烂尾的作品。第一个pruefen是极简草地夺城。大家可以感受一下。


条顿武士 发表于 2016-6-30 01:48:10

触发结构理论上是没问题的,但是有些马虎的地方写错了导致系统出了bug…



比如草地夺城AI的这里,set-goal 3 1应该是set-goal 4 1才对。
浮士德的夺城里,第二个城堡的触发Meritopia changing里面,应该是4和97数量的资源才对,而触发设定的是4和98,这样就会和前面的触发冲突…

还有一个可能出问题的情况,就是在某个城堡血量减少到960以下的时候,另一个城堡刚好回血到960以上,导致资源累加,多个触发都会判定成立。

为了避免这种情况,在判定资源的时候,使用正常的堆积属性条件(资源数大于等于),以及1.4的反向条件(资源数小于)一起判定,可以严格判断资源是否等于某个数值。比如条件一写资源大于等于1,条件二反向判断资源小于2,那么就只有在资源等于1的时候条件才会成立。

反向条件的使用方法是把下图中的小勾去掉,这样条件判定就会完全相反。




条顿武士 发表于 2016-6-30 01:54:08

忘了说,为了防止AI中的两个动作同时触发,可以严格化AI语句中的事实条件,不但检测城堡HP小于960的时候增加资源,同时也要检测目前的资源是不是等于0,只有等于0才增加资源,这样就会很严格的避免同时增加资源的情况了。

这种情况在输入数字AI的时候经常出现,玩家可以暂停之后输入多个数字,这样整个触发系统都有可能被破坏,解决方法可以参考一下枫叶的帖子:https://www.hawkaoe.net/bbs/thread-113857-1-1.html

weidongzi 发表于 2016-6-30 09:39:05

本帖最后由 weidongzi 于 2016-6-30 17:35 编辑

条顿武士 发表于 2016-6-30 01:48
触发结构理论上是没问题的,但是有些马虎的地方写错了导致系统出了bug…



厉害!
请问有没有检测触发与AI中bug的工具?
使用反向累积属性协助判定资源数量是否等于某个值,是否不再需要两种资源一起判定?

weidongzi 发表于 2016-6-30 16:54:11

条顿武士 发表于 2016-6-30 01:54
忘了说,为了防止AI中的两个动作同时触发,可以严格化AI语句中的事实条件,不但检测城堡HP小于960的时候增 ...

56与15号资源是隐藏资源,请问在wood-amount这样的语句里面如何表达呢?

条顿武士 发表于 2016-6-30 19:08:48

weidongzi 发表于 2016-6-30 09:39
厉害!
请问有没有检测触发与AI中bug的工具?
使用反向累积属性协助判定资源数量是否等于某个值,是否 ...

是的,理论上不需要两种资源一起判定了。

这里有个检测触发中断的小程序:https://www.hawkaoe.net/bbs/thread-118177-1-1.html

不过对于有些MOD不兼容,使用MOD时记得删除。

检测触发和AI中的bug主要是靠经验,还有多次测试的耐心~

有些小技巧可以参考我的另一篇帖子:https://www.hawkaoe.net/bbs/forum.php?mod=viewthread&tid=114533

条顿武士 发表于 2016-6-30 19:14:02

weidongzi 发表于 2016-6-30 16:54
56与15号资源是隐藏资源,请问在wood-amount这样的语句里面如何表达呢?

需要多用一个变量来储存这个数据。

(defconst ziyuan 13)

然后用up-get-fact动作来读取资源数据并储存到这个变量。

(up-get-fact 34 56 ziyuan)

34是指资源,后面的56是资源下的参数,这里指56号资源,最后填写变量名称。

同理如果想存15号资源可以再定义一个ziyuan2变量,然后

(up-get-fact 34 15 ziyuan2)

之后可以调用和比较这个资源,比如判定资源是否等于0

(up-compare-goal ziyuan = 0)

也可以及时输出这个数值,随时查看电脑的资源数量,这也是测试AI时的一个好方法。

(up-chat-data-to-all "资源数为 %d." g: ziyuan)
页: [1]
查看完整版本: 继续求问关于AI与触发之交互的问题