2

我正在尝试编写一个 Prolog 应用程序,如果弓箭手将移动到相邻的正方形中,该正方形在4 x 4系统中的网格上是安全的,这应该由弓箭手自己完成,例如,如果弓箭手上方的正方形安全的他会搬进去,如果不安全,他会检查右边的广场,如果安全,他就会搬进去。

弓箭手从 4,1 牢房开始,目前弓箭手上方和右侧有一个微风广场。每个方格都有微风金色闪光,所以弓箭手在方格4,1 微风在 3,1 和 4,2 中。到目前为止,我已经让用户输入了他们想要去的坐标,例如,如果我输入safe_square(4,1,3,1).弓箭手将从4,1移动到3,1,因为单元格是安全的。

但这不是一个好方法,因为弓箭手自己应该检查所有相邻的选项,然后自己选择要进入的单元格。我所做的命令是弓箭手首先safe_square()检查金子,然后检查闪光,然后是空的,最后是安全的。这是它应该做的,但是因为用户自己必须输入他们想去的地方,所以代码是无关紧要的。

这是我目前的做法:

safe_square(Xa,Ya,X,Y,N) :-
maxBound(N),
adjacent(Xa,Ya,X,Y,N),
safe(X,Y),
      move(Xa,Ya,X,Y),
retract(show(L)),
append([[X,Y]],L,NewL),
assert(show(NewL)).

move(Xa,Ya,X,Y) :-
retract(square(Xa,Ya,ListFrom)),
delete(ListFrom,a,Existing),
retract(square(X,Y,ListTo)),
append([a],ListTo,NextPositionList),
assert(square(Xa,Ya,Existing)),
assert(square(X,Y,NextPositionList)),
!.

at(X1,Y1,E) :-
square(X1,Y1,L), member(E,L).

safe(X,Y) :-
square(X,Y,L),
\+ member(p,L),
\+ member(w,L).

adjacent(R,C,Ar,Ac,_) :- Ar is R -1,  Ar >= 1,  Ac is C.
adjacent(R,C,Ar,Ac,N) :-  Ar is R + 1,  Ar =< N,  Ac is C.
adjacent(R,C,Ar,Ac,_) :-  Ac is C - 1,  Ac >= 1,  Ar is R.
adjacent(R,C,Ar,Ac,N) :-  Ac is C + 1,  Ac =< N, Ar is R.

如果没有用户输入,我怎么能做到这一点?

我试过了,但没有用:

safe_square(X,Y,L) :-
maxBound(N),
adjacent(Xa,Ya,X,Y,N),
gold(X,Y),
    move(Xa,Ya,X,Y),
retract(show(L)),
append([[X,Y]],L,NewL),
assert(show(NewL)).

我也试过这个:

at(X,Y,E) :-
square(X,Y,L), member(E,L).
4

0 回答 0