lws735 发表于 2010-8-26 14:15:56

AI中如何判断下列情况?

1.如何判断有几个人类同盟
2.如何判断有几个电脑同盟
3.如何判断有几个同盟
4.如何判断有几个人类敌人
5.如何判断有几个电脑敌人
6.如何判断有几个敌人

有点啰嗦,哪位老师知道?

bingbing 发表于 2010-9-1 14:42:19

我有个笨办法,对第1-8家挨个判断
以下是判断本队中有多少个电脑的代码(注自己也算一家电脑),其他请照葫芦画瓢
;--------------------
;--   goal ID    --
;--------------------
;如果与其他goal ID定义冲突,请修改
(defconst g-team                                          1)
(defconst g-team-tmp                                    2)
(defconst timer-team-judge-triggered                      3);


;--------------------
;--    定时器ID    --
;--------------------
;如果与其他定时器ID定义冲突,请修改
;注意,定时器最多只能有10个,其值不能大于10
(defconst TIMER-TEAM-JUDGE         10)


;--------------------
;-   常量    --
;宏的值不存在冲突问题,不需要修改
;--------------------

(defconst FALSE                  0)
(defconst TRUE                     1)

;g-team,g-team-tmp可能的值,
(defconst TEAM-0MEMBER             0);0人组队
(defconst TEAM-1MEMBER             1);1人组队
(defconst TEAM-2MEMBER             2);2人组队
(defconst TEAM-3MEMBER             3);3人组队
(defconst TEAM-4MEMBER             4);4人组队
(defconst TEAM-5MEMBER             5);5人或5人以上组队



;初始化
(defrule
    (true)
=>
    (set-goal g-team                      TEAM-1MEMBER)
    (set-goal g-team-tmp                  TEAM-1MEMBER)
    (set-goal timer-team-judge-triggered         FALSE)
    (enable-timer TIMER-TEAM-JUDGE 60)
    (disable-self)
)


;循环判断
;判断在游戏里的本组电脑数量(注:自己也算一个)

(defrule
    (timer-triggered TIMER-TEAM-JUDGE)
=>
    (set-goal timer-team-judge-triggered TRUE)
    (set-goal g-team-tmp          TEAM-1MEMBER)
)

;判断1p

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 1))
        (player-in-game 1)
        (player-computer 1)
        (stance-toward 1 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)

;判断2p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 2))
        (player-in-game 2)
        (player-computer 2)
        (stance-toward 2 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 2))
        (player-in-game 2)
        (player-computer 2)
        (stance-toward 2 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)


;判断3p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 3))
        (player-in-game 3)
        (player-computer 3)
        (stance-toward 3 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 3))
        (player-in-game 3)
        (player-computer 3)
        (stance-toward 3 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 3))
        (player-in-game 3)
        (player-computer 3)
        (stance-toward 3 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)

;判断4p

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 4))
        (player-in-game 4)
        (player-computer 4)
        (stance-toward 4 ally)
        (goal g-team-tmp TEAM-4MEMBER)
=>
        (set-goal g-team-tmp TEAM-5MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 4))
        (player-in-game 4)
        (player-computer 4)
        (stance-toward 4 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 4))
        (player-in-game 4)
        (player-computer 4)
        (stance-toward 4 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 4))
        (player-in-game 4)
        (player-computer 4)
        (stance-toward 4 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)


;判断5p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 5))
        (player-in-game 5)
        (player-computer 5)
        (stance-toward 5 ally)
        (goal g-team-tmp TEAM-4MEMBER)
=>
        (set-goal g-team-tmp TEAM-5MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 5))
        (player-in-game 5)
        (player-computer 5)
        (stance-toward 5 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 5))
        (player-in-game 5)
        (player-computer 5)
        (stance-toward 5 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 5))
        (player-in-game 5)
        (player-computer 5)
        (stance-toward 5 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)

;判断6p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 6))
        (player-in-game 6)
        (player-computer 6)
        (stance-toward 6 ally)
        (goal g-team-tmp TEAM-4MEMBER)
=>
        (set-goal g-team-tmp TEAM-5MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 6))
        (player-in-game 6)
        (player-computer 6)
        (stance-toward 6 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 6))
        (player-in-game 6)
        (player-computer 6)
        (stance-toward 6 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 6))
        (player-in-game 6)
        (player-computer 6)
        (stance-toward 6 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)


;判断7p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 7))
        (player-in-game 7)
        (player-computer 7)
        (stance-toward 7 ally)
        (goal g-team-tmp TEAM-4MEMBER)
=>
        (set-goal g-team-tmp TEAM-5MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 7))
        (player-in-game 7)
        (player-computer 7)
        (stance-toward 7 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 7))
        (player-in-game 7)
        (player-computer 7)
        (stance-toward 7 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 7))
        (player-in-game 7)
        (player-computer 7)
        (stance-toward 7 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)

;判断8p
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 8))
        (player-in-game 8)
        (player-computer 8)
        (stance-toward 8 ally)
        (goal g-team-tmp TEAM-4MEMBER)
=>
        (set-goal g-team-tmp TEAM-5MEMBER)
)
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 8))
        (player-in-game 8)
        (player-computer 8)
        (stance-toward 8 ally)
        (goal g-team-tmp TEAM-3MEMBER)
=>
        (set-goal g-team-tmp TEAM-4MEMBER)
)
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 8))
        (player-in-game 8)
        (player-computer 8)
        (stance-toward 8 ally)
        (goal g-team-tmp TEAM-2MEMBER)
=>
        (set-goal g-team-tmp TEAM-3MEMBER)
)
(defrule
    (goal timer-team-judge-triggered TRUE)
        (not(player-number 8))
        (player-in-game 8)
        (player-computer 8)
        (stance-toward 8 ally)
        (goal g-team-tmp TEAM-1MEMBER)
=>
        (set-goal g-team-tmp TEAM-2MEMBER)
)

(defrule
    (goal timer-team-judge-triggered TRUE)
    (goal g-team-tmp          TEAM-1MEMBER)
=>
    (set-goal g-team          TEAM-1MEMBER)
    (chat-local "一人组队")
)

(defrule
    (goal timer-team-judge-triggered TRUE)
    (goal g-team-tmp          TEAM-2MEMBER)
=>
    (set-goal g-team          TEAM-2MEMBER)
    (chat-local "两人组队")
)

(defrule
    (goal timer-team-judge-triggered TRUE)
    (goal g-team-tmp          TEAM-3MEMBER)
=>
    (set-goal g-team          TEAM-3MEMBER)
    (chat-local "三人组队")
)

(defrule
    (goal timer-team-judge-triggered TRUE)
    (goal g-team-tmp          TEAM-4MEMBER)
=>
    (set-goal g-team          TEAM-4MEMBER)
    (chat-local "四人组队")
)

(defrule
    (goal timer-team-judge-triggered TRUE)
    (goal g-team-tmp          TEAM-5MEMBER)
=>
    (set-goal g-team          TEAM-5MEMBER)
    (chat-local "五人或五人以上组队")
)

;一轮判断完毕后,重新启动定时器
(defrule
    (goal timer-team-judge-triggered TRUE)
=>
    (set-goal timer-team-judge-triggered FALSE)
    (enable-timer TIMER-TEAM-JUDGE 60)
)

bingbing 发表于 2010-9-1 14:55:17

我认为对1-8家依次判断是唯一可行的办法。
反例是Kosmos中的代码:
(defrule
    (players-tribute any-ally food < 2000)                  
    (player-in-game every-ally)                           
    (food-amount >= 3000)                                 
=>
    (tribute-to-player this-any-ally food 1000)
)

这段代码本意是实现资源共享的,
但是却有两个问题:
1 只有序号最小的同盟才会收到贡品
例如我创建了游戏,我是1p,序号最小,跟我结盟的kosmos老是进贡给我,而其他同盟则收不到
2 任何一家同盟退出都会造成该机制停摆
如果有一家退出,(player-in-game every-ally) 就成了false

lws735 发表于 2010-9-1 17:25:30

收下仔细研究,谢了
收下仔细研究,谢了
页: [1]
查看完整版本: AI中如何判断下列情况?