| 1150 | | if (move) { |
| 1151 | | owl_add_move(moves, move, 70, "eyespace filling", |
| 1152 | | SAME_DRAGON_NOT_CONNECTED, NO_MOVE, |
| 1153 | | 0, NO_MOVE, MAX_SEMEAI_MOVES, NULL); |
| 1154 | | } |
| 1155 | | } |
| 1156 | | |
| 1157 | | if (moves[0].pos == NO_MOVE) |
| 1158 | | TRACE("No move found\n"); |
| 1159 | | } |
| 1160 | | |
| 1667 | | /* Propose an eyespace filling move. Such a move can, for instance, |
| 1668 | | * add a stone to opponent's "bulky five" shape. We of course choose |
| 1669 | | * a move that doesn't allow opponent to turn his dead eyeshape into a |
| 1670 | | * two eyes eyeshape. E.g. in this position, the function will |
| 1671 | | * propose the move at '*', not at the '.': |
| 1672 | | * |
| 1673 | | * XXX |
| 1674 | | * XXOX |
| 1675 | | * XOOX |
| 1676 | | * X.*X |
| 1677 | | * ---- |
| 1678 | | */ |
| 1679 | | static int |
| 1680 | | semeai_propose_eyespace_filling_move(struct local_owl_data *owla, |
| 1681 | | struct local_owl_data *owlb) |
| 1682 | | { |
| 1683 | | int color = OTHER_COLOR(owlb->color); |
| 1684 | | int pos; |
| 1685 | | int mw[BOARDMAX]; |
| 1686 | | int mz[BOARDMAX]; |
| 1687 | | |
| 1688 | | owl_find_relevant_eyespaces(owlb, mw, mz); |
| 1689 | | |
| 1690 | | /* Never try to fill opponent's eyes which contain our dragon. This |
| 1691 | | * is nothing else than suicide. |
| 1692 | | */ |
| 1693 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1694 | | if (ON_BOARD(pos) && owla->goal[pos]) |
| 1695 | | mw[owlb->my_eye[pos].origin] = 0; |
| 1696 | | } |
| 1697 | | |
| 1698 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1699 | | if (board[pos] == EMPTY) { |
| 1700 | | int origin = owlb->my_eye[pos].origin; |
| 1701 | | |
| 1702 | | if (mw[origin] > 1 |
| 1703 | | && min_eyes(&owlb->my_eye[origin].value) == 1) { |
| 1704 | | int good_move = 0; |
| 1705 | | |
| 1706 | | if (trymove(pos, color, "eyespace_filling", NO_MOVE)) { |
| 1707 | | struct eyevalue new_value; |
| 1708 | | int dummy_attack; |
| 1709 | | int dummy_defense; |
| 1710 | | |
| 1711 | | compute_eyes(origin, &new_value, &dummy_attack, &dummy_defense, |
| 1712 | | owlb->my_eye, owlb->half_eye, 0); |
| 1713 | | if (max_eyes(&new_value) <= 1) |
| 1714 | | good_move = 1; |
| 1715 | | |
| 1716 | | popgo(); |
| 1717 | | } |
| 1718 | | |
| 1719 | | if (good_move) |
| 1720 | | return pos; |
| 1721 | | } |
| 1722 | | } |
| 1723 | | } |
| 1724 | | |
| 1725 | | return NO_MOVE; |
| 1726 | | } |
| 1727 | | |
| 1728 | | |