2013-05-12 89 views
6

我正在Common Lisp中嘗試製作Windows遊戲掃雷。如何在Common Lisp中打印列表爲矩陣列表

我有一個列表(1 1 1 2 2 2 3 3 3)並希望打印樣基質

(1 1 1 
2 2 2 
3 3 3) 

如何做到這一點?

編輯

我在

(format t "Input width:") 
(setf width (read)) 
(format t "Input height:") 
(setf height (read))  
(format t "How many mines:") 
(setf brMina (read)) 

(defun matrica (i j) 
    (cond ((= 0 i) '()) 
    (t (append (vrsta j) (matrica (1- i) j))))) 


(setf minefield (matrica width height)) 

(defun stampaj() 
     (format t "~%~a" minefield)) 
+0

你應該發佈一些你已經嘗試過的代碼。 – 2013-05-12 13:09:24

回答

4

另一個例子,使用樂趣漂亮的打印機:

(defun print-list-as-matrix 
    (list elements-per-row 
    &optional (cell-width (1+ (truncate (log (apply #'max list) 10))))) 
    (let ((*print-right-margin* (* elements-per-row (1+ cell-width))) 
     (*print-miser-width* nil) 
     (*print-pretty* t) 
     (format-string (format nil "~~<[email protected]{~~~ad~~^ ~~}[email protected]:>~%" cell-width))) 
    (format t format-string list))) 

像這樣工作:

CL-USER> (print-list-as-matrix (loop for i from 1 to 9 collect i) 3) 
1 2 3 
4 5 6 
7 8 9 
NIL 
CL-USER> (print-list-as-matrix (loop for i from 1 to 25 collect i) 5) 
1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 
NIL 
CL-USER> (print-list-as-matrix (loop for i from 1 to 16 collect i) 2) 
1 2 
3 4 
5 6 
7 8 
9 10 
11 12 
13 14 
15 16 
2

像這樣開頭:

(defun print-list-as-grid (list rows cols) 
    (assert (= (length list) (* rows cols)) 
    (loop for row from 0 below rows do 
    (loop for col from 0 below cols do 
     (princ (car list)) 
     (prinC#\space) 
     (setf list (cdr list))) 
    (prinC#\newline))) 

* (print-list-as-grid '(a b c d e f g h i) 3 3) 
A B C 
D E F 
G H I 

NIL 
+1

謝謝你的工作。第一行是(defun print-list-as-grid(list rows cols) – kosta 2013-05-13 17:20:49