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

[教程] 利用常数减轻AI编写者的工作量(应该也算一个教程吧)

[复制链接]

78

主题

13

精华

2万

积分

圣徒

耕战
2683
鹰币
182
天龙币
0
回帖
1957

二级皇家勋章一级嘉禾勋章二级帝国勋章十字军勋章雄鹰勋章活跃者使者勋章

附庸关系0
发表于 2009-8-14 16:06:30 | 显示全部楼层 |阅读模式
注:我写这篇东西,比较基础,已经懂的也不要骂,如果有不对请提意见。

一些新手 写AI的时候 经常喜欢这样子来写出兵代码:(以出骑士为例子)
(defrule
  (current-age == castle-age)
  (can-train knight)
  (unit-type-count-total knight < 30)
=>
  (train knight)
)

(defrule
  (current-age == castle-age)
  (can-train knight)

  (players-unit-type-count any enemy spearman-line >= 10)
  (unit-type-count-total knight < 15)
=>
  (train knight)
)

……
可是这样子,有太多的条件,而出兵数也要改来改去。后期修正的时候,更是要多次进行兵力调整,那有没有更好的方法呢?

用常数可以更方便。

不知道大家有没有看过别人做的AI,他们的开头都有一长串代码。例如:(以下是我从一个AI里面摘抄的)
(defconst livestock-line 958)   
(defconst monk-with-relic 286)   
(defconst max-map-size 255)     
(defconst ri-spying 408)        
(defconst sn-treb-count 64)      
(defconst unpacked-trebuchet 42)
(defconst stone-mine 102)        
(defconst gold-mine 66)         
(defconst G_YES 1)            
(defconst G_NO 0)               
(defconst buildplan 9)           
(defconst advancing-feudal 1)   
(defconst advancing-castle 2)   
(defconst advancing-imperial 3)
(defconst attack-goal 10)        
(defconst attacking-now 11)      
(defconst retreat 12)                                                                                    
(defconst gold-on-map 13)        
(defconst stone-on-map 14)
(defconst ri-herbal-medicine 441)
(defconst archer 15)
(defconst swords 16)
(defconst cavalry 17)
(defconst statistics 18)
(defconst enemy-military 19)
(defconst demon 20)
(defconst eradication 21)   
其中,(defconst XXX X)就是定义常数的语句。他的作用是定义一个常数,名字叫XXX,数量是X。
另外 你们也许已经注意到了,有些语句出兵的数量不是一个数,而是一串代码,例如:(也是摘抄的)
(defrule
  (current-age == imperial-age)
  (can-train spearman-line)
  (unit-type-count-total spearman-line < max-spearman-line)
=>
  (train spearman-line)
)
在这里并没有直接给出要生产多少个长矛兵系列(以下简称XX)的兵,为什么电脑还是认识呢?这就是因为max-spearman-line是之前已经定义的常数。

另外,常数定义了后也是可以改变的,请看如下例子:
(defrule
    (条件1)
    (条件2)  
    ……
=>
   (set-goal XXX X)
)
这里的XXX是之前用defconst定义的常数,X是改变成多少。

看到这,相信大家已经心中有数了吧!

以出骑士为例子:
第一步:在前面用defconst 定义常数
例如
(defconst goal-knight 30)           ←加上goal是为了避免搞混
第二步:写出兵代码很简单:
(defrule
    (unit-type-count knight-line < knight)
=>
    (train knight)
)
第三步:把各种情况下要产多少骑士列出来
例如当任何一个敌人有15个XX,就最多产20个骑士
(defrule
    (players-unit-type-count any-enemy spearman-line >=15)
=>
   (set-goal goal-knight 20)
)
这样就大功告成了!
详细的自己慢慢思考吧,如有疑惑或者认为我说错了请指出!

[ 本帖最后由 老胡V1 于 2009-8-18 11:22 编辑 ]
心烦意乱。静下来吧。
回复

使用道具 举报

36

主题

2

精华

2万

积分

征服者

耕战
4032
鹰币
241
天龙币
0
回帖
899

二级翔鹰勋章

附庸关系0
发表于 2009-8-14 16:14:17 | 显示全部楼层
抢沙发呀抢沙发……我来捧场了
回复

使用道具 举报

2

主题

0

精华

240

积分

男爵

耕战
34
鹰币
50
天龙币
0
回帖
45
附庸关系0
发表于 2009-8-31 07:06:04 | 显示全部楼层
一直不懂的我,现在有些眉目了,希望能出一个更详细的内容来学习,做一个教程.说不定,斑竹会给你+精嘞~~~
回复

使用道具 举报

本版积分规则

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

GMT+8, 2024-12-20 19:38 , Processed in 0.118389 second(s), 46 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

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

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