2

射手が4 x 4システムのグリッド上で安全な隣接する正方形に移動する Prolog アプリケーションを作成しようとしています。これは射手自身が行う必要があります。たとえば、射手のの正方形が安全な場合です。彼はそこに移動します。安全でない場合は、右側の正方形をチェックし、安全な場合はそこに移動します。

アーチャーはセル 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