Grundlagen der funktionsorientierten Programmierung mit SCHEME/Das NIM-Spiel

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SchemeJS</language>
[[Bild:Nim1.jpg|miniatur||hochkant=1|Das NIM-Spiel]]

'''Autor: Michael Schneider (2011)'''

== Spielregel ==

Der Computer bestimmt zwischen 50 und 100 eine zufällige Anzahl von Hölzchen.<br />
Im Wechsel nehmen nun Mitspieler bzw. Computer eine beliebige Anzahl beiseite - mindestens 1, höchstens aber die Hälfte der noch vorhandenen Hölzchen.<br />
Wer das letzte Hölzchen nehmen muss, hat verloren!

== Implementation des NIM-Spiels ==

<code id="5bb689ee65b30">
(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 (+ (random 50) 50)])
      (cond
        [(= anfang 2) (computer max)]
        [(= anfang 1) (mensch max)]
        [else
         (showMessage "Unzulässige Eingabe!") 'ok]))))

;----- Ablauf, wenn Mensch am Zug ist -----
(define mensch
  (lambda (max)
    (let ([eingabe ""])      
      (set! eingabe 
            (inputDialog (string-append "Anzahl der Hölzchen im Spiel: " (number->string max) 
                                        " - Wie viele Hölzchen nehmen?")))
      (cond
        [(equal? eingabe 'null) 'ok]
        [(= max 1) (showMessage "Schade! Du hast verloren!") 'ok]
        [else
         (let ([anzahl (string->number eingabe)])
           (if (or (equal? anzahl +nan.0) (> anzahl (/ max 2)) (< anzahl 1))
               (begin
                 (showMessage "Fehlerhafte Eingabe!")
                 (mensch max))
               (computer (- max anzahl))))]))))

;---- Ablauf, wenn Computer am Zug ist -----
(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) 
       (showMessage "Anzahl der Hölzchen im Spiel: 1 - Computer nimmt 1 Hölzchen.")
       (showMessage "Glückwunsch! Du hast gewonnen!") 'ok]
      [else
       (let ([zahl (+ (random (/ (- max 1) 2)) 1)])       
         (showMessage (string-append "Anzahl der Hölzchen im Spiel: " (number->string max) 
                                     " - Computer nimmt " (number->string zahl) " Hölzchen."))   
         (mensch (- max zahl)))])))

;----- Ablauf, wenn Mensch schwach spielt -----
(define schwach
  (lambda (max) 
    (let ([zahl (- max (- (zweipot (vergleich max 1)) 1))])     
      (showMessage (string-append "Anzahl der Hölzchen im Spiel: " (number->string max) 
                                  " - Computer nimmt " (number->string zahl) " Hölzchen."))
      (mensch (- max zahl)))))
</code>

== Start des NIM-Spiels ==

Der Prozeduraufruf erfolgt mit:

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

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

Zurück zum [[Grundlagen_der_funktionsorientierten_Programmierung_mit_SCHEME/Der_Algorithmusbegriff|Algorithmusbegriff]].