所以我有一個循環來重複我對dota所做的小文本遊戲,但是當函數'play'在循環中被調用時,它不會返回我的cond函數的結果,它只需要一個輸入,然後移動到下一個循環。循環內的函數行爲有所不同
;;;;learn the invoker combo's
(defparameter *invoker-combo* '((cold-snap (3 0 0) 'QQQ);all of the possible invoker combo's
(ghost-walk (2 1 0) 'QQW)
(Ice-Wall (2 0 1) 'QQE)
(EMP (0 3 0) 'WWW)
(Tornado (1 2 0) 'QWW)
(Alacrity (0 2 1) 'WWE)
(Sun-Strike (0 0 3) 'EEE)
(Forge-Spirit (1 0 2) 'QEE)
(Chaos-Meteor (0 1 2) 'WEE)
(Deafening-Blast (1 1 1) 'QWE)))
(defun rand-combo (invoker-combo);returns a random combo
(nth (random (length invoker-combo))invoker-combo))
(defun count-letters (input);converts the keyboard strokes into numbers to be compared as it doesn't matter what order they are in, just that there is the correct quantity of them e.g QQE could also be written QEQ.
(append
(list (count #\Q input)
(count #\W input)
(count #\E input))))
(defun try-for-combo (rand-combo);takes i-p and compares it with the value for the random combo
(print(car rand-combo))
(let* ((i-p (string-upcase(read-line)))
(try (count-letters i-p)))
(cond ((equal try (cadr rand-combo))'Good-job)
((equal i-p "END")(list 'Thanks 'for 'playing))
(t (list i-p 'was 'wrong 'correct 'is (caddr(assoc (car rand-combo)*invoker-combo*)))))))
(defun play()
(try-for-combo (rand-combo *invoker-combo*)))
(defun loop-play (x)
(loop for i from 0 to x
:do (play)))
如果我調用該函數 '玩',我得到以下O/P:
FORGE-SPIRIT asdf
("ASDF" WAS WRONG CORRECT IS 'QEE)
或
ALACRITY wwe
GOOD-JOB
但如果我調用該函數 '循環播放' 我得到以下o/p:
Break 3 [7]> (loop-play 2)
SUN-STRIKE eee
ALACRITY wwe
TORNADO qww
NIL
有人可以解釋對我來說爲什麼會發生這種情況? 編輯:隨時更改標題,我真的不知道要放什麼。
您可能想縮進並更好地設置您的代碼的格式。 –
如果您看到類似'BREAK 3 [7]>'的提示,那麼您的Lisp交互是在調試器中。從調試器中取出它。使用命令'help'獲得可用命令的幫助。 'quit'讓Lisp回到頂層。 –
好的,謝謝。你有沒有關於如何正確格式化我的代碼的鏈接,因爲這是我在閱讀的書中完成的,我也發佈了關於它的問題,每個人都對它非常敵對,所以我不打擾。 – Floofk