(define (variant-c-initial-board) '(1 ((1 1 1) (0 0 0) (-1 -1 -1)))) (define (variant-c-board-move board from-i from-j to-i to-j) (list-2d-replace (list-2d-replace board to-i to-j (list-2d-ref board from-i from-j)) from-i from-j 0)) (define (variant-c-moves board) (define (variant-c-piece-at i j board) (list-2d-ref board i j)) (define (variant-c-piece-at? i j board) (not (zero? (list-2d-ref board i j)))) (define (variant-c-on-board? i board) (and (>= i 0) (< i (length board)))) (define (variant-c-can-capture? piece direction i j board) (and (variant-c-on-board? (+ i piece) board) (variant-c-on-board? (+ j direction) board) (variant-c-piece-at? (+ i piece) (+ j direction) board) (not (eq? (variant-c-piece-at (+ i piece) (+ j direction) board) piece)))) (define (variant-c-can-capture-l? piece i j board) (variant-c-can-capture? piece 1 i j board)) (define (variant-c-can-capture-r? piece i j board) (variant-c-can-capture? piece -1 i j board)) (define (variant-c-move-forward? piece i j board) (and (variant-c-on-board? (+ i piece) board) (not (variant-c-piece-at? (+ i piece) j board)))) (define (variant-c-move-backward? piece i j pieces) (and (variant-c-on-board? (- i piece) pieces) (not (variant-c-piece-at? (- i piece) j pieces)))) (define (variant-c-move-left? piece i j pieces) (and (variant-c-on-board? (- j 1) pieces) (not (variant-c-piece-at? i (- j 1) pieces)))) (define (variant-c-move-right? piece i j pieces) (and (variant-c-on-board? (+ j 1) pieces) (not (variant-c-piece-at? i (+ j 1) pieces)))) (define (variant-c-move-sideways? piece direction i j pieces) (and (variant-c-on-board? (+ i piece) pieces) (variant-c-on-board? (+ j direction) pieces) (not (variant-c-piece-at? (+ i piece) (+ j direction) pieces)))) (define (variant-c-move-back-sideways? piece direction i j pieces) (and (variant-c-on-board? (- i piece) pieces) (variant-c-on-board? (+ j direction) pieces) (not (variant-c-piece-at? (- i piece) (+ j direction) pieces)))) (let* ((player (first board)) (board (second board)) (n (length board))) (map (lambda (x) `(,(- player) ,x)) (reduce append (map-indexed (lambda (row i) (reduce append (map-indexed (lambda (piece j) (if (= piece player) (append (if (variant-c-move-forward? piece i j board) `(,(variant-c-board-move board i j (+ i piece) j)) '()) (if (variant-c-move-backward? piece i j board) `(,(variant-c-board-move board i j (- i piece) j)) '()) (if (variant-c-can-capture-l? piece i j board) `(,(variant-c-board-move board i j (+ i piece) (+ j 1))) '()) (if (variant-c-can-capture-r? piece i j board) `(,(variant-c-board-move board i j (+ i piece) (- j 1))) '())) '())) row) '())) board) '())))) (define (variant-c-win0 board) (cond ((some (lambda (current) (= current 1)) (last (second board))) 1) ((some (lambda (current) (= current -1)) (first (second board))) -1) ((null? (variant-c-moves board)) (- (first board))) (else 0)))