Ticket #145: surround.c.patch

File surround.c.patch, 5.3 kB (added by draqo, 2 years ago)
  • gnugo/engine/surround.c

    RCS file: /sources/gnugo/gnugo/engine/surround.c,v
    retrieving revision 1.17
    diff -u -r1.17 surround.c
     
    131131 
    132132  /* descend markings from stones lying on the 2nd and third lines */ 
    133133 
    134   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    135     if (ON_BOARD(dpos) && mn[dpos]) { 
     134  scan_board(dpos, 
     135    if (mn[dpos]) { 
    136136      for (k = 0; k < 4; k++) { 
    137137        int d = delta[k]; 
    138138        if (!ON_BOARD(dpos + d)) 
     
    147147            mn[dpos + 2*d] = 1; 
    148148        } 
    149149      } 
    150     } 
     150        } 
     151  ) 
    151152 
    152153  /* compute minimum distances to the goal */ 
    153154 
    154   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    155     if (ON_BOARD(dpos) && mn[dpos])  
     155  scan_board(dpos, 
     156    if (mn[dpos]) 
    156157      sd[dpos] = goal_dist(dpos, mf); 
     158  ) 
    157159 
    158160  /* revise markings */ 
    159161 
    160162  do { 
    161163    found_some = 0; 
    162     for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    163       if (ON_BOARD(dpos) && mn[dpos] && sd[dpos] > 8) { 
     164    scan_board(dpos, 
     165      if (mn[dpos] && sd[dpos] > 8) { 
    164166        /* discard markings if we can find 2 stones 
    165167         * that verify : 
    166168         * - it is closer to the goal than we are 
    167169         * - it is closer to us than the goal is 
    168170         * - they are closer to each other than we are to the goal 
    169171         */ 
    170         for (i = BOARDMIN; i < BOARDMAX; i++) 
    171           if (ON_BOARD(i) && mn[i] && i != dpos 
     172        scan_board(i, 
     173          if (mn[i] && i != dpos 
    172174              && sd[i] < sd[dpos] 
    173175              && square_dist(i, dpos) < sd[dpos]) { 
    174176            for (j = i + 1; j < BOARDMAX; j++) 
     
    182184              } 
    183185            if (mn[dpos] == 0) 
    184186              break; 
    185           } 
    186       } 
     187                          } 
     188            ) 
     189          } 
     190        ) 
    187191  } while (found_some); 
    188192 
    189193  /* prepare corner array */ 
    190194 
    191   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    192     if (ON_BOARD(dpos) && mn[dpos]) 
     195  scan_board(dpos, 
     196    if (mn[dpos]) 
    193197      corner[corners++] = dpos; 
     198  ) 
    194199 
    195200  /* compute gravity center of the goal */ 
    196201 
    197   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    198     if (ON_BOARD(dpos) && mf[dpos]) { 
     202  scan_board(dpos, 
     203    if (mf[dpos]) { 
    199204      gi += I(dpos); 
    200205      gj += J(dpos); 
    201206      stones++; 
    202207    } 
     208  ) 
    203209  gi /= stones; 
    204210  gj /= stones; 
    205211  gg = POS(gi, gj); 
     
    363369   
    364370  /* mark the expanded region */ 
    365371 
    366   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
    367     if (ON_BOARD(dpos) && mn[dpos] == 1) 
     372  scan_board(dpos, 
     373    if (mn[dpos] == 1) 
    368374      for (k = 0; k < 4; k++) 
    369375        if (ON_BOARD(dpos + delta[k]) && !mn[dpos + delta[k]]) 
    370376          mn[dpos + delta[k]] = 2; 
     377  ) 
    371378       
    372379  /* Mark allied dragons that intersect the (unexpanded) hull. 
    373380   * These must all lie entirely within the hull for the 
     
    377384   * are not neighbors are less likely to be helpful. 
    378385   */ 
    379386 
    380   for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) { 
     387  scan_board(dpos, 
    381388    int mpos; 
    382     if (ON_BOARD(dpos)  
    383         && mn[dpos] == 1 
     389    if (mn[dpos] == 1 
    384390        && board[dpos] == color 
    385391        && are_neighbor_dragons(pos, dpos) 
    386392        && !mf[dpos]) { 
    387393 
    388       for (mpos = BOARDMIN; mpos < BOARDMAX; mpos++) 
    389         if (ON_BOARD(mpos) && is_same_dragon(mpos, dpos)) 
    390           mf[mpos] = 2; 
    391     } 
     394      scan_board(mpos, 
     395            if (is_same_dragon(mpos, dpos)) 
     396              mf[mpos] = 2; 
     397          ) 
     398        } 
    392399    /* A special case 
    393400     * 
    394401     *  . X X . 
     
    402409     * Consequently, we allow inclusion of the stones at kosumi distance 
    403410     * in the mf (friendly) array. 
    404411     */ 
    405     if (ON_BOARD(dpos)  
    406         && mn[dpos] == 2 
     412    if (mn[dpos] == 2 
    407413        && board[dpos] == color 
    408414        && are_neighbor_dragons(pos, dpos) 
    409415        && !mf[dpos]) { 
     
    412418            && mn[dpos + delta[k]] == 1 
    413419            && board[dpos + delta[k-4]] == EMPTY 
    414420            && board[dpos + delta[(k-3)%4]] == EMPTY) { 
    415           for (mpos = BOARDMIN; mpos < BOARDMAX; mpos++) 
    416             if (ON_BOARD(mpos) && is_same_dragon(mpos, dpos)) 
     421          scan_board(mpos, 
     422            if (is_same_dragon(mpos, dpos)) 
    417423              mf[mpos] = 2; 
     424          ) 
    418425        } 
    419426    } 
    420   } 
     427  ) 
    421428 
    422429  /* determine the surround status of the dragon */ 
    423430 
     
    451458  } 
    452459 
    453460  if (surrounded) 
    454     for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) 
     461    scan_board(dpos, 
    455462      if (mf[dpos]) { 
    456463        if (mn[dpos] == 0) { 
    457464          surrounded = 0; 
     
    459466        } 
    460467        else if (mn[dpos] == 2) 
    461468          surrounded = WEAKLY_SURROUNDED; 
    462       } 
     469          } 
     470        ) 
    463471 
    464472  /* revise the status for single stone dragons. */ 
    465473 
     
    471479  /* revise the status if an ikken tobi jumps out. */ 
    472480 
    473481  if (surrounded) { 
    474     for (dpos = BOARDMIN; dpos < BOARDMAX && surrounded; dpos++) { 
    475       if (!ON_BOARD(dpos) || !mf[dpos]) 
     482        scan_board(dpos, 
     483          if (!surrounded) 
     484            break; 
     485 
     486      if (!mf[dpos]) 
    476487        continue; 
    477488 
    478489      for (k = 0; k < 4; k++) { 
     
    489500          break; 
    490501        } 
    491502      } 
    492     } 
     503        ) 
    493504  } 
    494505 
    495506  if (showboard == 1 || (showboard == 2 && surrounded)) { 
     
    506517    int pos; 
    507518 
    508519    *surround_size = 0; 
    509     for (pos = BOARDMIN; pos < BOARDMAX; pos++) 
    510       if (ON_BOARD(pos) && mn[pos] == 1) 
    511         (*surround_size)++; 
     520    scan_board(pos, 
     521      if (mn[pos] == 1) 
     522            ++(*surround_size); 
     523        ) 
    512524  } 
    513525 
    514526  return surrounded; 
     
    524536  int dist = 10000; 
    525537  int ii; 
    526538 
    527   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    528     if (ON_BOARD(ii) && goal[ii]) 
     539  scan_board(ii, 
     540    if (goal[ii]) 
    529541      dist = gg_min(dist, square_dist(ii, pos)); 
     542  ) 
    530543 
    531544  return dist; 
    532545}