老胡V1 发表于 2009-8-14 16:06:30

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

注:我写这篇东西,比较基础,已经懂的也不要骂,如果有不对请提意见。

一些新手 写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 编辑 ]

RackSa 发表于 2009-8-14 16:14:17

抢沙发呀抢沙发……我来捧场了

hbd 发表于 2009-8-31 07:06:04

一直不懂的我,现在有些眉目了,希望能出一个更详细的内容来学习,做一个教程.说不定,斑竹会给你+精嘞~~~
页: [1]
查看完整版本: 利用常数减轻AI编写者的工作量(应该也算一个教程吧)