Lyn*_*nob 3 lisp arrays 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
Run Code Online (Sandbox Code Playgroud)
我看了更复杂的解决方案,但我发现了我认为最简单的解决方案.假设主教在方块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)))
Run Code Online (Sandbox Code Playgroud)
并将碎片从索引移动到索引.但是for bishop >= row && array size, move to x如果你知道我的意思,我需要得到行大小和列大小.
如果您指的是数组中的行数和列数,请尝试 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))))
Run Code Online (Sandbox Code Playgroud)
现在:
(array-rank a)
Run Code Online (Sandbox Code Playgroud)
=> 2
(array-dimension a 0)
Run Code Online (Sandbox Code Playgroud)
=> 8
(array-dimension a 1)
Run Code Online (Sandbox Code Playgroud)
=> 8
此外,因为您似乎尝试通过行/列组合和平面索引访问数组,所以移位数组可能很有用:
(setq b (make-array '(64) :displaced-to a))
Run Code Online (Sandbox Code Playgroud)
=> #(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)
Run Code Online (Sandbox Code Playgroud)
=> nil
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))
Run Code Online (Sandbox Code Playgroud)
您现在可以使用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
...)
Run Code Online (Sandbox Code Playgroud)
或者,您可以设置一维位移阵列.