这是连接在它们之间的3个tic tac toe板的坐标,我想知道如何以递归方式减少这个代码。 以下所有代码只是一种方法(vitoria):
(defun vitoria (tabuleiro)
(or (verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 1 1 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))
(verificacaoXO (get-elem 1 2 1 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 2 3 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 1 3 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
位置1 - 3级别之间的列
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 2 1 3 tabuleiro))
(verificacaoXO (get-elem 2 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 2 3 tabuleiro))
(verificacaoXO (get-elem 2 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 2 3 3 tabuleiro))
位置2 - 6之间的列之间的列
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 1 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 3 2 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 3 3 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
位置3 - 9之间的水平列
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))
顶层之间的线 - 11
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 3 3 tabuleiro))
(verificacaoXO (get-elem 2 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 1 3 tabuleiro))
中间等级之间的界线 - 13
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
底部等级之间的线 - 15
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))
级别之间的对角线 - 19
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 1 2 1 tabuleiro)
(get-elem 1 3 1 tabuleiro))
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 2 3 1 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 2 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
第1 - 22行
(verificacaoXO (get-elem 1 1 2 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 3 2 tabuleiro))
(verificacaoXO (get-elem 2 1 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 3 2 tabuleiro))
(verificacaoXO (get-elem 3 1 2 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
第2级的行 - 25
(verificacaoXO (get-elem 1 1 3 tabuleiro)
(get-elem 1 2 3 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 2 1 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 2 3 3 tabuleiro))
(verificacaoXO (get-elem 3 1 3 tabuleiro)
(get-elem 3 2 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
3 - 28行
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 1 1 tabuleiro)
(get-elem 3 1 1 tabuleiro))
(verificacaoXO (get-elem 1 2 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 2 1 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 3 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
级别1 - 31上的列
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 3 1 2 tabuleiro))
(verificacaoXO (get-elem 1 2 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 2 2 tabuleiro))
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
第2级的栏目 - 34
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 1 3 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 1 2 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 3 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
级别3 - 37上的列
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 1 1 tabuleiro))
等级1 - 39
的对角线 (verificacaoXO (get-elem 1 1 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 1 2 tabuleiro))
2级的对角线 - 41
(verificacaoXO (get-elem 1 1 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 1 3 tabuleiro))
3级的对角线 - 43
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
右边各级之间的列 - 45
(verificacaoXO (get-elem 1 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 3 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 2 3 tabuleiro))
中间等级之间的列 - 47
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))))
中间等级之间的列 - 49
答案 0 :(得分:1)
这是一种可能的解决方案,其中生成坐标。每个point
由三个整数坐标组成,用于标识行,列和平面。 triple
是一组确定一条线的三个点。从一个点开始生成三元组并添加两次方向(像(0 1 0)
这样的向量)。无效的三元组被淘汰。
(defun valid-coordinate(c)
(<= 1 c 3))
(defun valid(triple)
(loop for point in triple always (every #'valid-coordinate point)))
(defun add(point direction)
(mapcar #'+ point direction))
(defun make-triple(point direction)
(let ((pv (add point direction)))
(list point pv (add pv direction))))
(defun make-triples(point directions)
(loop for d in directions
as triple = (make-triple point d)
when (valid triple)
collect triple))
(defun make-all-triples ()
(let ((directions-on-plane '((0 1 0)(1 0 0)(1 1 0)(-1 -1 0)))
(3d-directions '((0 0 1)(0 1 1)(1 0 1)(1 1 1)(-1 0 1)(0 -1 1)(-1 -1 1)(1 -1 1)(-1 1 1))))
(nconc (loop for plane from 1 to 3
nconc (loop for r from 1 to 3
nconc (loop for c from 1 to 3
nconc (make-triples (list r c plane) directions-on-plane))))
(loop for r from 1 to 3
nconc (loop for c from 1 to 3
as plane = 1
nconc (make-triples (list r c plane) 3d-directions))))))
(defun vitoria (tabuleiro)
(loop for triple in (make-all-triples)
thereis (apply #'verificacaoXO (loop for (r c plane) in triple
collect (get-elem r c plane tabuleiro)))))