2013-04-14 130 views
2

因此,我使用Lisp制作了一个相对简单的游戏。将项目放置在2D矩阵列中的第一个零元素

我创建了一个董事会指定大小的所有元素NIL:

(defun make-board(rows columns) 
    (cond ((= rows 1) (list (make-list columns))) 
     (t (append (list (make-list columns)) (make-board (1- rows) columns))))) 

现在我工作的地方的功能,将在二维表的列的第一个nil元素放置一个值:

(defun place(player column matrix) 
    ;need some help here 

    ;I can get the specified column, is there a better way?! 
    (let (col)(get-column column matrix)) 
) 

我可以检索指定列:

; return the given column 
(defun get-column 
    (colnum matrix) 
    (mapcar (lambda (row) (nth colnum row)) matrix)) 

我喜欢这种感觉是S但不幸的是,Lisp对我来说工作不好。我也喜欢这个没有迭代的实现,因为这是做Lisp的“正确”方式。

编辑:

为了澄清,使板将返回类似如下:

(make-board 5 5) 
((NIL NIL NIL NIL NIL) 
(NIL NIL NIL NIL NIL) 
(NIL NIL NIL NIL NIL) 
(NIL NIL NIL NIL NIL) 
(NIL NIL NIL NIL NIL)) 
+0

为什么标记为'Emacs'? Emacs Lisp中的代码是? –

回答

1

我不知道为什么递归性应该是“正确”的方式用Lisp编程。循环宏是非常有用的,像你想要实现的功能可以很容易地实现它。

(defun make-board(rows columns) 
    (loop repeat rows collect 
    (loop repeat columns collect nil))) 
0

我相信,这将是使用您的主板二维数组更方便:

(defun make-board (rows columns) 
    (make-array (list rows columns) 
       :initial-element nil)) 

为了找到一列的第一个空单元格,遍历该列:

(defun find-null-cell-index (column board) 
    "Returns the row index of the first cell in the given column of the board 
that contains nil." 
    (loop :for i :below (array-dimension board 0) 
     :when (null (aref board i column)) 
     :do (return-from find-null-cell-index i))) 
相关问题