【发布时间】:2016-02-08 07:01:30
【问题描述】:
所以我有一个循环来重复我制作的关于 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 考虑使用将 rand-combo 中的调用者组合变量设为可选并默认为 invoker-combo。还为 invoker-combo 使用 alist,删除第 3 列,因为它是多余的。可以使用函数将列表表示形式转换为“人类可读”的表示形式。
标签: lisp common-lisp read-eval-print-loop clisp