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

  1. #include "comment.header"
  2.  
  3. /* $Id: smartgoeval.c,v 1.3 1997/07/06 19:35:08 ergo Exp $ */
  4.  
  5. /*
  6.  * $Log: smartgoeval.c,v $
  7.  * Revision 1.3  1997/07/06 19:35:08  ergo
  8.  * actual version
  9.  *
  10.  * Revision 1.2  1997/05/04 18:57:13  ergo
  11.  * added time control for moves
  12.  *
  13.  */
  14.  
  15. /*  Define the following if you want to debug the move list features.  */
  16. /*  #define _DEBUG_MOVE_LISTS_  */
  17.  
  18. #include <strings.h>
  19. #include "smartgo.h"
  20. #include "smgcom.h"
  21.  
  22. #define EMPTY 0
  23. #define WHITE 1
  24. #define BLACK 2
  25. #define MARK 3
  26. #define LETTER 6
  27.  
  28. #ifdef _DEBUG_MOVE_LISTS_
  29. #include <stdio.h>
  30.  
  31. void display_current_board(unsigned char b[19][19])
  32. {
  33.   int i, j;
  34.   extern int MAXX, MAXY;
  35.  
  36.   printf("  ");
  37.   for (i = 0; i < MAXX; i++)
  38.     printf("%c ", i+'a');
  39.   printf("\n");
  40.   for (i = 0; i < MAXX; i++)
  41.     {
  42.       printf("%c ", i+'a');
  43.       for (j = 0; j < MAXY; j++)
  44.     switch (b[j][i]) {
  45.     case 0:
  46.       printf(". ");
  47.       break;
  48.     case 1:
  49.       printf("O ");
  50.       break;
  51.     case 2:
  52.       printf("X ");
  53.       break;
  54.     case 3:
  55.       printf("M ");
  56.       break;
  57.     case 4:
  58.       printf("w ");
  59.       break;
  60.     case 5:
  61.       printf("b ");
  62.       break;
  63.     case 6:
  64.       printf("S ");
  65.       break;
  66.     default:
  67.       break;
  68.     }
  69.       printf("\n");
  70.     }
  71.   printf("\n");
  72. }
  73. #endif
  74.  
  75. char* parseSGMove(char *c0, int *x, int *y)
  76. {
  77.   if (*c0 == '[')
  78.     c0++;
  79.  
  80.   *x = *c0 - 'a';
  81.   c0++;
  82.   *y = *c0 - 'a';
  83.   c0++;
  84.  
  85.   if (*c0 == ']')
  86.     c0++;
  87.  
  88.   return c0;
  89. }
  90.  
  91. char* parseRegularMove(Token t, char* c0, unsigned char b[19][19])
  92. {
  93.   int i, j;
  94.   unsigned char temp[19][19];
  95.   extern int MAXX, MAXY, currentStone, opposingStone, lastMove, hist[19][19];
  96.   extern int boardChanged;
  97.   extern unsigned char p[19][19];
  98.   extern void examboard(int);
  99.  
  100.   c0 = parseSGMove(c0, &i, &j);
  101.  
  102.   if ((i >= 0) && (i < MAXX) && (j >= 0) && (j < MAXY))
  103.     {
  104.       switch (t)
  105.     {
  106.     case t_White:
  107.       b[i][j] = WHITE;
  108.       currentStone = WHITE;
  109.       opposingStone = BLACK;
  110.       break;
  111.     case t_Black:
  112.       b[i][j] = BLACK;
  113.       currentStone = BLACK;
  114.       opposingStone = WHITE;
  115.       break;
  116.     default:
  117.       break;
  118.     }
  119.       lastMove++;
  120.       hist[i][j] = lastMove;
  121.       for (i = 0; i < MAXX; i++)
  122.     for (j = 0; j < MAXY; j++)
  123.       temp[i][j] = p[i][j];
  124.       for (i = 0; i < MAXX; i++)
  125.     for (j = 0; j < MAXY; j++)
  126.       p[i][j] = b[i][j];
  127.       examboard(opposingStone);
  128.       for (i = 0; i < MAXX; i++)
  129.     for (j = 0; j < MAXY; j++)
  130.       b[i][j] = p[i][j];
  131.       for (i = 0; i < MAXX; i++)
  132.     for (j = 0; j < MAXY; j++)
  133.       p[i][j] = temp[i][j];
  134.     }
  135.   boardChanged = 1;
  136.  
  137.   return c0;
  138. }
  139.  
  140. char* parseComment(char* c0)
  141. {
  142.   int i;
  143.   extern char sgComment[2000];
  144.  
  145.   if (*c0 == '[')
  146.     c0++;
  147.  
  148.   i = 0;
  149.   while (*c0 != ']')
  150.     {
  151.       if (*c0 == '\\')
  152.     c0++;
  153.       sgComment[i] = *c0;
  154.  
  155.       i++;
  156.       c0++;
  157.     }
  158.   sgComment[i] = 0;
  159.   return c0;
  160. }
  161.  
  162. char* parseMoveList(Token t, char* c0, unsigned char b[19][19])
  163. {
  164.   int x, y;
  165.   extern int MAXX, MAXY, boardChanged;
  166.  
  167.   while (*c0 == '[')
  168.     {
  169.       c0 = parseSGMove(c0, &x, &y);
  170.  
  171.       if ((x >= 0) && (x < MAXX) && (y >= 0) && (y < MAXY))
  172.     switch (t)
  173.       {
  174.       case t_AddWhite:
  175.         b[x][y] = WHITE;
  176.         break;
  177.       case t_AddBlack:
  178.         b[x][y] = BLACK;
  179.         break;
  180.       case t_Letter:
  181.         b[x][y] = LETTER;
  182.         break;
  183.       case t_Mark:
  184.         b[x][y] = MARK;
  185.         break;
  186.       case t_AddEmpty:
  187.         b[x][y] = EMPTY;
  188.         break;
  189.       default:
  190.         break;
  191.       }
  192.       if (*c0 == '\n')
  193.     c0++;
  194.     }
  195.   boardChanged = 1;
  196.  
  197. #ifdef _DEBUG_MOVE_LISTS_
  198.   display_current_board(b);
  199. #endif
  200.   return c0;
  201. }
  202.  
  203. char* parseNodeName(char* c0)
  204. {
  205.   int i;
  206.   extern char sgNodeName[200];
  207.  
  208.   if (*c0 == '[')
  209.     c0++;
  210.  
  211.   i = 0;
  212.   while (*c0 != ']')
  213.     {
  214.       if (*c0 == '\\')
  215.     c0++;
  216.       sgNodeName[i] = *c0;
  217.  
  218.       i++;
  219.       c0++;
  220.     }
  221.   sgNodeName[i] = 0;
  222.   return c0;
  223. }
  224.  
  225. char* parseSize(char* c0)
  226. {
  227.   int i, j;
  228.   char sizeStr[10];
  229.   extern int MAXX, MAXY;
  230.  
  231.   if (*c0 == '[')
  232.     c0++;
  233.  
  234.   i = 0;
  235.   while (*c0 != ']')
  236.     {
  237.       sizeStr[i] = *c0;
  238.       i++;
  239.       c0++;
  240.     }
  241.  
  242.   sscanf(sizeStr, "%d", &j);
  243.   if ((j > 0) && (j <= 19))
  244.     MAXX = MAXY = j;
  245.   return c0;
  246. }
  247.  
  248. char* parseHandicap(char* c0)
  249. {
  250.   int i, j;
  251.   char handStr[10];
  252.   extern int handicap;
  253.  
  254.   if (*c0 == '[')
  255.     c0++;
  256.  
  257.   i = 0;
  258.   while (*c0 != ']')
  259.     {
  260.       handStr[i] = *c0;
  261.       i++;
  262.       c0++;
  263.     }
  264.  
  265.   sscanf(handStr, "%d", &j);
  266.   if ((j > 0) && (j <= 9))
  267.     handicap = j;
  268.   return c0;
  269. }
  270.  
  271. char* parseInfo(Token t, char* c0)
  272. {
  273.   int i;
  274.   char sgInfo[2000];
  275.  
  276.   if (*c0 == '[')
  277.     c0++;
  278.  
  279.   i = 0;
  280.   while (*c0 != ']')
  281.     {
  282.       if (*c0 == '\\')
  283.     c0++;
  284.       sgInfo[i] = *c0;
  285.  
  286.       i++;
  287.       c0++;
  288.     }
  289.   sgInfo[i] = 0;
  290.   return c0;
  291. }
  292.  
  293. char* parseKomi(char* c0)
  294. {
  295.   int i;
  296.   char komiStr[10];
  297.   float komiValue;
  298.  
  299.   if (*c0 == '[')
  300.     c0++;
  301.  
  302.   i = 0;
  303.   while (*c0 != ']')
  304.     {
  305.       komiStr[i] = *c0;
  306.       i++;
  307.       c0++;
  308.     }
  309.  
  310.   sscanf(komiStr, "%f", &komiValue);
  311.   return c0;
  312. }
  313.  
  314. void evaluateNode(char* c, unsigned char b[19][19])
  315. {
  316.   int i, j, k;
  317.   extern int MAXX, MAXY;
  318.   char *c0, command[3];
  319.   Token t;
  320.   extern char sgComment[2000], sgNodeName[200];
  321.   extern int boardChanged;
  322.  
  323.   boardChanged = 0;
  324.  
  325.   strcpy(sgComment, "");
  326.   strcpy(sgNodeName, "");
  327.  
  328.   for (i = 0; i < MAXX; i++)
  329.     for (j = 0; j < MAXY; j++)
  330.       if (b[i][j] > 2)
  331.     b[i][j] = 0;
  332.  
  333.   c0 = c;
  334.   if (*c0 == ';' || *c0 == '(' || *c0 == ')')
  335.     c0++;
  336.  
  337.   command[0] = command[1] = command[2] = 0;
  338.   i = 0;
  339.   j = 1;
  340.  
  341.   do
  342.     {
  343.       if ((*c0 == ';') || (*c0 == '(') || (*c0 == ')'))
  344.     {
  345.       j = 0;
  346.     }
  347.       else if ((*c0 >= 'A') && (*c0 <= 'Z'))
  348.     {
  349.       command[i] = *c0;
  350.       c0++;
  351.       i++;
  352.     }
  353.       else if (*c0 == '[')
  354.     {
  355.       command[i] = 0;
  356.       i = 0;
  357.       t = t_WS;
  358.       for (k = 0; k < 27; k++)
  359.         if (strcmp(command, commands[k].str) == 0)
  360.           t = commands[k].val;
  361.  
  362.       switch (t)
  363.         {
  364.         case t_White:
  365.         case t_Black:
  366.           c0 = parseRegularMove(t, c0, b);
  367.           break;
  368.         case t_Comment:
  369.           c0 = parseComment(c0);
  370.           break;
  371.         case t_AddWhite:
  372.         case t_AddBlack:
  373.         case t_Letter:
  374.         case t_Mark:
  375.         case t_AddEmpty:
  376.           c0 = parseMoveList(t, c0, b);
  377.           break;
  378.         case t_Name:
  379.           c0 = parseNodeName(c0);
  380.           break;
  381.         case t_Size:
  382.           c0 = parseSize(c0);
  383.           break;
  384.         case t_Handicap:
  385.           c0 = parseHandicap(c0);
  386.           break;
  387.         case t_PlayerBlack:
  388.         case t_PlayerWhite:
  389.         case t_WhiteRank:
  390.         case t_BlackRank:
  391.         case t_GameName:
  392.         case t_Event:
  393.         case t_Round:
  394.         case t_Date:
  395.         case t_Place:
  396.         case t_TimeLimit:
  397.         case t_Result:
  398.         case t_GameComment:
  399.         case t_Source:
  400.         case t_User:
  401.           c0 = parseInfo(t, c0);
  402.           break;
  403.         case t_Komi:
  404.           c0 = parseKomi(c0);
  405.           break;
  406.         default:
  407.           c0++;
  408.           break;
  409.         }
  410.     }
  411.       else c0++;
  412.     } while (j);
  413. }
  414.