好的,所以我即将完成我的最新项目,一个(诚然不是很好)在 Common Lisp 中实现井字游戏(整个程序可用 here),但我还停留在最后一部分;我不知道如何让我的功能检查赢家工作。该函数(及其从属函数)如下所示:
(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)))
(尽管没有缩进那么深),并且在 (is-line)
中,a、b 和 c 将(在获胜场景中)设置为一个符号(:X
或 :O
)。如何使相等性检查起作用?
最佳答案
defun
语句中隐含了progn
,所以是这样求值的:
- 语句被一个接一个地求值;
- 最后一个语句的值作为函数结果返回。
在您的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)))
:else
只是一个关键字,与任何关键字一样,它被评估为 true。您可以使用任何其他关键字或仅使用 true
。因此,如果之前没有语句给出 true,cond
(以及所有函数)的结果将为 nil
。
关于lisp - 检查 Tic-Tac-Toe 中的胜利,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060245/