RCS file: /sources/gnugo/gnugo/engine/surround.c,v
retrieving revision 1.17
diff -u -r1.17 surround.c
|
|
|
|
| 131 | 131 | |
| 132 | 132 | /* descend markings from stones lying on the 2nd and third lines */ |
| 133 | 133 | |
| 134 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| 135 | | if (ON_BOARD(dpos) && mn[dpos]) { |
| | 134 | scan_board(dpos, |
| | 135 | if (mn[dpos]) { |
| 136 | 136 | for (k = 0; k < 4; k++) { |
| 137 | 137 | int d = delta[k]; |
| 138 | 138 | if (!ON_BOARD(dpos + d)) |
| … |
… |
|
| 147 | 147 | mn[dpos + 2*d] = 1; |
| 148 | 148 | } |
| 149 | 149 | } |
| 150 | | } |
| | 150 | } |
| | 151 | ) |
| 151 | 152 | |
| 152 | 153 | /* compute minimum distances to the goal */ |
| 153 | 154 | |
| 154 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| 155 | | if (ON_BOARD(dpos) && mn[dpos]) |
| | 155 | scan_board(dpos, |
| | 156 | if (mn[dpos]) |
| 156 | 157 | sd[dpos] = goal_dist(dpos, mf); |
| | 158 | ) |
| 157 | 159 | |
| 158 | 160 | /* revise markings */ |
| 159 | 161 | |
| 160 | 162 | do { |
| 161 | 163 | 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) { |
| 164 | 166 | /* discard markings if we can find 2 stones |
| 165 | 167 | * that verify : |
| 166 | 168 | * - it is closer to the goal than we are |
| 167 | 169 | * - it is closer to us than the goal is |
| 168 | 170 | * - they are closer to each other than we are to the goal |
| 169 | 171 | */ |
| 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 |
| 172 | 174 | && sd[i] < sd[dpos] |
| 173 | 175 | && square_dist(i, dpos) < sd[dpos]) { |
| 174 | 176 | for (j = i + 1; j < BOARDMAX; j++) |
| … |
… |
|
| 182 | 184 | } |
| 183 | 185 | if (mn[dpos] == 0) |
| 184 | 186 | break; |
| 185 | | } |
| 186 | | } |
| | 187 | } |
| | 188 | ) |
| | 189 | } |
| | 190 | ) |
| 187 | 191 | } while (found_some); |
| 188 | 192 | |
| 189 | 193 | /* prepare corner array */ |
| 190 | 194 | |
| 191 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| 192 | | if (ON_BOARD(dpos) && mn[dpos]) |
| | 195 | scan_board(dpos, |
| | 196 | if (mn[dpos]) |
| 193 | 197 | corner[corners++] = dpos; |
| | 198 | ) |
| 194 | 199 | |
| 195 | 200 | /* compute gravity center of the goal */ |
| 196 | 201 | |
| 197 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| 198 | | if (ON_BOARD(dpos) && mf[dpos]) { |
| | 202 | scan_board(dpos, |
| | 203 | if (mf[dpos]) { |
| 199 | 204 | gi += I(dpos); |
| 200 | 205 | gj += J(dpos); |
| 201 | 206 | stones++; |
| 202 | 207 | } |
| | 208 | ) |
| 203 | 209 | gi /= stones; |
| 204 | 210 | gj /= stones; |
| 205 | 211 | gg = POS(gi, gj); |
| … |
… |
|
| 363 | 369 | |
| 364 | 370 | /* mark the expanded region */ |
| 365 | 371 | |
| 366 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| 367 | | if (ON_BOARD(dpos) && mn[dpos] == 1) |
| | 372 | scan_board(dpos, |
| | 373 | if (mn[dpos] == 1) |
| 368 | 374 | for (k = 0; k < 4; k++) |
| 369 | 375 | if (ON_BOARD(dpos + delta[k]) && !mn[dpos + delta[k]]) |
| 370 | 376 | mn[dpos + delta[k]] = 2; |
| | 377 | ) |
| 371 | 378 | |
| 372 | 379 | /* Mark allied dragons that intersect the (unexpanded) hull. |
| 373 | 380 | * These must all lie entirely within the hull for the |
| … |
… |
|
| 377 | 384 | * are not neighbors are less likely to be helpful. |
| 378 | 385 | */ |
| 379 | 386 | |
| 380 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) { |
| | 387 | scan_board(dpos, |
| 381 | 388 | int mpos; |
| 382 | | if (ON_BOARD(dpos) |
| 383 | | && mn[dpos] == 1 |
| | 389 | if (mn[dpos] == 1 |
| 384 | 390 | && board[dpos] == color |
| 385 | 391 | && are_neighbor_dragons(pos, dpos) |
| 386 | 392 | && !mf[dpos]) { |
| 387 | 393 | |
| 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 | } |
| 392 | 399 | /* A special case |
| 393 | 400 | * |
| 394 | 401 | * . X X . |
| … |
… |
|
| 402 | 409 | * Consequently, we allow inclusion of the stones at kosumi distance |
| 403 | 410 | * in the mf (friendly) array. |
| 404 | 411 | */ |
| 405 | | if (ON_BOARD(dpos) |
| 406 | | && mn[dpos] == 2 |
| | 412 | if (mn[dpos] == 2 |
| 407 | 413 | && board[dpos] == color |
| 408 | 414 | && are_neighbor_dragons(pos, dpos) |
| 409 | 415 | && !mf[dpos]) { |
| … |
… |
|
| 412 | 418 | && mn[dpos + delta[k]] == 1 |
| 413 | 419 | && board[dpos + delta[k-4]] == EMPTY |
| 414 | 420 | && 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)) |
| 417 | 423 | mf[mpos] = 2; |
| | 424 | ) |
| 418 | 425 | } |
| 419 | 426 | } |
| 420 | | } |
| | 427 | ) |
| 421 | 428 | |
| 422 | 429 | /* determine the surround status of the dragon */ |
| 423 | 430 | |
| … |
… |
|
| 451 | 458 | } |
| 452 | 459 | |
| 453 | 460 | if (surrounded) |
| 454 | | for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) |
| | 461 | scan_board(dpos, |
| 455 | 462 | if (mf[dpos]) { |
| 456 | 463 | if (mn[dpos] == 0) { |
| 457 | 464 | surrounded = 0; |
| … |
… |
|
| 459 | 466 | } |
| 460 | 467 | else if (mn[dpos] == 2) |
| 461 | 468 | surrounded = WEAKLY_SURROUNDED; |
| 462 | | } |
| | 469 | } |
| | 470 | ) |
| 463 | 471 | |
| 464 | 472 | /* revise the status for single stone dragons. */ |
| 465 | 473 | |
| … |
… |
|
| 471 | 479 | /* revise the status if an ikken tobi jumps out. */ |
| 472 | 480 | |
| 473 | 481 | 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]) |
| 476 | 487 | continue; |
| 477 | 488 | |
| 478 | 489 | for (k = 0; k < 4; k++) { |
| … |
… |
|
| 489 | 500 | break; |
| 490 | 501 | } |
| 491 | 502 | } |
| 492 | | } |
| | 503 | ) |
| 493 | 504 | } |
| 494 | 505 | |
| 495 | 506 | if (showboard == 1 || (showboard == 2 && surrounded)) { |
| … |
… |
|
| 506 | 517 | int pos; |
| 507 | 518 | |
| 508 | 519 | *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 | ) |
| 512 | 524 | } |
| 513 | 525 | |
| 514 | 526 | return surrounded; |
| … |
… |
|
| 524 | 536 | int dist = 10000; |
| 525 | 537 | int ii; |
| 526 | 538 | |
| 527 | | for (ii = BOARDMIN; ii < BOARDMAX; ii++) |
| 528 | | if (ON_BOARD(ii) && goal[ii]) |
| | 539 | scan_board(ii, |
| | 540 | if (goal[ii]) |
| 529 | 541 | dist = gg_min(dist, square_dist(ii, pos)); |
| | 542 | ) |
| 530 | 543 | |
| 531 | 544 | return dist; |
| 532 | 545 | } |