Grundlagen der funktionsorientierten Programmierung mit SCHEME/Das NIM-Spiel

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
'''Autor: Michael Schneider'''<br />

=== Implementation des NIM-Spiels ===

<code id="4e6143880e628">
(define zweipot
  (lambda (n)
    (expt 2 n)))

(define vergleich
  (lambda (zahl n)
    (cond
      [(> zahl (zweipot n)) (vergleich zahl (+ n 1))]
      [(< zahl (zweipot n)) (- n 1)]
      [else
       n])))

;----- Aufruf des Spiels -----
;----- anfang = 1 ==> Spieler beginnt
;----- anfang = 2 ==> Computer beginnt
(define nim
  (lambda (anfang)
    (let ([max (+ (randomint 50) 50)])
      (cond
        [(= anfang 2) (computer max)]
        [(= anfang 1) (mensch max)]
        [else
         (display "Ungueltige Eingabe!")]))))

;----- Ablauf, wenn Mensch am Zug -----
(define mensch
  (lambda (max)
    (let ([anzahl ""])
      (display "Anzahl der Hoelzer im Spiel: ") (display max) (newline)
      (set! anzahl (string->number (inputdialog "Wie viele Hölzchen nehmen?")))
      (cond
        [(= max 1) (display "Schade! Du hast verloren!") (newline)]
        [(or (> anzahl (/ max 2)) (< anzahl 1)) (display "Fehler!") (newline) (mensch max)]
        [else
         (computer (- max anzahl))]))))

;----Ablauf, wenn Computer am Zug -----
(define computer
  (lambda (max)
    (cond
      [(= (- (zweipot (+ (vergleich max 1) 1)) max) 1) (stark max)]
      [else
       (schwach max)])))

;----- Ablauf, wenn Mensch stark spielt -----
(define stark
  (lambda (max)
    (cond 
      [(= max 1) 
       (display "Anzahl der Hoelzer im Spiel: 1") (newline)
       (display "Computer nimmt 1") (newline)
       (display "Glueckwunsch! Du hast gewonnen!") (newline)]
      [else
       (display "Anzahl der Hoelzer im Spiel: ") (display max) (newline)
       (let ([zahl (+ (random (/ (- max 1) 2)) 1)])
         (display "Computer nimmt ") (display zahl) (display " Hoelzchen! ") (newline)
         (mensch (- max zahl)))])))

;-----Alauf, wenn Mensch schwach spielt -----
(define schwach
  (lambda (max) 
    (display "Anzahl der Hoelzer im Spiel: ") (display max) (newline)
    (let ([zahl (- max (- (zweipot (vergleich max 1)) 1))])
      (display "Computer nimmt ") (display zahl) (display " Hoelzchen!") (newline)
      (mensch (- max zahl)))))
</code>

=== Start des NIM-Spiels ===

Der Prozeduraufruf erfolgt mit:

 (nim 1) ; Der Spieler beginnt.
 (nim 2) ; Der Computer beginnt.

<run id="4e6143880e6e9">
(nim 1)
</run>