;;; Leider war das Übungsblatt ein bisschen mit der heissen Nadel ;;; gestrickt. Mittlerweile haben sich einige Fehler ;;; herausgestellt. Ich habe ein neues Übungsblatt erstellt, das Silke ;;; am Montag in die Übung mitbringen wird. ;;; ;;; Falls Du die neue Version nicht trotzdem nicht bekommen könnt, ;;; hier sind die Änderungen gegenüber dem in der Vorlesung ;;; ausgegebenen Übungsblatt: ;;; ;;; * Die Trumpfkarten heißen natuerlich "herz" und nicht "rot" ;;; ;;; * Die Prozedur lowest-card ist etwas einfacher als auf dem Übungsblatt ;;; ;;; * Der Datentyp Deck sollte zusätzlich noch die Prozedur ;;; deck-empty? bereitstellen ;;; ;;; * Der Datentyp Game-Stack sollte zusätzlich noch die Prozedur ;;; game-state-replace-decks bereitstellen ;;; ;;; * computer-reply und computer-first-move geben einfach die Karte ;;; zurück, die der Computer spielt ;;; ;;; * Der Konstruktor make-card soll als Argument den Namen der Karte ;;; akzeptiern. Die Prozedur name->value am Ende dieser Datei kann ;;; verwendet werden um aus dem Namen den Wert zu bestimmen ;;; ;;; Sorry für das Chaos... ;;; Dieser Code implementiert den Computerspieler. (define computer-reply (lambda (deck other-card) (let ((my-card (choose-card deck other-card))) (display "My move: ") (display-card my-card) my-card))) (define choose-card (lambda (deck other-card) (let ((same-colors (deck-cards-with-color deck (card-color other-card)))) (if (null? same-colors) (let ((trump-cards (deck-cards-with-color deck 'herz))) (if (null? trump-cards) (deck-any-card deck) (lowest-card trump-cards))) (higher-or-lowest-card same-colors other-card))))) (define lowest-card (lambda (card-list) (lowest-card-helper (cdr card-list) (car card-list)))) (define lowest-card-helper (lambda (card-list maybe-lowest) (if (null? card-list) maybe-lowest (if (card< (car card-list) maybe-lowest) (lowest-card-helper (cdr card-list) (car card-list)) (lowest-card-helper (cdr card-list) maybe-lowest))))) (define computer-first-move (lambda (deck) (let ((card (deck-any-card deck))) (display "I play ") (display-card card) card))) (define higher-or-lowest-card (lambda (card-list the-card) (let ((a-higher-card (higher-card card-list the-card))) (if a-higher-card a-higher-card (lowest-card card-list))))) (define higher-card (lambda (card-list other-card) (if (null? card-list) #f (if (card< other-card (car card-list)) (car card-list) (higher-card (cdr card-list) other-card))))) ;;;; Hier beginnt der Code fuer das eigentliche Spiel (define play-herzblatt (lambda (game-state player) (let ((computer-deck (game-state-computer-deck game-state)) (human-deck (game-state-human-deck game-state))) (cond ((game-over? game-state) (announce-winner game-state)) ((equal? player 'human) (let ((human-card (human-first-move human-deck))) (let ((computer-card (computer-reply computer-deck human-card))) (let ((new-state.winner (rate-move computer-card human-card game-state #t))) (play-herzblatt (car new-state.winner) (cdr new-state.winner)))))) ((equal? player 'computer) (let ((computer-card (computer-first-move computer-deck))) (let ((human-card (human-reply human-deck))) (let ((new-state.winner (rate-move computer-card human-card game-state #f))) (play-herzblatt (car new-state.winner) (cdr new-state.winner)))))))))) (define human-reply (lambda (human-deck) (display "Your deck: ") (newline) (display-deck human-deck) (display "Enter the color of the card you want to play: ") (let ((color (read))) (newline) (display "Enter the name of the card you want to play: ") (let ((name (read))) (make-card name color))))) (define human-first-move human-reply) (define rate-move (lambda (computer-card human-card game-state first-player-is-human) (let ((turn-value (+ (card-value human-card) (card-value computer-card))) (game-state-with-new-decks (remove-cards game-state computer-card human-card))) (if (if first-player-is-human (not (card< human-card computer-card)) (card< computer-card human-card)) (begin (display "You get ") (display turn-value) (display " points.") (newline) (cons (game-state-increment-human game-state-with-new-decks turn-value) 'human)) (begin (display "I get ") (display turn-value) (display " points.") (newline) (cons (game-state-increment-computer game-state-with-new-decks turn-value) 'computer)))))) (define (remove-cards game-state computer-card human-card) (let ((old-computer-deck (game-state-computer-deck game-state)) (old-human-deck (game-state-human-deck game-state))) (let ((new-computer-deck (deck-remove-card old-computer-deck computer-card)) (new-human-deck (deck-remove-card old-human-deck human-card))) (game-state-replace-decks game-state new-computer-deck new-human-deck)))) (define announce-winner (lambda (game-state) (if (equal? (winner game-state) 'human) (display "You win!") (display "You lose!")))) (define (name->value name) (if (number? name) (if (< name 10) 0 10) (cond ((equal? name 'bube) 2) ((equal? name 'dame) 3) ((equal? name 'koenig) 4) ((equal? name 'ass) 11) (else (error "Unknown name of card" name))))) ::; Beispielablauf: ::: (define deck1 (make-deck (list (make-card 'ass 'herz) (make-card 7 'pik) (make-card 'koenig 'pik) (make-card 10 'karo) (make-card 9 'karo)))) (define deck2 (make-deck (list (make-card 'dame 'herz) (make-card 8 'pik) (make-card 10 'kreuz) (make-card 'bube 'karo) (make-card 'dame 'karo)))) ;(play-herzblatt (make-game-state deck1 deck2) 'human) ;Your deck: ;herz dame ;pik 8 ;kreuz 10 ;karo bube ;karo dame ;Enter the color of the card you want to play: herz ;Enter the name of the card you want to play: dame ;My move: herz ass ;I get 14 points. ;I play pik 7 ;Your deck: ;pik 8 ;kreuz 10 ;karo bube ;karo dame ;Enter the color of the card you want to play: pik ;Enter the name of the card you want to play: 8 ;You get 0 points. ;Your deck: ;kreuz 10 ;karo bube ;karo dame ;Enter the color of the card you want to play: kreuz ;Enter the name of the card you want to play: 10 ;My move: pik koenig ;You get 14 points. ;Your deck: ;karo bube ;karo dame ;Enter the color of the card you want to play: karo ;Enter the name of the card you want to play: bube ;My move: karo 10 ;I get 12 points. ;I play karo 9 ;Your deck: ;karo dame ;Enter the color of the card you want to play: karo ;Enter the name of the card you want to play: dame ;You get 3 points. ;You lose!