Как заставить человека двигаться, проверяя соседние квадраты, а не вводя их вручную в прологе?
Я пытаюсь написать приложение 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).