Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

14.3: Nim-Spiel

Uploader:Redakteurnemored
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