home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 08 / minimax / minimax.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1989-05-10  |  2.4 KB  |  68 lines

  1. CONST  MaxZuege      =   ;
  2.        maximaleTiefe =   ;
  3.  
  4. TYPE  StellungsTyp =   ;
  5.       ZugTyp       =   ;
  6.       ZuglistenTyp = ARRAY [1..MaxZuege] OF ZugTyp;
  7.  
  8. (*
  9.  
  10. PROCEDURE Zuggenerator (VAR Stellung: StellungsTyp; VAR Zugliste: ZuglistenTyp;
  11.                                                              VAR ZugZahl: BYTE);
  12.  
  13. PROCEDURE FuehreZugAus (VAR Stellung: StellungsTyp; Zug: ZugTyp);
  14.  
  15. PROCEDURE NimmZugZurueck (VAR Stellung: StellungsTyp; Zug: ZugTyp);
  16.  
  17. FUNCTION ComputerAmZug (VAR Stellung: StellungsTyp): BOOLEAN;
  18.  
  19. FUNCTION statischeBewertung (VAR Stellung: StellungsTyp): INTEGER;
  20.  
  21. *)
  22.  
  23. FUNCTION ErmittleStellungswert (VAR Stellung: StellungsTyp; Tiefe: BYTE;
  24.                                 alpha0, beta0: INTEGER; besterZug: ZugTyp): INTEGER;
  25.  
  26.   VAR  Zugliste                   : ZuglistenTyp;
  27.        aktuellerZug, besterZugNeu : ZugTyp;
  28.        alpha, beta, aktuellerWert : INTEGER;
  29.        ZugZahl, ZugNr             : BYTE;
  30.        CutOff                     : BOOLEAN;
  31.  
  32.   BEGIN
  33.     IF Tiefe = maximaleTiefe THEN
  34.       ErmittleStellungswert := statischeBewertung(Stellung)
  35.     ELSE BEGIN
  36.       IF ComputerAmZug(Stellung) THEN alpha := -10000 ELSE beta := 10000;
  37.       Zuggenerator(Stellung, Zugliste, ZugZahl);
  38.       IF ZugZahl = 0 THEN
  39.         ErmittleStellungswert := 0
  40.       ELSE BEGIN
  41.         ZugNr := 0;  CutOff := FALSE;
  42.         WHILE (ZugNr < ZugZahl) AND (NOT CutOff) DO BEGIN
  43.           ZugNr := SUCC(ZugNr);
  44.           aktuellerZug := Zugliste[ZugNr];
  45.           FuehreZugAus(Stellung, aktuellerZug);
  46.           aktuellerWert := ErmittleStellungswert(Stellung, Tiefe+1, alpha, beta, besterZugNeu);
  47.           NimmZugZurueck(Stellung, aktuellerZug);
  48.           IF ComputerAmZug(Stellung) THEN BEGIN
  49.             IF alpha < aktuellerWert THEN BEGIN
  50.               alpha := aktuellerWert; besterZug := aktuellerZug
  51.             END; (* then *)
  52.             IF alpha >= beta0 THEN CutOff := TRUE
  53.           END (* then *)
  54.           ELSE BEGIN
  55.             IF beta > aktuellerWert THEN BEGIN
  56.               beta := aktuellerWert; besterZug := aktuellerZug
  57.             END; (* then *)
  58.             IF beta <= alpha0 THEN CutOff := TRUE
  59.           END (* else *)
  60.         END; (* while *)
  61.         IF ComputerAmZug(Stellung) THEN
  62.           ErmittleStellungswert := alpha
  63.         ELSE
  64.           ErmittleStellungswert := beta
  65.       END (* else *)
  66.     END (* else *)
  67.   END; (* ErmittleStellungswert *)
  68.