2013-05-25 6 views
-1

Я реализовал Phutball в CLIPS. Я не знаю, почему, но у меня такое чувство, что у меня есть избыточные, «опасные» вещи, написанные здесь. Я отправлю часть программ и надеюсь, что вы поможете мне немного почистить или сделать ее более компактной. Хотя программа работает и проходит все тесты, мне по-прежнему нужен еще один набор глаз.CLIPS очистка кода

Вот шаблон мира:

(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

Я не совсем понимаю, как вы управляете ходами, но вот мои мысли.

Если у вас есть только один мир, в то же время, я бы не использовать шаблон для него и имеют различные факты своей информации:

(deffunction init() 
    ; Give value to the variables 
    (assert (limit ?width ?height)) 
    (assert (ball ?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...) 
) 

так нет необходимо создать правило для заблокированного перемещения, поскольку правило для действительного один не будет уволен за неправильный ход

0

Недавно я реализовал phutball в F #, его часть, потому что я не мог найти другую реализацию этой игры. Если вам интересно, вот код: https://github.com/htoma/phutball-fs