Ticket #170: draqo-does_defend.diff

File draqo-does_defend.diff, 4.8 kB (added by gunnar, 16 months ago)

Rediff of previous patch

  • engine/utils.c

     
    133133 
    134134 
    135135/* 
    136  * does_defend(move, str) returns true if the move at (move) 
    137  * defends (str). This means that it defends the string, and that 
    138  * (str) can be captured if no defense is made. 
    139  * 
    140  * FIXME: Make does_defend() ko aware like does_attack(). 
     136 * does_defend(move, str) returns the result code for a defense on the 
     137 * string 'str' by the move 'move'. However, if the move does not 
     138 * improve the defense result compared to tenuki, 0 is returned. If the 
     139 * string (str) can't be captured if no defense is made, 0 is returned 
     140 * too. 
    141141 */ 
    142142 
    143143int 
     
    147147  int other = OTHER_COLOR(color); 
    148148  int result = 0; 
    149149  int spos = NO_MOVE; 
     150  int acode; 
    150151 
    151   if (!attack(str, &spos)) 
     152  acode = attack(str, &spos); 
     153  if (!acode) 
    152154    return 0; 
    153155 
    154156  gg_assert(spos != NO_MOVE); 
    155157   
    156158  if (trymove(move, color, "does_defend-A", str)) { 
    157     if (!attack(str, NULL)) { 
    158       result = 1; 
    159       increase_depth_values(); 
     159    int acode2 = attack(str, NULL); 
     160    if (acode2 < acode) { 
     161      result = REVERSE_RESULT(acode2); 
    160162      if (trymove(spos, other, "does_defend-B", str)) { 
    161         if (!board[str] || !find_defense(str, NULL)) 
     163        increase_depth_values(); 
     164        if (board[str]) { 
     165          int new_result = find_defense(str, NULL); 
     166          if (new_result < result) 
     167            result = new_result; 
     168        } 
     169        else 
    162170          result = 0; 
    163171        popgo(); 
     172        decrease_depth_values(); 
    164173      } 
    165       decrease_depth_values(); 
    166174    } 
    167175    popgo(); 
    168176  } 
  • engine/worm.c

     
    402402   * incorrectly, which may lead to some confusion later. 
    403403   */ 
    404404 
    405   /* First look for vertical neighbors. */ 
    406405  for (pos = BOARDMIN; pos < BOARDMAX; pos++) { 
    407     if (IS_STONE(board[pos]) 
    408         && IS_STONE(board[SOUTH(pos)]) 
    409         && !is_same_worm(pos, SOUTH(pos))) { 
    410       if (worm[pos].attack_codes[0] != 0 
    411           && worm[SOUTH(pos)].attack_codes[0] != 0) { 
    412         if (worm[pos].defense_codes[0] == 0 
    413             && does_defend(worm[SOUTH(pos)].attack_points[0], pos)) { 
    414           /* FIXME: need to check ko relationship here */ 
    415           change_defense(pos, worm[SOUTH(pos)].attack_points[0], WIN); 
     406    int neighbor_pos; 
     407    if (IS_STONE(board[pos])) { 
     408      int str; 
     409      /* First look for vertical neighbors, then horizontal. */ 
     410      for (str = 0; str < 2; str++) { 
     411        if (str) 
     412          neighbor_pos = EAST(pos); 
     413        else 
     414          neighbor_pos = SOUTH(pos); 
     415 
     416        if (IS_STONE(board[neighbor_pos]) 
     417            && !is_same_worm(pos, neighbor_pos)) { 
     418          int dcode; 
     419          if (!worm[pos].defense_codes[0] 
     420              && worm[neighbor_pos].attack_codes[0]) { 
     421            dcode = does_defend(worm[neighbor_pos].attack_points[0], pos); 
     422            if (dcode) 
     423              change_defense(pos, worm[neighbor_pos].attack_points[0], dcode); 
     424          } 
     425          if (!worm[neighbor_pos].defense_codes[0] 
     426              && worm[pos].attack_codes[0]) { 
     427            dcode = does_defend(worm[pos].attack_points[0], neighbor_pos); 
     428            if (dcode) 
     429              change_defense(neighbor_pos, worm[pos].attack_points[0], dcode); 
     430          } 
    416431        } 
    417         if (worm[SOUTH(pos)].defense_codes[0] == 0 
    418             && does_defend(worm[pos].attack_points[0], SOUTH(pos))) { 
    419           /* FIXME: need to check ko relationship here */            
    420           change_defense(SOUTH(pos), worm[pos].attack_points[0], WIN); 
    421         } 
    422432      } 
    423433    } 
    424434  } 
    425435   
    426   /* Then look for horizontal neighbors. */ 
    427   for (pos = BOARDMIN; pos < BOARDMAX; pos++) { 
    428     if (IS_STONE(board[pos]) 
    429         && IS_STONE(board[EAST(pos)]) 
    430         && !is_same_worm(pos, EAST(pos))) { 
    431       if (worm[pos].attack_codes[0] != 0 
    432           && worm[EAST(pos)].attack_codes[0] != 0) { 
    433         if (worm[pos].defense_codes[0] == 0 
    434             && does_defend(worm[EAST(pos)].attack_points[0], pos)) { 
    435           /* FIXME: need to check ko relationship here */            
    436           change_defense(pos, worm[EAST(pos)].attack_points[0], WIN); 
    437         } 
    438         if (worm[EAST(pos)].defense_codes[0] == 0 
    439             && does_defend(worm[pos].attack_points[0], EAST(pos))) { 
    440           /* FIXME: need to check ko relationship here */            
    441           change_defense(EAST(pos), worm[pos].attack_points[0], WIN); 
    442         } 
    443       } 
    444     } 
    445   } 
    446    
    447436  gg_assert(stackp == 0); 
    448437   
    449438  /* Find adjacent worms that can be easily captured, aka lunches. */ 
  • patterns/barriers.db

     
    18921892cDf 
    18931893bae 
    18941894 
    1895 ;safe_omove(a) 
     1895;safe_omove(a)>KO_B 
    18961896;&& (o_somewhere(e) || oplay_attack(a,e,e)) 
    18971897;&& !oplay_defend_both(a,b,c,b,D) 
    18981898>return (!xplay_attack(a,f) && (o_somewhere(e) || (!xplay_attack(e,f)))); 
     
    19111911eFho 
    19121912cab? 
    19131913 
    1914 ;safe_omove(a) 
     1914;safe_omove(a)>KO_B 
    19151915;&& (o_somewhere(b) || oplay_attack(a,b,b)) 
    19161916;&& !oplay_defend_both(a,c,d,e,F,G) 
    19171917>return (!xplay_attack(a,h));