home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / OPENSTEP / Games / NeXTGo-3.0-MIS / genmove.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-06  |  2.5 KB  |  122 lines

  1. #include "comment.header"
  2.   
  3. /* $Id: genmove.c,v 1.3 1997/07/06 19:35:00 ergo Exp $ */
  4.  
  5. /*
  6.  * $Log: genmove.c,v $
  7.  * Revision 1.3  1997/07/06 19:35:00  ergo
  8.  * actual version
  9.  *
  10.  * Revision 1.2  1997/05/04 18:57:05  ergo
  11.  * added time control for moves
  12.  *
  13.  */
  14.  
  15. #define EMPTY 0
  16. #define MAXTRY 400
  17. #define BLACKSTONE 2
  18.  
  19. extern unsigned char p[19][19];
  20. extern int currentStone, opposingStone, MAXX, MAXY;
  21. extern int rd, lib, blackPassed, whitePassed;
  22. extern void eval(int);
  23. extern int findwinner(int*,int*,int*);
  24. extern int findsaver(int*,int*,int*);
  25. extern int findpatn(int*,int*,int*);
  26. extern void countlib(int,int,int);
  27. extern int fioe(int,int);
  28. extern void Random(int*);
  29.  
  30. void genmove(int *i, int *j)
  31.      /* generate computer move */
  32. {
  33.   int ti, tj, tval;
  34.   int val;
  35.   int try = 0;   /* number of try */
  36.   
  37.   /* initialize move and value */
  38.   *i = -1;  *j = -1;  val = -1;
  39.   
  40.   /* re-evaluate liberty of opponent pieces */
  41.   eval(opposingStone);
  42.   
  43.   /* find opponent piece to capture or attack */
  44.   if (findwinner(&ti, &tj, &tval))
  45.     if (tval > val)
  46.       {
  47.     val = tval;
  48.     *i = ti;
  49.     *j = tj;
  50.       }
  51.   
  52.   /* save any piece if threaten */
  53.   if (findsaver(&ti, &tj, &tval))
  54.     if (tval > val)
  55.       {
  56.     val = tval;
  57.     *i = ti;
  58.     *j = tj;
  59.       }
  60.   
  61.   /* try match local play pattern for new move */
  62.   if (findpatn(&ti, &tj, &tval))
  63.     if (tval > val)
  64.       {
  65.     val = tval;
  66.     *i = ti;
  67.     *j = tj;
  68.       }
  69.   
  70.   /* no urgent move then do random move */
  71.   if (val < 0)
  72.     do {
  73.       Random(&rd);
  74.       *i = rd % MAXX;
  75.       /* avoid low line  and center region */
  76.       if ((*i < 2) || (*i > MAXX - 3) || ((*i > (MAXX/2) - 2) && (*i < (MAXX/2) + 2)))
  77.     {
  78.       Random(&rd);
  79.       *i = rd % MAXX;
  80.       if ((*i < 2) || (*i > MAXX - 3))
  81.         {
  82.           Random(&rd);
  83.           *i = rd % MAXX;
  84.         }
  85.     }
  86.       Random(&rd);
  87.       *j = rd % MAXY;
  88.       /* avoid low line and center region */
  89.       if ((*j < 2) || (*j > MAXY - 3) || ((*j > (MAXX/2) - 2) && (*j < (MAXY/2) + 2)))
  90.     {
  91.       Random(&rd);
  92.       *j = rd % MAXY;
  93.       if ((*j < 2) || (*j > MAXY - 3))
  94.         {
  95.           Random(&rd);
  96.           *j = rd % MAXY;
  97.         }
  98.     }
  99.       lib = 0;
  100.       countlib(*i, *j, currentStone);
  101.     }
  102.   /* avoid illegal move, liberty one or suicide, fill in own eye */
  103.   while ((++try < MAXTRY)
  104.      && ((p[*i][*j] != EMPTY) || (lib < 3) || fioe(*i, *j)));
  105.   
  106.   if (try >= MAXTRY)  /* computer pass */
  107.     {
  108.       if (currentStone == BLACKSTONE)
  109.     blackPassed = 1;
  110.       else
  111.     whitePassed = 1;
  112.       *i = *j = -1;
  113.     }
  114.   else   /* find valid move */
  115.     {
  116.       if (currentStone == BLACKSTONE)
  117.     blackPassed = 0;
  118.       else
  119.     whitePassed = 0;
  120.     }
  121. }  /* end genmove */
  122.