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

[求助] 想写一个判断血量的简单AI,遇到一些问题

 关闭 [复制链接]

18

主题

0

精华

327

积分

子爵

耕战
30
鹰币
229
天龙币
0
回帖
47
附庸关系0
发表于 2016-6-26 02:00:02 | 显示全部楼层 |阅读模式
本帖最后由 weidongzi 于 2016-6-27 14:49 编辑

这是一个夺塔小实验,塔1-7为腐败之塔,塔8为诅咒之塔(id为4480-4486以及4597)。代码如下:

  1. (defconst Object-data-hitpoints 10)

  2. (defrule
  3.     (true)
  4. =>
  5.     (set-strategic-number sn-maximum-food-drop-distance 0)
  6.     (set-strategic-number sn-maximum-wood-drop-distance 0)
  7.     (set-strategic-number sn-maximum-gold-drop-distance 0)
  8.     (set-strategic-number sn-maximum-stone-drop-distance 0)
  9.     (set-strategic-number sn-percent-civilian-gatherers 0)
  10.     (set-strategic-number sn-percent-civilian-builders 0)
  11.     (set-strategic-number sn-percent-civilian-explorers 0)
  12.     (set-strategic-number sn-maximum-hunt-drop-distance 0)
  13.     (set-strategic-number sn-maximum-fish-boat-drop-distance 0)
  14.     (set-strategic-number sn-task-ungrouped-soldiers 0)
  15.     (set-strategic-number sn-total-number-explorers 0)
  16.     (disable-self)
  17. )


  18. (defrule
  19.     (true)
  20. =>
  21.     (up-set-target-by-id c: 4484)
  22.     (up-get-object-data object-data-hitpoints towerHP1)
  23.     (up-set-target-by-id c: 4480)
  24.     (up-get-object-data object-data-hitpoints towerHP2)
  25.     (up-set-target-by-id c: 4481)
  26.     (up-get-object-data object-data-hitpoints towerHP3)
  27.     (up-set-target-by-id c: 4482)
  28.     (up-get-object-data object-data-hitpoints towerHP4)
  29.     (up-set-target-by-id c: 4497)
  30.     (up-get-object-data object-data-hitpoints towerHP5)
  31.     (up-set-target-by-id c: 4483)
  32.     (up-get-object-data object-data-hitpoints towerHP6)
  33.     (up-set-target-by-id c: 4485)
  34.     (up-get-object-data object-data-hitpoints towerHP7)
  35.     (up-set-target-by-id c: 4486)
  36.     (up-get-object-data object-data-hitpoints towerHP8)
  37. )

  38. (defrule
  39.     (true)
  40. =>
  41.     (set-goal 1 0)
  42.     (set-goal 2 0)
  43.     (set-goal 3 0)
  44.     (set-goal 4 0)
  45.     (set-goal 5 0)
  46.     (set-goal 6 0)
  47.     (set-goal 7 0)
  48.     (set-goal 8 0)
  49.     (disable-self)
  50. )


  51. (defrule
  52.     (goal 1 0)
  53.     (up-compare-goal towerHP1 < 380)
  54. =>
  55.     (chat-to-all "tower1中立" )
  56.     (set-signal 1)
  57.     (set-goal 1 1)
  58. )

  59. (defrule
  60.     (goal 1 1)
  61.     (up-compare-goal towerHP1 >= 380)
  62. =>
  63.     (chat-to-all "tower1占领" )
  64.     (set-signal 2)
  65.     (set-goal 1 0)
  66. )

  67. (defrule
  68.     (goal 2 0)
  69.     (up-compare-goal towerHP2 < 380)
  70. =>
  71.     (chat-to-all "tower2中立" )
  72.     (set-signal 3)
  73.     (set-goal 2 1)
  74. )

  75. (defrule
  76.     (goal 2 1)
  77.     (up-compare-goal towerHP2 >= 380)
  78. =>
  79.     (chat-to-all "tower2占领" )
  80.     (set-signal 4)
  81.     (set-goal 2 0)
  82. )

  83. (defrule
  84.     (goal 3 0)
  85.     (up-compare-goal towerHP3 < 380)
  86. =>
  87.     (chat-to-all "tower3中立" )
  88.     (set-signal 5)
  89.     (set-goal 3 1)
  90. )

  91. (defrule
  92.     (goal 3 1)
  93.     (up-compare-goal towerHP3 >= 380)
  94. =>
  95.     (chat-to-all "tower3占领" )
  96.     (set-signal 6)
  97.     (set-goal 3 0)
  98. )

  99. (defrule
  100.     (goal 4 0)
  101.     (up-compare-goal towerHP4 < 380)
  102. =>
  103.     (chat-to-all "tower4中立" )
  104.     (set-signal 7)
  105.     (set-goal 4 1)
  106. )

  107. (defrule
  108.     (goal 4 1)
  109.     (up-compare-goal towerHP4 >= 380)
  110. =>
  111.     (chat-to-all "tower4占领" )
  112.     (set-signal 8)
  113.     (set-goal 4 0)
  114. )

  115. (defrule
  116.     (goal 5 0)
  117.     (up-compare-goal towerHP5 < 380)
  118. =>
  119.     (chat-to-all "tower5中立" )
  120.     (set-signal 9)
  121.     (set-goal 5 1)
  122. )

  123. (defrule
  124.     (goal 5 1)
  125.     (up-compare-goal towerHP5 >= 380)
  126. =>
  127.     (chat-to-all "tower5占领" )
  128.     (set-signal 10)
  129.     (set-goal 5 0)
  130. )

  131. (defrule
  132.     (goal 6 0)
  133.     (up-compare-goal towerHP6 < 380)
  134. =>
  135.     (chat-to-all "tower6中立" )
  136.     (set-signal 11)
  137.     (set-goal 6 1)
  138. )

  139. (defrule
  140.     (goal 6 1)
  141.     (up-compare-goal towerHP6 >= 380)
  142. =>
  143.     (chat-to-all "tower6占领" )
  144.     (set-signal 12)
  145.     (set-goal 6 0)
  146. )

  147. (defrule
  148.     (goal 7 0)
  149.     (up-compare-goal towerHP7 < 380)
  150. =>
  151.     (chat-to-all "tower7中立" )
  152.     (set-signal 13)
  153.     (set-goal 7 1)
  154. )

  155. (defrule
  156.     (goal 7 1)
  157.     (up-compare-goal towerHP7 >= 380)
  158. =>
  159.     (chat-to-all "tower7占领" )
  160.     (set-signal 14)
  161.     (set-goal 7 0)
  162. )

  163. (defrule
  164.     (goal 8 0)
  165.     (up-compare-goal towerHP8 < 500)
  166. =>
  167.     (chat-to-all "tower8中立" )
  168.     (set-signal 15)
  169.     (set-goal 8 1)
  170. )

  171. (defrule
  172.     (goal 8 1)
  173.     (up-compare-goal towerHP8 >= 500)
  174. =>
  175.     (chat-to-all "tower8占领" )
  176.     (set-signal 16)
  177.     (set-goal 8 0)
  178. )
复制代码

测试时遇到了这样的问题:


有请高手看一下,是不是我的代码写漏了什么。感谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册翔鹰会员(昵称)

x
回复

使用道具 举报

688

主题

30

精华

8万

积分

教皇

耕战
10902
鹰币
542492
天龙币
512
回帖
7008

翔鹰建站十周年纪念章翔鹰十周年帝国Online纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章特级皇家勋章鹰之王者雄鹰勋章第四届火箭筒杯最佳战役第五届火箭筒杯最佳战役第九届火箭筒杯最佳战役第二届战鹰杯单人赛季军第八届战鹰杯单人赛季军鸽子勋章

附庸关系12
发表于 2016-6-26 09:48:55 | 显示全部楼层
AI出错的提示说的很清楚,是25行的位置,TowerHp1这个词没有定义。

实际上在使用目标变量存储数据的时候需要事先定义,方法和定义常数一样,使用defconst,需要定义的是TowerHp1这个词所带表的目标变量编号。

1.4的AI最多支持512个变量,但是一般个位数的变量我们会直接调用,比如下面这段:

(defrule
    (true)
=>
    (set-goal 1 0)
    (set-goal 2 0)
    (set-goal 3 0)
    (set-goal 4 0)
    (set-goal 5 0)
    (set-goal 6 0)
    (set-goal 7 0)
    (set-goal 8 0)
    (disable-self)
)


这里就把编号为1-8的变量全部设置成了0。

如果把这句话中的TowerHP1换成数字9,实际上就不会出错了…意思是把塔的HP存在了编号为9的变量里。

    (up-set-target-by-id c: 4484)
    (up-get-object-data Object-data-hitpoints TowerHP1)


但是如果数字编号直接使用过多,AI的可读性就会下降,到了后来作者自己都会忘了哪个变量存的是什么数据…所以一般我们自定义一个英文名来代表一个编号。

只需要在AI最开始的地方加一些编号定义:

(defconst TowerHP1 9)
(defconst TowerHP2 10)
(defconst TowerHP3 11)
等等

那么后面的语句就不会出错了。
回复

使用道具 举报

18

主题

0

精华

327

积分

子爵

耕战
30
鹰币
229
天龙币
0
回帖
47
附庸关系0
 楼主| 发表于 2016-6-26 19:22:19 | 显示全部楼层
条顿武士 发表于 2016-6-26 09:48
AI出错的提示说的很清楚,是25行的位置,TowerHp1这个词没有定义。

实际上在使用目标变量存储数据的时候 ...

谢谢解答。AI现在能读了,但是测试时又出了问题。我的触发这么做:

触发1:循环,开启
条件:AI信号1
效果:改变所有权,将塔换至中立玩家名下

触发2:循环,开启
条件:AI信号2
效果:改变所有权,将塔给玩家1

测试中,我把塔1HP削至不足20%,塔1归中立玩家,中立玩家发送消息“tower1中立”;
腐败之塔自动回血,达到20%,塔1归我,中立玩家发送消息“tower1占领”。

以上两步均符合先前设计。

但当塔1再次遭受攻击,HP不足20%,中立玩家也发送了“tower1中立”的消息,但此时塔1所有权循环归我(没法持续选中)。敌方连续攻击,直至塔1被毁。此时,中立玩家发送消息“tower1占领”。

这让我有点摸不着头脑,到底是哪里出了错。难道goal 1变量此时恒为0了?

PS:在AI版讨论触发不算太离题吧。。。
回复

使用道具 举报

688

主题

30

精华

8万

积分

教皇

耕战
10902
鹰币
542492
天龙币
512
回帖
7008

翔鹰建站十周年纪念章翔鹰十周年帝国Online纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章特级皇家勋章鹰之王者雄鹰勋章第四届火箭筒杯最佳战役第五届火箭筒杯最佳战役第九届火箭筒杯最佳战役第二届战鹰杯单人赛季军第八届战鹰杯单人赛季军鸽子勋章

附庸关系12
发表于 2016-6-26 20:11:38 | 显示全部楼层
weidongzi 发表于 2016-6-26 19:22
谢谢解答。AI现在能读了,但是测试时又出了问题。我的触发这么做:

触发1:循环,开启

是因为AI信号这个东西原理上比较奇怪。

(set-signal 1)

这句其实不是我们理解的发送AI信号1,而是把1号AI信号设为“开”。

相当于AI信号从1到255是255个开关,只有开和关两个状态。将一个AI信号设置为“开”之后,如果不手动关闭它,它就一直是“开”状态。而触发里面的“检测AI信号”条件实际上就是检测对应的信号是“开”还是“关”,如果是“开”就满足条件。

所以一开始箭塔血少于20%,1号AI信号开启,变成中立;之后箭塔回血,2号AI信号也开启,箭塔变回玩家1,这里都可以运行。但是之后无论箭塔HP怎么变化,实际上都是两个AI信号全部开启的状态,两个触发就一直满足条件循环运行…导致bug。

解决方法是手动添加一个关闭注销AI信号的语句:
(acknowledge-taunt this-any-computer X)

其中X的位置填入对应的AI信号编号即可。

比如下面语句中加入红色的部分:

(defrule
    (goal 1 0)
    (up-compare-goal TowerHP1 < 380) ; 血量削至腐败之塔20%以下。
=>
    (chat-to-all "tower1中立" )
    (acknowledge-taunt this-any-computer 2)
    (set-signal 1) ; 发送AI信号,触发改变所有权,将塔换至中立玩家名下。
    (set-goal 1 1)
)

(defrule
    (goal 1 1)
    (up-compare-goal TowerHP1 >= 380) ; 血量恢复至腐败之塔20%以上。
=>
    (chat-to-all "tower1占领" )
    (acknowledge-taunt this-any-computer 1)
    (set-signal 2) ; 发送AI信号,触发改变所有权,将塔换至占领玩家名下。
    (set-goal 1 0)
) ; 以下塔2-8原理相同。

AI信号1开启之前先关闭2,同样2开启之前先关闭1,这样就不会出现1和2同时开启的情况了。

回复

使用道具 举报

144

主题

4

精华

1万

积分

宗主教

耕战
2738
鹰币
531096
天龙币
47
回帖
14734

翔鹰建站十周年纪念章二级帝国勋章一级嘉禾勋章翔六水王创意工坊通行证

附庸关系12
发表于 2016-6-26 20:40:47 | 显示全部楼层
本帖最后由 一窍不开 于 2016-6-26 20:43 编辑
条顿武士 发表于 2016-6-26 20:11
是因为AI信号这个东西原理上比较奇怪。

(set-signal 1)

印象里这个set-signal是无法被取消的。

建议楼主使用资源法进行联动。
回复

使用道具 举报

688

主题

30

精华

8万

积分

教皇

耕战
10902
鹰币
542492
天龙币
512
回帖
7008

翔鹰建站十周年纪念章翔鹰十周年帝国Online纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章特级皇家勋章鹰之王者雄鹰勋章第四届火箭筒杯最佳战役第五届火箭筒杯最佳战役第九届火箭筒杯最佳战役第二届战鹰杯单人赛季军第八届战鹰杯单人赛季军鸽子勋章

附庸关系12
发表于 2016-6-26 20:52:45 | 显示全部楼层
一窍不开 发表于 2016-6-26 20:40
印象里这个set-signal是无法被取消的。

建议楼主使用资源法进行联动。

啊,我想起来了…

那么就只能使用资源和触发连接了,用cc-add-resource动作使AI作弊增加资源,然后用触发检测资源实行命令,最后用触发清零资源保证可以多次触发。

把(set-signal 1)换成(cc-add-resource <资源种类> <数量>) ,资源种类只能是是以下其中一项:

food(食物)
gold(黄金)
stone(石头)
wood(木材)

触发检测到电脑玩家有某项资源之后,进贡这项资源给盖亚,然后执行效果即可。

由于资源栏数量有限,所以楼主可以考虑使用下面的方法来检测8个箭塔。

cc-add-resource 100石头 1木材 替代(set-signal 1)
cc-add-resource 99石头 2木材 替代(set-signal 2)
等等

以此类推…检测资源的时候使用两个条件来检测即可。
回复

使用道具 举报

18

主题

0

精华

327

积分

子爵

耕战
30
鹰币
229
天龙币
0
回帖
47
附庸关系0
 楼主| 发表于 2016-6-27 14:38:41 | 显示全部楼层
感谢楼上的高手们。可惜正常采集资源的玩家无法借助资源法判定。目前除了资源法还有没有方便AI与触发进行交互的方法呢?另外,进贡的资源真的只能是这四种基本资源吗?既然Aokts可以启用隐藏资源,那么理论上来说AI也可以吧?
回复

使用道具 举报

688

主题

30

精华

8万

积分

教皇

耕战
10902
鹰币
542492
天龙币
512
回帖
7008

翔鹰建站十周年纪念章翔鹰十周年帝国Online纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章特级皇家勋章鹰之王者雄鹰勋章第四届火箭筒杯最佳战役第五届火箭筒杯最佳战役第九届火箭筒杯最佳战役第二届战鹰杯单人赛季军第八届战鹰杯单人赛季军鸽子勋章

附庸关系12
发表于 2016-6-27 16:38:24 | 显示全部楼层
weidongzi 发表于 2016-6-27 14:38
感谢楼上的高手们。可惜正常采集资源的玩家无法借助资源法判定。目前除了资源法还有没有方便AI与触发进行交 ...

可以使用cc-add-resource作用于隐藏资源,后面依次填入资源编号和数量即可。

但是有些隐藏资源会在游戏中改变,尽量不要用,比如杀敌数之类的,而相对安全的隐藏资源,比如56号资源矿物,和15号资源肉量都是相对稳定的,可以利用。

(cc-add-resource 56 1)
(cc-add-resource 15 100)

然后用触发检测这些资源就好了~方法和普通资源是一样的,需要用到触发工作室AOKTS。

回复

使用道具 举报

3

主题

0

精华

15

积分

骑士

耕战
0
鹰币
10
天龙币
0
回帖
18
附庸关系0
发表于 2016-6-27 17:55:12 | 显示全部楼层
可以判断血量的AI?太支持了
本来打算做一个,何奈对AI一窍不通
楼楼做好了一定要发布出来注明使用方法,期待
回复

使用道具 举报

688

主题

30

精华

8万

积分

教皇

耕战
10902
鹰币
542492
天龙币
512
回帖
7008

翔鹰建站十周年纪念章翔鹰十周年帝国Online纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章特级皇家勋章鹰之王者雄鹰勋章第四届火箭筒杯最佳战役第五届火箭筒杯最佳战役第九届火箭筒杯最佳战役第二届战鹰杯单人赛季军第八届战鹰杯单人赛季军鸽子勋章

附庸关系12
发表于 2016-6-27 19:26:46 | 显示全部楼层
另外楼主可以考虑加入翔鹰活跃的战役制作者QQ群498122293,大家一起讨论会比较及时的解决一些制作上的问题~
回复

使用道具 举报

18

主题

0

精华

327

积分

子爵

耕战
30
鹰币
229
天龙币
0
回帖
47
附庸关系0
 楼主| 发表于 2016-6-27 23:29:32 | 显示全部楼层
条顿武士 发表于 2016-6-27 19:26
另外楼主可以考虑加入翔鹰活跃的战役制作者QQ群498122293,大家一起讨论会比较及时的解决一些制作上的问题~

哈哈,荣幸之至~
回复

使用道具 举报

本版积分规则

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

GMT+8, 2024-11-22 07:57 , Processed in 0.231838 second(s), 127 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

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

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