home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume11 / reve / part06 / rev_eval.c < prev    next >
C/C++ Source or Header  |  1990-11-15  |  8KB  |  226 lines

  1.  
  2. /*  @(#)rev_eval.c 1.3 90/09/24
  3.  *
  4.  *  Copyright (C) 1990 - Yves Gallot - all rights reserved.
  5.  *
  6.  *  Permission is given to distribute these sources, as long as the
  7.  *  introductory messages are not removed, and no monies are exchanged.
  8.  *
  9.  *  You are forbidden from using Reve as is, or in a modified state, in
  10.  *  any tournaments, without the permission of the authors.
  11.  *
  12.  *  No responsibility is taken for any errors on inaccuracies inherent
  13.  *  either to the comments or the code of this program, but if reported
  14.  *  (see README file), then an attempt will be made to fix them.
  15.  */
  16.  
  17. #include "reve.h"
  18.  
  19. extern int damier[NIVEAUMAX][64] ;
  20. extern int tacouleur, macouleur ;
  21. extern int mnb, profmax ;
  22. extern int vp0, vo0 ;
  23. extern long c1, c2, c3 ;
  24. extern long edges[6561] ;
  25.  
  26. /*  Evaluation function : give a note to a board = damier[ niv ].
  27.  *  It computes 4 components :
  28.  *     - Edge Stability, using Edge Stability Table pre-computed before
  29.  *     - Current Mobility, in fact computed during alpha-beta pruning
  30.  *     - X squares Values
  31.  *     - Potential Mobility, looking at squares contacts
  32.  *  And then Eval = c1 * ES + c2 * CM + c3 * XV + c4 * PM
  33.  *  Eval is replaced by - Eval if Black is replaced by White. Eval is positif
  34.  *  if macouleur ( my color ) has a good position and negatif if tacouleur
  35.  *  position is good.
  36.  *  If we are "near" the end of the game, then Eval is equal to final disc
  37.  *  differential.
  38.  */
  39.  
  40. long
  41. evalue(niv)
  42. int niv ;
  43. {
  44.   register int *d, *p ;
  45.   register int i, x, y ;
  46.   register long note ;
  47.   register int vp, vo ;
  48.   register long tnote ;
  49.  
  50.   d = damier[niv] ;
  51.  
  52.   if (mnb > 60 - profmax)
  53.     {
  54.       note = 0 ;
  55.       for (p = &d[0]; p < &d[64]; p++)
  56.              if (*p == macouleur) note++ ;
  57.         else if (*p == tacouleur) note-- ;
  58.       return(note) ;
  59.     }
  60.   else
  61.     {
  62.       x = y = 0 ;
  63.       for (p = &d[0]; p < &d[64]; p++)
  64.              if (*p == macouleur) x++ ;
  65.         else if (*p == tacouleur) y++ ;
  66.       if (x == 0) return(-100000000) ;
  67.       if (y == 0) return( 100000000) ;
  68.  
  69.       for (p = &d[0]; p < &d[64]; p++)
  70.         if ((*p == TPJ) || (*p == JPJ)) *p = FREE ;
  71.  
  72.       i = 0 ;
  73.       for (p = &d[0]; p < &d[8]; p++)
  74.         {
  75.           i += i + i ;
  76.                if (*p == FREE)      i++ ;
  77.           else if (*p == macouleur) i += 2 ;
  78.         }
  79.       note = edges[i] ;
  80.  
  81.       i = 0 ;
  82.       for (p = &d[56]; p < &d[64]; p++)
  83.         {
  84.           i += i + i ;
  85.                if (*p == FREE)      i++ ;
  86.           else if (*p == macouleur) i += 2 ;
  87.         }
  88.       note += edges[i] ;
  89.  
  90.       i = 0 ;
  91.       for (p = &d[0]; p < &d[64]; p += 8)
  92.         {
  93.           i += i + i ;
  94.                if (*p == FREE)      i++ ;
  95.           else if (*p == macouleur) i += 2 ;
  96.         }
  97.       note += edges[i] ;
  98.  
  99.       i = 0 ;
  100.       for (p = &d[7]; p < &d[64]; p += 8)
  101.         {
  102.           i += i + i ;
  103.                if (*p == FREE)      i++ ;
  104.           else if (*p == macouleur) i += 2 ;
  105.         }
  106.       note += edges[i] ;
  107.  
  108.       if (d[0] == FREE)
  109.         {
  110.                if (d[9] == macouleur) note -= c3 ;
  111.           else if (d[9] == tacouleur) note += c3 ;
  112.         }
  113.  
  114.       if (d[7] == FREE)
  115.         {
  116.                if (d[14] == macouleur) note -= c3 ;
  117.           else if (d[14] == tacouleur) note += c3 ;
  118.         }
  119.  
  120.       if (d[56] == FREE)
  121.         {
  122.                if (d[49] == macouleur) note -= c3 ;
  123.           else if (d[49] == tacouleur) note += c3 ;
  124.         }
  125.  
  126.       if (d[63] == FREE)
  127.         {
  128.                if (d[54] == macouleur) note -= c3 ;
  129.           else if (d[54] == tacouleur) note += c3 ;
  130.         }
  131.  
  132.       tnote = c1 * note + c2 * (vp0 - vo0) / (vp0 + vo0 + 2) ;
  133.  
  134.       vp = vo = 0 ;
  135.       for (x = 0; x < 8; x++)
  136.         for (y = 0; y < 8; y++)
  137.           {
  138.             i = (x << 3) + y ;
  139.             if (d[i] == tacouleur)
  140.               {
  141.                      if ((x > 0) && (d[i - 8] == FREE))            vp++ ;
  142.                 else if ((x < 7) && (d[i + 8] == FREE))            vp++ ;
  143.                 else if ((y > 0) && (d[i - 1] == FREE))            vp++ ;
  144.                 else if ((y < 7) && (d[i + 1] == FREE))            vp++ ;
  145.                 else if ((x > 0) && (y > 0) && (d[i - 9] == FREE)) vp++ ;
  146.                 else if ((x < 7) && (y > 0) && (d[i + 7] == FREE)) vp++ ;
  147.                 else if ((x > 0) && (y < 7) && (d[i - 7] == FREE)) vp++ ;
  148.                 else if ((x < 7) && (y < 7) && (d[i + 9] == FREE)) vp++ ;
  149.               }
  150.             if (d[i] == macouleur)
  151.               {
  152.                      if ((x > 0) && (d[i - 8] == FREE))             vo++ ;
  153.                 else if ((x < 7) && (d[i + 8] == FREE))             vo++ ;
  154.                 else if ((y > 0) && (d[i - 1] == FREE))             vo++ ;
  155.                 else if ((y < 7) && (d[i + 1] == FREE))             vo++ ;
  156.                 else if ((x > 0) && (y > 0) && ( d[i - 9] == FREE)) vo++ ;
  157.                 else if ((x < 7) && (y > 0) && ( d[i + 7] == FREE)) vo++ ;
  158.                 else if ((x > 0) && (y < 7) && ( d[i - 7] == FREE)) vo++ ;
  159.                 else if ((x < 7) && (y < 7) && ( d[i + 9] == FREE)) vo++ ;
  160.               }
  161.           }
  162.  
  163.       note = ((long) 1000 * (vp - vo)) / (vp + vo + 2) ;
  164.  
  165.       vp = vo = 0 ;
  166.       for (x = 0; x < 8; x++)
  167.         for (y = 0; y < 8; y++)
  168.           {
  169.             i = (x << 3) + y ;
  170.             if (d[i] == FREE)
  171.               {
  172.                      if ((x > 0) && (d[i - 8] == tacouleur))            vp++ ;
  173.                 else if ((x < 7) && (d[i + 8] == tacouleur))            vp++ ;
  174.                 else if ((y > 0) && (d[i - 1] == tacouleur))            vp++ ;
  175.                 else if ((y < 7) && (d[i + 1] == tacouleur))            vp++ ;
  176.                 else if ((x > 0) && (y > 0) && (d[i - 9] == tacouleur)) vp++ ;
  177.                 else if ((x < 7) && (y > 0) && (d[i + 7] == tacouleur)) vp++ ;
  178.                 else if ((x > 0) && (y < 7) && (d[i - 7] == tacouleur)) vp++ ;
  179.                 else if ((x < 7) && (y < 7) && (d[i + 9] == tacouleur)) vp++ ;
  180.  
  181.                      if ((x > 0) && (d[i - 8] == macouleur))            vo++ ;
  182.                 else if ((x < 7) && (d[i + 8] == macouleur))            vo++ ;
  183.                 else if ((y > 0) && (d[i - 1] == macouleur))            vo++ ;
  184.                 else if ((y < 7) && (d[i + 1] == macouleur))            vo++ ;
  185.                 else if ((x > 0) && (y > 0) && (d[i - 9] == macouleur)) vo++ ;
  186.                 else if ((x < 7) && (y > 0) && (d[i + 7] == macouleur)) vo++ ;
  187.                 else if ((x > 0) && (y < 7) && (d[i - 7] == macouleur)) vo++ ;
  188.                 else if ((x < 7) && (y < 7) && (d[i + 9] == macouleur)) vo++ ;
  189.               }
  190.           }
  191.  
  192.       note += ((long) 1000 * (vp - vo)) / (vp + vo + 2) ;
  193.  
  194.       vp = vo = 0 ;
  195.       for (x = 0; x < 8; x++)
  196.         for (y = 0; y < 8; y++)
  197.           {
  198.             i = (x << 3) + y ;
  199.             if (d[i] == FREE)
  200.               {
  201.                 if ((x > 0) && (d[i - 8] == tacouleur))            vp++ ;
  202.                 if ((x < 7) && (d[i + 8] == tacouleur))            vp++ ;
  203.                 if ((y > 0) && (d[i - 1] == tacouleur))            vp++ ;
  204.                 if ((y < 7) && (d[i + 1] == tacouleur))            vp++ ;
  205.                 if ((x > 0) && (y > 0) && (d[i - 9] == tacouleur)) vp++ ;
  206.                 if ((x < 7) && (y > 0) && (d[i + 7] == tacouleur)) vp++ ;
  207.                 if ((x > 0) && (y < 7) && (d[i - 7] == tacouleur)) vp++ ;
  208.                 if ((x < 7) && (y < 7) && (d[i + 9] == tacouleur)) vp++ ;
  209.  
  210.                 if ((x > 0) && (d[i - 8] == macouleur))            vo++ ;
  211.                 if ((x < 7) && (d[i + 8] == macouleur))            vo++ ;
  212.                 if ((y > 0) && (d[i - 1] == macouleur))            vo++ ;
  213.                 if ((y < 7) && (d[i + 1] == macouleur))            vo++ ;
  214.                 if ((x > 0) && (y > 0) && (d[i - 9] == macouleur)) vo++ ;
  215.                 if ((x < 7) && (y > 0) && (d[i + 7] == macouleur)) vo++ ;
  216.                 if ((x > 0) && (y < 7) && (d[i - 7] == macouleur)) vo++ ;
  217.                 if ((x < 7) && (y < 7) && (d[i + 9] == macouleur)) vo++ ;
  218.               }
  219.           }
  220.  
  221.       note += ((long) 1000 * (vp - vo)) / (vp + vo + 2) ;
  222.       tnote += 99 * note ;
  223.       return(tnote) ;
  224.     }
  225. }
  226.