如何在常见的lisp中获取数组的行大小和列?

时间:2013-11-20 18:47:33

标签: arrays lisp common-lisp

我正在尝试在lisp中创建一个简单的国际象棋引擎,以便在我的空闲时间获得乐趣。这是我的设计。

57 58 59 60 61 62 63 64
49 50 51 52 53 54 55 56
41 42 43 44 45 46 47 48
33 34 35 36 37 38 39 40
25 26 27 28 29 30 31 32
17 18 19 20 21 22 23 24
09 10 11 12 13 14 15 16
01 02 03 04 05 06 07 08

我看了更复杂的解决方案,但我发现了我认为最简单的解决方案。假设主教在23号广场上,它可以移动4个可能的动作(到16或14或32或30),所以它移动-7或+7或+9或-9。

我创建了一个数组

(make-array '(8 8)
            :initial-contents
            '((R B N Q K B N R)
              (P P P P P P P P)
              (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 NIL NIL NIL NIL NIL NIL NIL)
              (P P P P P P P P)
              (R B N Q K B N R)))

将片段从索引移动到索引。但是如果你知道我的意思,我需要让行大小和列大小为for bishop >= row && array size, move to x

3 个答案:

答案 0 :(得分:5)

如果您指的是数组中的行数和列数,请尝试ARRAY-DIMENSION

(setq a (make-array '(8 8) :initial-contents
'((R B N Q K B N R)
 (P P P P P P P P)
(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 NIL NIL NIL NIL NIL NIL NIL)
          (P P P P P P P P)
          (R B N Q K B N R))))

现在:

(array-rank a)

=> 2

(array-dimension a 0)

=> 8

(array-dimension a 1)

=> 8

另外,因为您似乎尝试通过行/列组合和平面索引访问数组,所以替换数组可能很有用:

(setq b (make-array '(64) :displaced-to a))

=> #(R B N Q K B N R P P P P P P P P 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 NIL NIL NIL NIL NIL NIL NIL P P P P P P P P R B N Q K B N R)

这基本上是二维阵列的一维视图。基础数据是相同的;改变为一个将改变另一个。

(setf (aref a 1 1) nil)
(aref b 9)

=> nil

答案 1 :(得分:5)

CL-USER 51 > (setq *board*
                   (make-array '(8 8) :initial-contents
                               '((R B N Q K B N R)
                                 (P P P P P P P P)
                                 (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 NIL NIL NIL NIL NIL NIL NIL)
                                 (P P P P P P P P)
                                 (R B N Q K B N R))))
#2A((R B N Q K B N R)
    (P P P P P P P P)
    (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 NIL NIL NIL NIL NIL NIL NIL)
    (P P P P P P P P)
    (R B N Q K B N R))

现在,您可以使用ROW-MAJOR-AREF以行主要顺序访问此二维数组:

CL-USER 52 > (loop for i below 64 collect (row-major-aref *board* i))
(R
 B
 N
 Q
 K
 B
 N
 R
 P
 P
 P
 P
 P
 P
 P
 P
 ...)

或者,您可以设置一维位移阵列。

答案 2 :(得分:3)

? (defparameter *y* (make-array '(4 8)))
*Y*

? (array-dimensions *y*)  ;;; the array's dimensions
(4 8)

? (array-rank *y*)        ;;; the number of dimensions
2
? (array-dimension *y* 0) ;;; dimension 0
4
? (array-dimension *y* 1) ;;; dimension 1
8

更多详情here

相关问题