前几天我问了一个关于我的nQueens问题的问题,并收到了很多很棒的答案,所以我想我会再问一遍,因为我非常接近完成这个威胁功能。我的功能是确定水平,垂直或对角线上的威胁。我的意见是这样的:
(威胁?'(1 3)'((1 0)(2 4)(3 7)(4 3)(5 2)(6 8)(7 5)(8 1) )))
它给出了一个新的给定位置并检查是否将它放在板上会产生任何问题。我到目前为止的代码如下:
*我已将对角线拆分为自己的函数,以使代码更具可读性
(defun diagonal(point1 point2)
(= (abs (- (values-list ( car point1 )) (values-list (car point2))))
(abs (- (values-list ( cdr point1 )) (values-list (cdr point2)))))
)
(defun THREAT?(x y)
; Checks threat on the vertical
(when (not (eq (values-list (cdr (nth (- (car x) 1 ) y )) ) '0 ) )
(return-from THREAT? t)
)
(loop for i from 0 to (list-length y)
; Checks threat on the horizontal
when (eq (values-list ( cdr x )) (values-list (cdr (nth i y))) )
do (return-from THREAT? t)
; With the help of the diagonal function checks along the diagonal
when (diagonal x (nth i y) )
do (return-from THREAT? t)
)
)
*垂直和水平功能正常工作,因为我已经注释了对角线并检查了两个。
我收到的错误信息不是在编译时,而是在运行我的代码时:
VALUES-LIST:正确的列表不得以1
结尾我怀疑我的对角线功能有问题。我不明白为什么值列表会成为一个问题,因为我在相同的代码中使用了几次没有问题。我认为对角函数应该给出两个列表(1 3)(2 4),例如,每个制作它的汽车(1)(2)然后应用值列表并从括号中拉出值然后被操纵。非常感谢任何和所有的帮助!
答案 0 :(得分:4)
使用values-list
的想法毫无意义。
(defun diagonal (point1 point2)
(= (abs (- (values-list ( car point1 )) (values-list (car point2))))
(abs (- (values-list ( cdr point1 )) (values-list (cdr point2))))))
现在我们打电话:
(diagonal '(1 3) '(1 0))
point1
是(1 3)
。
现在你致电(CAR '(1 3))
。结果是1
。
然后你拨打(VALUES-LIST 1)
。但为什么??? (VALUES-LIST 1)
不起作用,因为VALUES-LIST
期望列表作为参数。但1
不是列表,而是数字。 - >的错误
VALUES-LIST
将列表的内容作为多个值返回。但是,由于您的代码不以任何方式处理多个值,因此根本没有意义。