2

だから私は Lisp を使って比較的単純なゲームを作っています。

すべての NIL 要素を指定したサイズのボードを作成します。

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

現在、2D リストの列の最初の 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))

これは簡単なことのように感じますが、残念ながら Lisp はうまく機能しません。それが Lisp を行う「適切な」方法だからです。

編集:

明確にするために、make-board は次のようなものを返します。

(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))
4

2 に答える 2

1

再帰性が Lisp でプログラミングする「適切な」方法であるべき理由がわかりません。ループ マクロは非常に便利で、実装したいような機能を簡単に実現できます。

(defun make-board(rows columns)
  (loop repeat rows collect
    (loop repeat columns collect nil)))
于 2013-04-14T15:21:53.353 に答える
0

ボードに 2 次元配列を使用する方が便利だと思います。

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

列の最初の null セルを見つけるには、その列をループします。

(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)))
于 2013-04-14T17:48:19.327 に答える