-1

我已经在 CLIPS 中实现了 Phutball。我不知道为什么,但我觉得我在这里写了一些多余的、“危险”的东西。我将发布部分程序,希望您能帮助我清理一下或使其更紧凑。尽管该程序有效并通过了所有测试,但我仍然想要另一双眼睛。

这是世界模板:

(deftemplate world
(multislot limit) ; max size (width, height)
(multislot ball) ; the ball
(multislot men) ; positions one after another, x y -,
(slot id) ; id for world
(multislot moves) ; moves list , null at start
(slot coord) ; coordinates for next move
)

我的坐标是这些:

(deffacts coordinates "Direction"

(coord 1 0 D)
(coord -1 0 U)
(coord 0 -1 L)
(coord 0 1 R)
(coord -1 -1 UL)
(coord -1 1 UR)
(coord 1 -1 DL)
(coord 1 1 DR)
)

这是我的一个运动功能,它检查一个位置是否没有男人,它不能再进一步了。

(defrule blocked_move
    (coord ?gox ?goy ?poz)

?f <-(myWorld
        (limit $?l)
        (ball ?x ?y)
        (men $?men)
        (id ?curent)
        (moves $?mutari)
        (coord ?poz)
)
;no position to go next
 (not (myWorld
             (limit $?l)
             (ball ?x ?y)
             (men  $?start ?mx &:(eq (+ ?x ?gox) ?mx) ?my &:(eq (+ ?y ?goy) ?my) - $?end)
             (id ?curent)
             (moves $?mutari)
             (coord ?poz)
))

=>
;go back to a position with no direction
(retract ?f)
(assert(myWorld
         (limit $?l)
         (ball (+ ?x ?gox) (+ ?y ?goy))
         (men $?men)
         (id ?curent)
         (moves $?mutari (+ ?x ?gox) (+ ?y ?goy) -) 
         (coord NULL)
))
)

我还有一个移动功能(只要有玩家跳过就移动),但上面的那个让我很困扰。如果你熟悉 Philosopher's Football 或者只是一个优秀的 CLIPS 程序员,我希望你能帮我清理一下。谢谢

4

2 回答 2

0

我不太明白你是如何管理这些动作的,但这是我的想法。

如果您同时只有一个世界,我不会为其使用模板并为其信息提供不同的事实:

(deffunction init ()
    ; Give value to the variables 
    (assert (limit ?width ?height))
    (assert (ball ?x ?y))
    ...
)

并为该领域的每个人使用一个事实(man ?x ?y)(这只是一个初步想法,也许在实际情况下列表更容易管理),因此有效移动的规则如下:

(defrule valid_move
    (coord ?gox ?goy ?poz)
    ;there is a man 1 position away in the direction i want to move
    ?m <- (man ?mx &:(eq (+ ?x ?gox) ?mx) ?my &:(eq (+ ?y ?goy) ?my))
    (test (;final position of the ball not out of bounds of the field))
=>
    ;do whatever to take the move ?gox ?goy as valid (move ball, remove men, or save the movement for later use...)
)

所以没有必要为被阻止的移动制定规则,因为有效的规则不会因为错误的移动而被触发

于 2013-05-25T18:49:50.907 回答
0

我最近在 F# 中实现了 phutball,其中一部分是因为我找不到该游戏的任何其他实现可以玩。如果你有兴趣,这里是代码:https ://github.com/htoma/phutball-fs

于 2016-02-02T14:07:28.673 回答