射手が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).