Марк прав в деньгах. Вероятно, вы захотите заменить весь свой код чем-то вроде этого:
:- dynamic at/2, holding/1.
at(player, room1).
at(revolver, room1).
take(X) :-
at(player, Place),
at(X, Place),
!,
format('You pick up the ~a.~n', [X]),
retract(at(X,Place)),
assert(holding(X)).
take(X) :-
holding(X),
!,
format('You''re already holding the ~a!~n', [X]).
Есть много интересных способов, которыми вы могли бы пойти дальше. Оператор is_at
может сделать код более читабельным:
take(X) :-
player is_at Place,
X is_at Place,
...
У вас также могут быть хорошие аргументы, основанные на прецедентах, для получения статей и многого другого:
subject(X, Some_X) :- mass_noun(X), !, atom_concat('some ', X, Some_X).
subject(X, The_X) :- atom_concat('the ', X, The_X).
mass_noun(water).
то вы можете интегрировать их в процедуры вывода:
take(X) :-
...
subject(X, Subj),
format('You take ~a.~n', [Subj]),
...
Вы также можете делать забавные вещи с DCG, чтобы генерировать выходные данные:
:- use_module(library(dcg/basics)).
success(take(X)) --> "You took ", subject(X).
subject(X) --> "the ", atom(X).
Вы можете сделать это еще более общим с некоторыми театральными действиями, такими как:
success_term(Command) --> { Command =.. CommandList }, success(CommandList).
success([Command, DirectObject]) -->
"You ", past_tense(Command), " ", subject(DirectObject), ".".
subject(Noun) --> "the ", atom(Noun).
past_tense(X) --> { past_tense(X, Y) }, atom(Y).
past_tense(take, took).
past_tense(X, Xed) :- atom_concat(X, 'ed', Xed).
Затем запустите это так: phrase(success_term(take(revolver)), X), format('~s~n', [X])
, и вы получите You took the revolver.
, что довольно аккуратно.
Эти текстовые приключения очень весело программировать. Я рекомендую вам ознакомиться с руководством по поиску Amzi Prolog Nani, если вы еще этого не сделали. Там много отличных идей!
person
Daniel Lyons
schedule
20.10.2013
take(revolver).
, вам нужно помнить, что существует несколько решений. Первый напишет, Вы взяли револьвер, а затем второй (если вы попросите его с помощью;
) изменит данные. - person lurker   schedule 19.10.2013Place
, но как я могу предотвратить повторное отображение сообщенияYou picked up the revolver.
, когда пользователь снова использует запросtake(revolver)
? - person Shevliaskovic   schedule 19.10.2013take
правило просто гласит: Каждый раз, когда вы берете в руки револьвер, пишите... Это должно быть жестко закодировано в револьвере, или вы хотите, чтобы оно говорило: "Вы взяли... за то, что вы берете в руки". ? В случае с револьвером вам нужно правило передwrite
, которое проверяет, есть ли у вас уже револьвер. - person lurker   schedule 19.10.2013