fb:porticula NoPaste
14.3: Nim-Spiel
Uploader: | nemored |
Datum/Zeit: | 29.10.2011 00:58:36 |
Hinweis: Dieser Quelltext ist Bestandteil des Projekts OpenBook: 2D-Spieleprogrammierung, zu dem es auf FreeBASIC-Portal.de eine Projektseite gibt.
' *** CODE 14.3: Nim-Spiel
TYPE zugtyp
AS INTEGER reihe, anz, wert
END TYPE
DIM SHARED AS INTEGER reihenzahl = 4, rechentiefe = 10, reihe(1 TO reihenzahl)
FOR r AS INTEGER = 1 TO reihenzahl : reihe(r) = r : NEXT
DIM spieler AS INTEGER = 1, zug AS zugtyp
RANDOMIZE TIMER
FUNCTION berechneSpielwert AS INTEGER
FOR i AS INTEGER = 1 TO reihenzahl
IF reihe(i) <> 0 THEN RETURN 0 ' nicht das letzte Holz genommen
NEXT
RETURN -1 ' Verlust des Spiels
END FUNCTION
FUNCTION minimax(resttiefe AS INTEGER) AS zugtyp
DIM AS INTEGER besteReihe, besteAnz, besterWert, zugWert, gefunden
besterWert = -2^31 ' auf den kleinstmoeglichen Wert stellen
FOR r AS INTEGER = 1 TO reihenzahl ' moegliche Zuege: aus jeder Reihe jede
FOR anz AS INTEGER = 1 TO reihe(r) ' moegliche Streichholzzahl entfernen
reihe(r) -= anz ' Zug durchfuehren
IF restTiefe <= 1 THEN ' wurde die maximale Berechnungstiefe
zugWert = berechneSpielwert ' erreicht, dann bewerte die Situation
ELSE
zugWert = -minimax(restTiefe-1).wert ' sonst rekursiv weiterrechnen
END IF
reihe(r) += anz ' Ausgangssituation wiederherstellen
IF zugWert > besterWert THEN
besterWert = zugWert : besteReihe = r : besteAnz = anz : gefunden = 1
ELSEIF zugWert = besterWert THEN
gefunden += 1
IF INT(RND*gefunden) = 0 THEN
besterWert = zugWert : besteReihe = r : besteAnz = anz
END IF
END IF
NEXT anz, r
IF besterWert = -2^31 THEN RETURN TYPE(0, 0, 1) ' Spieler hat gewonnen
RETURN TYPE(besteReihe, besteAnz, besterWert)
END FUNCTION
DO ' Hauptprogramm
CLS
FOR r AS INTEGER = 1 TO reihenzahl
FOR anz AS INTEGER = 1 TO reihe(r) : PRINT "| "; : NEXT
PRINT : PRINT
NEXT
IF GETKEY = 27 THEN EXIT DO
spieler = -spieler
zug = minimax(rechentiefe)
IF zug.reihe <> 0 THEN reihe(zug.reihe) -= zug.anz
LOOP UNTIL zug.reihe = 0