好的,所以我已经完成了我的最新项目,一个(不可否认的是不太好)在Common Lisp中实现了Tic Tac Toe(整个程序可以在这里找到),但我最后一部分被困在了最后一个部分.我无法弄清楚如何获得检查胜利者工作的功能.函数(及其从属函数)如下所示:
(defun check-for-win ()
(cond ((is-line 1 2 3) t)
((is-line 1 4 7) t)
((is-line 1 5 9) t)
((is-line 2 5 8) t)
((is-line 3 6 9) t)
((is-line 3 5 7) t)
((is-line 4 5 6) t)
((is-line 7 8 9) t))
nil)
(defun is-line (a b c)
(let ((a (aref *board* (- a 1)))
(b (aref *board* (- b 1)))
(c (aref *board* (- c 1))))
(if (and
(eql a b)
(eql a c)
(eql b c))
t
nil)))
Run Code Online (Sandbox Code Playgroud)
(虽然不是缩进这么深),并在(is-line)中,a,b和c将是(在一个成功的情况下)设置为一个符号(或者:X或:O).我如何让平等检查工作?
声明是隐含progn的defun,因此以这种方式进行评估:
在你的check-for-win你有2个语句:cond和nil.根据progn评估规则,nil将为任何呼叫返回值,并且cond将忽略结果.
试试这段代码:
(defun check-for-win ()
(cond ((is-line 1 2 3) t)
((is-line 1 4 7) t)
((is-line 1 5 9) t)
((is-line 2 5 8) t)
((is-line 3 6 9) t)
((is-line 3 5 7) t)
((is-line 4 5 6) t)
((is-line 7 8 9) t)
(:else nil)))
Run Code Online (Sandbox Code Playgroud)
:else只是一个关键字,任何关键字都被评估为true.您可以使用任何其他关键字或只是true.所以,如果之前没有任何陈述给出,那么cond(和所有函数)的结果将是nil.