(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)))