(方案)实现二维列表访问(Access lst x y)



我知道这看起来很琐碎,但我只使用过声明性/命令性语言,我发现自己遇到了这个问题。

我有一个棋盘(本质上是一个8x8的状态列表/数组),我需要能够获取棋盘的第(x y)个元素。

我想,如果我能(板的剩余部分)y-1次,然后返回(板的第一个剩余部分),我会有一排。如果我(休息行)x-1次,然后返回(第一行),我将拥有正确的元素。然后我返回(结果)?

     #lang scheme
     (define new-board '((P2 OFF P2 OFF P2 OFF P2 OFF)
                (OFF P2 OFF P2 OFF P2 OFF P2)
                (P2 OFF P2 OFF P2 OFF P2 OFF)
                (OFF BLANK OFF BLANK OFF BLANK OFF BLANK)
                (BLANK OFF BLANK OFF BLANK OFF BLANK OFF)
                (OFF P1 OFF P1 OFF P1 OFF P1)
                (P1 OFF P1 OFF P1 OFF P1 OFF)
                (OFF P1 OFF P1 OFF P1 OFF P1)))
     (define (get-state board x y))

为此创建一个抽象:

(define (make-board)
  (make-vector 64 'blank))
(define (board-ref board x y)
  (vector-ref board (+ (* y 8) x)))
(define (board-set! board x y new)
  (vector-set! board (+ (* y 8) x) new))

从那里开始。

(define (board-fill board list-of-64-values) ...)    ;; for example

也许向量中的一个向量在这里是更好的表示:

(define new-board 
  (list->vector 
   (map list->vector 
        '((P2 OFF P2 OFF P2 OFF P2 OFF)
          (OFF P2 OFF P2 OFF P2 OFF P2)
          (P2 OFF P2 OFF P2 OFF P2 OFF)
          (OFF BLANK OFF BLANK OFF BLANK OFF BLANK)
          (BLANK OFF BLANK OFF BLANK OFF BLANK OFF)
          (OFF P1 OFF P1 OFF P1 OFF P1)
          (P1 OFF P1 OFF P1 OFF P1 OFF)
          (OFF P1 OFF P1 OFF P1 OFF P1)))))
(define (get-state board x y)
  (vector-ref (vector-ref board x) y))
(define (set-state! board x y val)
  (vector-set! (vector-ref board x) y val))

然后

> (get-state new-board 0 1)
OFF
> (get-state new-board 1 1)
P2
> (set-state! new-board 1 1 'hi)
> (get-state new-board 1 1)
'hi

最新更新