9章 番外編3 〜その他のテクニック〜

状況に応じてAIに臨機応変な動作をさせたい場合、より細かい条件を設定して命令する必要があります。ここでは複雑な条件設定についての説明をします。

1.「or」の使用

現在の資源量に応じて軍の生産量を変える条件設定をする。資源を余らせ過ぎたり、資源が少ないのに軍事ユニットを作り過ぎることが少なくなる。

(1)領主の時代に射手を20体、金が300以上ある場合は30体まで作成する

;●射手生産
(defrule
  (current-age == feudal-age)                             ;領主の時代
  (or
    (unit-type-count-total archer-line < 20)              ;射手20未満
    (and
      (unit-type-count-total archer-line < 30)            ;射手30未満
      (gold-amount >= 300)                                ;金が300以上
    )
  )
  (can-train archer-line)                                 ;作成できる
=>
  (train archer-line)                                     ;射手の作成
)
;●射手生産
(defrule
  (current-age == feudal-age)                             ;領主の時代
  (unit-type-count-total archer-line < 30)                ;射手30未満
  (or
    (unit-type-count-total archer-line < 20)              ;射手20未満
    (gold-amount >= 300)                                  ;金が300以上
  )
  (can-train archer-line)                                 ;作成できる
=>
  (train archer-line)                                     ;射手の作成
)

上記の2つルールの例はどちらも同じ動作をする。下のルールは、直感的にわかりにくいがルールの条件数が1つ少なくなるので、ルールに条件を1つ多く追加することが可能である。
(1つのルールにつき「条件(and,orも1つとカウント)」と「命令」の合計が16個までの制限があるため)

 

(2)領主の時代に金が100以上ある場合は射手を20体、金が300以上ある場合は30体まで作成する

;●町の人の設定
(defrule
  (current-age == feudal-age)                             ;領主の時代
  (or
    (and
      (unit-type-count-total archer-line < 20)            ;射手20未満
      (gold-amount >= 100)                                ;金が100以上
    )
    (and
      (unit-type-count-total archer-line < 30)            ;射手30未満
      (gold-amount >= 300)                                ;金が300以上
    )
  )
  (can-train archer-line)                                 ;作成できる
=>
  (train archer-line)                                     ;射手の作成
)
;●町の人の設定
(defrule
  (current-age == feudal-age)                             ;領主の時代
  (unit-type-count-total archer-line < 30)                ;射手30未満
  (gold-amount >= 100)                                    ;金が100以上
  (or
    (unit-type-count-total archer-line < 20)              ;射手20未満
    (gold-amount >= 300)                                  ;金が300以上
  )
  (can-train archer-line)                                 ;作成できる
=>
  (train archer-line)                                     ;射手の作成
)

上記の2つルールの例はどちらも同じ動作をする。下のルールは、直感的にわかりにくいがルールの条件数が2つ少なくなるので、ルールに条件を2つ多く追加することが可能である。

 

2.研究中の判定

城主の時代になったらすぐに「石弓射手」の研究と「錐状矢じり」の研究をしたい。ただし「石弓射手」の研究を優先する。

(1)石弓射手の研究が完了したら錐状矢じりを研究する

;●射手生産
(defrule
  (current-age == castle-age)                             ;城主の時代
  (research-completed ri-crossbow)                        ;石弓射手研究済み
  (can-research ri-bodkin-arrow)                          ;錐状矢じりが研究可能
  =>
  (research ri-bodkin-arrow)                              ;錐状矢じりを研究する
)

上の条件では「石弓射手」の研究を優先ることはできるが、資源が余っても、「石弓射手」の研究が完了するまで「錐状矢じり」の研究が開始できない。

 

(2)石弓射手の研究中か研究が完了したら錐状矢じりを研究する

;●射手生産
(defrule
  (current-age == castle-age)                             ;城主の時代
  (not(research-available ri-crossbow))                   ;石弓射手の研究が無効
  (can-research ri-bodkin-arrow)                          ;錐状矢じりが研究可能
  =>
  (research ri-bodkin-arrow)                              ;錐状矢じりを研究する
)

「(research-available xxxxx)」というのは、「研究の前提条件を満たし、且つ研究中や研究完了でないとき」という条件である。逆に「not(research-available xxxxx)」は、「研究の前提条件を満たしていない、または研究中または研究完了のとき」という条件になる。

上記のルールでは「城主の時代」という条件があり、錐状矢じりの「研究の前提条件を満たさない」ことはないので、「not(research-available xxxxx)」は「研究中または研究完了のとき」という条件と同じ意味になる。このように「not(research-available xxxxx)」を使えば研究中かどうかを判定できる。