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>