检查Tic-Tac-Toe的胜利

And*_*ndy 4 lisp common-lisp

好的,所以我已经完成了我的最新项目,一个(不可否认的是不太好)在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).我如何让平等检查工作?

ffr*_*end 6

声明是隐含progndefun,因此以这种方式进行评估:

  1. 陈述一个接一个地评估;
  2. last语句的值作为函数结果返回.

在你的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)))
Run Code Online (Sandbox Code Playgroud)

:else只是一个关键字,任何关键字都被评估为true.您可以使用任何其他关键字或只是true.所以,如果之前没有任何陈述给出,那么cond(和所有函数)的结果将是nil.