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="4e6147ee6c292">
(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
(showmessage "Unzulässige Eingabe!") 'ok]))))
;----- Ablauf, wenn Mensch am Zug ist -----
(define mensch
(lambda (max)
(let ([anzahl ""])
(set! anzahl
(string->number
(inputdialog (string-append "Anzahl der Hölzer im Spiel: " (number->string max) "; Wie viele Hölzchen nehmen?"))))
(cond
[(= max 1) (display "Schade! Du hast verloren!") (newline) 'ok]
[(or (> anzahl (/ max 2)) (< anzahl 1)) (showmessage "Fehler!") (mensch max)]
[else
(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ölzer im Spiel: 1; Computer nimmt 1 Hölzchen.")
(display "Glückwunsch! Du hast gewonnen!") (newline) 'ok]
[else
(let ([zahl (+ (randomint (/ (- max 1) 2)) 1)])
(showmessage (string-append "Anzahl der Hölzer 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ölzer im Spiel: " (number->string max)
"; Computer nimmt " (number->string zahl) " Hölzchen."))
(mensch (- max zahl)))))
</code>
=== Start des NIM-Spiels ===
'''Spielregel:'''<br />
Der Computer bestimmt zwischen 50 und 100 eine zufällige Anzahl von Hölzchen. Im Wechsel nehmen nun Mitspieler bzw. Computer eine beliebige Anzahl beiseite - mindestens 1, höchstens aber die Hälfte der noch vorhandenen Hölzchen. Wer das letzte Hölzchen nehmen muss, hat verloren!<br />
Der Prozeduraufruf erfolgt mit:
(nim 1) ; Der Spieler beginnt.
(nim 2) ; Der Computer beginnt.
<run id="4e6147ee6c310">
(nim 1)
</run>