我在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程序员,我希望你能帮我清理一下。谢谢
答案 0 :(得分:0)
我不太明白你是如何管理这些动作的,但这是我的想法。
如果您同时只有一个世界,我不会使用模板,并且其信息有不同的事实:
(deffunction init ()
; Give value to the variables
(assert (limit ?width ?height))
(assert (ball ?x ?y))
...
)
对场上的每个人使用一个事实(男人?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...)
)
所以没有必要为阻止移动制定规则,因为对于错误的移动不会触发有效移动的规则
答案 1 :(得分:0)
我最近在F#中实施了phutball,其中一部分是因为我找不到任何其他实现此游戏的内容。 如果您有兴趣,请输入以下代码:https://github.com/htoma/phutball-fs