Я делаю консольную игру на выживание Lisp и пытаюсь добавить функцию, где до a = b показывать "." каждую секунду. Затем, когда a = b, установите для переменной «вред» значение «истина», и если / когда эта переменная имеет значение «истина», вычтите «здоровье» на 1, пока пользователь не вызовет функцию «use-medkit», а переменная «больно». установлено false, и вы выходите из обоих циклов.
Проблема, с которой я сталкиваюсь, заключается в том, что когда мне предлагается использовать функцию «use-medkit» и я набираю ее, она не оценивает ничего, что я ввожу, и продолжает вычитать 1 из «здоровья». Как я могу вызвать функцию, введенную пользователем, во время выполнения цикла?
Вот мой код:
(setq a (random 11)) ; Random from 0 - 10
(setq b (random 11)) ; ^^^^^^^^^^^^^^^^^^
(setq hurt 0)
(setq repair 0)
(setq health 999)
(defun use-medkit ()
(setq repair 1))
(defun get-hurt ()
(loop
(progn
(setq a (random 11))
(setq b (random 11))
(progn
(princ ".")
(sleep 1)))
(if (eq a b) (progn
(setq hurt 1)
(when (eq hurt 1) (progn
(format t "~%You are hurt!~%You will lose 1 hp every 10 seconds~%~%Type use-medkit to stop the bleeding~%")
(loop
(progn
(- 1 health)
(sleep 10))
;(format t "health: ~A~%" health)
(when (eq repair 1) (progn
(return "You stopped the bleeding") (setq hurt 0) (setq repair 0))))))))))
use-medkit
, пока эта функция не завершится, а к этому моменту уже слишком поздно. По умолчанию Lisp не имеет цикла обработки событий. - person Dan Robertson   schedule 13.04.2018setq
не определены переменные, поэтому то, что произойдет, еслиa
не существует, не определено. Используйтеdefparameter
илиdefvar
и используйте соглашение*earmuff*
, чтобы не попасть в невозможную ситуацию. - person Sylwester   schedule 13.04.2018