lisp - 检查 Tic-Tac-Toe 中的胜利

标签 lisp common-lisp

好的,所以我即将完成我的最新项目,一个(诚然不是很好)在 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,所以是这样求值的:

  1. 语句被一个接一个地求值;
  2. 最后一个语句的值作为函数结果返回。

在您的check-for-win 中,您有 2 个语句:condnil。根据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/

相关文章:

lisp - 编写专家系统的最佳语言是什么?

debugging - 在 SBCL 中使用步进器的简单示例

javascript - 使用 Javascript 的无层 Web 框架?

statistics - 逻辑语言——Prolog 或 Lisp/Smalltalk 或其他?

Lisp - 检查输入是十进制还是字符串

common-lisp - flet 与 let+funcall 的区别

Clojure:为什么我不能在不调用它们的情况下引用类方法?

common-lisp - 有没有办法在 Mac OS 上使用动态 FFI 支持编译 CLISP?

common-lisp - 如何杀死进程(由运行进程创建)

lisp - Common Lisp 中的动态绑定(bind)