(define play-nim (lambda (game-state player) (display-game-state game-state) (if (game-over? game-state) (announce-winner game-state player) (let ((move (next-move game-state player))) (announce-move player move) (play-nim (apply-move move game-state) (other-player player)))))) (define next-move (lambda (game-state player) (if (equal? player 'human) (human-move game-state) (computer-move game-state)))) (define other-player (lambda (player) (if (equal? player 'human) 'computer 'human))) (define computer-move (lambda (game-state) (if (> (car game-state) 0) (cons 1 1) (cons 2 1)))) (define prompt (lambda (prompt-string) (display prompt-string) (newline) (read))) (define human-move (lambda (game-state) (let ((pile (prompt "Which pile will you remove from?"))) (let ((n-coins (prompt "How many coins do you want to remove?"))) (cons pile n-coins))))) (define game-over? (lambda (game-state) (and (= 0 (car game-state)) (= 0 (cdr game-state))))) (define announce-winner (lambda (game-state player) (let ((winner (other-player player))) (if (equal? winner 'human) (display "You win. Congratulations.") (display "You lose. Better luck next time.")) (newline)))) (define display-game-state (lambda (game-state) (display " Pile 1: ") (display (car game-state)) (newline) (display " Pile 2: ") (display (cdr game-state)) (newline))) (define announce-move (lambda (player move) (if (equal? player 'human) (display "You") (display "I")) (display " take ") (display (car move)) (display " coins from pile ") (display (cdr move)) (display ".") (newline))) (define apply-move (lambda (move game-state) (let ((pile (car move)) (n-coins (cdr move))) (if (= pile 1) (cons (- (car game-state) n-coins) (cdr game-state)) (cons (car game-state) (- (cdr game-state) n-coins))))))