;; This file contains excerpts from the textbook Concrete ;; Abstractions: An Introduction to Computer Science Using Scheme, by ;; Max Hailperin, Barbara Kaiser, and Karl Knight, Copyright (c) 1998 ;; by Brooks/Cole Publishing Company. This file may not be reproduced ;; or redistributed other than for use with that textbook. ;; Chapter 6: Compound Data and Data Abstraction ;; 6.2 Nim ;; Sidebar: Nim Program (define play-with-turns (lambda (game-state player) (display-game-state game-state) (cond ((over? game-state) (announce-winner player)) ((equal? player 'human) (play-with-turns (human-move game-state) 'computer)) ((equal? player 'computer) (play-with-turns (computer-move game-state) 'human)) (else (error "player wasn't human or computer:" player))))) (define computer-move (lambda (game-state) (let ((pile (if (> (size-of-pile game-state 1) 0) 1 2))) (display "I take 1 coin from pile ") (display pile) (newline) (remove-coins-from-pile game-state 1 pile)))) (define prompt (lambda (prompt-string) (newline) (display prompt-string) (newline) (read))) (define human-move (lambda (game-state) (let ((p (prompt "Which pile will you remove from?"))) (let ((n (prompt "How many coins do you want to remove?"))) (remove-coins-from-pile game-state n p))))) (define over? (lambda (game-state) (= (total-size game-state) 0))) (define announce-winner (lambda (player) (if (equal? player 'human) (display "You lose. Better luck next time.") (display "You win. Congratulations."))))