RCS file: /sources/gnugo/gnugo/engine/owl.c,v
retrieving revision 1.251
diff -u -r1.251 owl.c
|
|
|
|
| 453 | 453 | sgf_dumptree = NULL; |
| 454 | 454 | if (verbose > 0) |
| 455 | 455 | verbose--; |
| 456 | | for (str = BOARDMIN; str < BOARDMAX; str++) |
| 457 | | if (ON_BOARD(str) && ms[str] && worm[str].origin == str) { |
| | 456 | scan_board(str, |
| | 457 | if (ms[str] && worm[str].origin == str) { |
| 458 | 458 | int adj; |
| 459 | 459 | int adjs[MAXCHAIN]; |
| 460 | 460 | int k; |
| … |
… |
|
| 493 | 493 | semeai_worms[s_worms++] = str; |
| 494 | 494 | DEBUG(DEBUG_SEMEAI, "semeai worm: %1m\n", str); |
| 495 | 495 | } |
| 496 | | } |
| | 496 | } |
| | 497 | ) |
| 497 | 498 | verbose = save_verbose; |
| 498 | 499 | sgf_dumptree = save_sgf_dumptree; |
| 499 | 500 | |
| … |
… |
|
| 981 | 982 | if (!you_look_alive |
| 982 | 983 | && !safe_outside_liberty_found && moves[0].value < 110) { |
| 983 | 984 | int pos; |
| 984 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 985 | | if (!ON_BOARD(pos)) |
| 986 | | continue; |
| | 985 | scan_board(pos, |
| 987 | 986 | |
| 988 | 987 | if (board[pos] == EMPTY && !mw[pos]) { |
| 989 | 988 | if (liberty_of_goal(pos, owlb)) { |
| … |
… |
|
| 1010 | 1009 | } |
| 1011 | 1010 | } |
| 1012 | 1011 | } |
| 1013 | | } |
| | 1012 | ) |
| 1014 | 1013 | } |
| 1015 | 1014 | |
| 1016 | 1015 | /* Add the best liberty filling move available. We first want to |
| … |
… |
|
| 1516 | 1515 | /* Never try to fill opponent's eyes which contain our dragon. This |
| 1517 | 1516 | * is nothing else than suicide. |
| 1518 | 1517 | */ |
| 1519 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 1520 | | if (ON_BOARD(pos) && owla->goal[pos]) |
| | 1518 | scan_board(pos, |
| | 1519 | if (owla->goal[pos]) |
| 1521 | 1520 | mw[owlb->my_eye[pos].origin] = 0; |
| 1522 | | } |
| | 1521 | ) |
| 1523 | 1522 | |
| 1524 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1523 | scan_board(pos, |
| 1525 | 1524 | if (board[pos] == EMPTY) { |
| 1526 | 1525 | int origin = owlb->my_eye[pos].origin; |
| 1527 | 1526 | |
| … |
… |
|
| 1546 | 1545 | return pos; |
| 1547 | 1546 | } |
| 1548 | 1547 | } |
| 1549 | | } |
| | 1548 | ) |
| 1550 | 1549 | |
| 1551 | 1550 | return NO_MOVE; |
| 1552 | 1551 | } |
| … |
… |
|
| 1573 | 1572 | ASSERT1(board[move] == EMPTY, move); |
| 1574 | 1573 | verbose = 0; |
| 1575 | 1574 | if (safe_move(move, color)) { |
| 1576 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1575 | scan_board(pos, |
| 1577 | 1576 | if (IS_STONE(board[pos]) |
| 1578 | 1577 | && pos == find_origin(pos)) { |
| 1579 | 1578 | if (owla->goal[pos]) |
| … |
… |
|
| 1581 | 1580 | if (owlb->goal[pos]) |
| 1582 | 1581 | net += 100*countlib(pos); |
| 1583 | 1582 | } |
| 1584 | | } |
| | 1583 | ) |
| 1585 | 1584 | if (!trymove(move, color, NULL, 0)) { |
| 1586 | 1585 | verbose = save_verbose; |
| 1587 | 1586 | return 0; |
| 1588 | 1587 | } |
| 1589 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 1588 | scan_board(pos, |
| 1590 | 1589 | if (IS_STONE(board[pos]) |
| 1591 | 1590 | && pos == find_origin(pos)) { |
| 1592 | 1591 | if (owla->goal[pos] |
| … |
… |
|
| 1595 | 1594 | if (owlb->goal[pos]) |
| 1596 | 1595 | net -= 100*countlib(pos); |
| 1597 | 1596 | } |
| 1598 | | } |
| | 1597 | ) |
| 1599 | 1598 | |
| 1600 | 1599 | increase_depth_values(); |
| 1601 | 1600 | for (k = 0; k < s_worms; k++) { |
| … |
… |
|
| 2360 | 2359 | */ |
| 2361 | 2360 | |
| 2362 | 2361 | if (board[target] == EMPTY) { |
| 2363 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 2362 | scan_board(pos, |
| 2364 | 2363 | if (IS_STONE(board[pos]) && owl->goal[pos] == 1) { |
| 2365 | 2364 | origin = find_origin(pos); |
| 2366 | 2365 | break; |
| 2367 | 2366 | } |
| 2368 | | } |
| | 2367 | ) |
| 2369 | 2368 | |
| 2370 | 2369 | if (origin == NO_MOVE |
| 2371 | 2370 | || do_owl_attack(origin, NULL, NULL, owl, 0)) { |
| … |
… |
|
| 2655 | 2654 | |
| 2656 | 2655 | /* If the goal is small, try a tactical defense. */ |
| 2657 | 2656 | |
| 2658 | | for (k = BOARDMIN; k < BOARDMAX; k++) |
| 2659 | | if (ON_BOARD(k)) |
| 2660 | | goalcount += owl->goal[k]; |
| | 2657 | scan_board(k, |
| | 2658 | goalcount += owl->goal[k]; |
| | 2659 | ) |
| 2661 | 2660 | |
| 2662 | 2661 | if (goalcount < 5) { |
| 2663 | 2662 | |
| … |
… |
|
| 3087 | 3086 | owl_find_relevant_eyespaces(owl, mw, mz); |
| 3088 | 3087 | |
| 3089 | 3088 | /* Reset halfeye data. Set topological eye value to something big. */ |
| 3090 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 3091 | | if (ON_BOARD(pos)) { |
| 3092 | | owl->half_eye[pos].type = 0; |
| 3093 | | owl->half_eye[pos].value = 10.0; |
| 3094 | | } |
| 3095 | | } |
| | 3089 | scan_board(pos, |
| | 3090 | owl->half_eye[pos].type = 0; |
| | 3091 | owl->half_eye[pos].value = 10.0; |
| | 3092 | ) |
| 3096 | 3093 | |
| 3097 | 3094 | /* Find topological half eyes and false eyes. */ |
| 3098 | 3095 | find_half_and_false_eyes(color, eye, owl->half_eye, mw); |
| … |
… |
|
| 3106 | 3103 | |
| 3107 | 3104 | set_eyevalue(probable_eyes, 0, 0, 0, 0); |
| 3108 | 3105 | |
| 3109 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| 3110 | | if (ON_BOARD(pos) && mw[pos] > 1) { |
| | 3106 | scan_board(pos, |
| | 3107 | if (mw[pos] > 1) { |
| 3111 | 3108 | int value = 0; |
| 3112 | 3109 | const char *reason = ""; |
| 3113 | 3110 | compute_eyes_pessimistic(pos, &eyevalue, &pessimistic_min, |
| … |
… |
|
| 3132 | 3129 | * that the pessimistic min is 0. |
| 3133 | 3130 | */ |
| 3134 | 3131 | if (pessimistic_min > 0) { |
| 3135 | | for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) { |
| 3136 | | if (ON_BOARD(pos2) |
| 3137 | | && eye[pos2].origin == pos |
| | 3132 | scan_board(pos2, |
| | 3133 | if (eye[pos2].origin == pos |
| 3138 | 3134 | && owl->inessential[pos2]) { |
| 3139 | 3135 | pessimistic_min = 0; |
| 3140 | 3136 | break; |
| 3141 | 3137 | } |
| 3142 | | } |
| | 3138 | ) |
| 3143 | 3139 | } |
| 3144 | 3140 | #endif |
| 3145 | 3141 | |
| … |
… |
|
| 3263 | 3259 | } |
| 3264 | 3260 | num_eyes++; |
| 3265 | 3261 | } |
| 3266 | | } |
| | 3262 | ) |
| 3267 | 3263 | |
| 3268 | 3264 | /* Sniff each lunch for nutritional value. The assumption is that |
| 3269 | 3265 | * capturing the lunch is gote, therefore the number of half eyes |
| … |
… |
|
| 3411 | 3407 | |
| 3412 | 3408 | memset(mw, 0, BOARDMAX * sizeof(mw[0])); |
| 3413 | 3409 | memset(mz, 0, BOARDMAX * sizeof(mz[0])); |
| 3414 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 3410 | scan_board(pos, |
| 3415 | 3411 | if (board[pos] == owl->color) { |
| 3416 | 3412 | for (k = 0; k < 8; k++) { |
| 3417 | 3413 | int pos2 = pos + delta[k]; |
| … |
… |
|
| 3425 | 3421 | } |
| 3426 | 3422 | } |
| 3427 | 3423 | } |
| 3428 | | } |
| | 3424 | ) |
| 3429 | 3425 | } |
| 3430 | 3426 | |
| 3431 | 3427 | /* Case 1. |
| … |
… |
|
| 4037 | 4033 | * and calculate initial chain values (as if all patterns passed |
| 4038 | 4034 | * constraint validation). |
| 4039 | 4035 | */ |
| 4040 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 4036 | scan_board(pos, |
| 4041 | 4037 | if (list->first_pattern_index[pos] != -1) { |
| 4042 | 4038 | struct matched_pattern_data *pattern_data |
| 4043 | 4039 | = &list->pattern_list[list->first_pattern_index[pos]]; |
| … |
… |
|
| 4045 | 4041 | pattern_data->value = valuate_combinable_pattern_chain(list, pos); |
| 4046 | 4042 | list->pattern_heap[list->heap_num_patterns++] = pattern_data; |
| 4047 | 4043 | } |
| 4048 | | } |
| | 4044 | ) |
| 4049 | 4045 | |
| 4050 | 4046 | if (list->heap_num_patterns > 0) |
| 4051 | 4047 | pattern_list_build_heap(list); |
| … |
… |
|
| 4579 | 4575 | ASSERT1(bpos == NO_MOVE || board[bpos] == color, bpos); |
| 4580 | 4576 | |
| 4581 | 4577 | if (new_dragons == NULL) { |
| 4582 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 4583 | | if (ON_BOARD(pos)) { |
| 4584 | | if (is_same_dragon(pos, apos) || is_same_dragon(pos, bpos)) |
| 4585 | | owl->goal[pos] = 1; |
| 4586 | | else |
| 4587 | | owl->goal[pos] = 0; |
| 4588 | | } |
| | 4578 | scan_board(pos, |
| | 4579 | if (is_same_dragon(pos, apos) || is_same_dragon(pos, bpos)) |
| | 4580 | owl->goal[pos] = 1; |
| | 4581 | else |
| | 4582 | owl->goal[pos] = 0; |
| | 4583 | ) |
| 4589 | 4584 | } |
| 4590 | 4585 | else { |
| 4591 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 4592 | | if (ON_BOARD(pos)) { |
| 4593 | | if (IS_STONE(board[pos]) |
| 4594 | | && (new_dragons[pos] == new_dragons[apos] |
| 4595 | | || new_dragons[pos] == new_dragons[bpos])) |
| 4596 | | owl->goal[pos] = 1; |
| 4597 | | else |
| 4598 | | owl->goal[pos] = 0; |
| 4599 | | } |
| | 4586 | scan_board(pos, |
| | 4587 | if (IS_STONE(board[pos]) |
| | 4588 | && (new_dragons[pos] == new_dragons[apos] |
| | 4589 | || new_dragons[pos] == new_dragons[bpos])) |
| | 4590 | owl->goal[pos] = 1; |
| | 4591 | else |
| | 4592 | owl->goal[pos] = 0; |
| | 4593 | ) |
| 4600 | 4594 | } |
| 4601 | 4595 | |
| 4602 | 4596 | memcpy(owl->cumulative_goal, owl->goal, sizeof(owl->goal)); |
| … |
… |
|
| 4617 | 4611 | |
| 4618 | 4612 | ASSERT1(bpos == NO_MOVE || board[bpos] == color, bpos); |
| 4619 | 4613 | |
| 4620 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 4621 | | if (ON_BOARD(pos)) { |
| | 4614 | scan_board(pos, |
| 4622 | 4615 | if (is_same_worm(pos, apos) || is_same_worm(pos, bpos)) |
| 4623 | 4616 | owl->goal[pos] = 1; |
| 4624 | 4617 | else |
| 4625 | 4618 | owl->goal[pos] = 0; |
| 4626 | | } |
| | 4619 | ) |
| 4627 | 4620 | |
| 4628 | 4621 | owl->color = color; |
| 4629 | 4622 | } |
| … |
… |
|
| 4645 | 4638 | memset(owl->neighbors, 0, sizeof(owl->neighbors)); |
| 4646 | 4639 | |
| 4647 | 4640 | /* Find all friendly neighbors of the dragon in goal. */ |
| 4648 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 4641 | scan_board(pos, |
| 4649 | 4642 | if (board[pos] == color && owl->goal[pos]) { |
| 4650 | 4643 | for (k = 0; k < 4; k++) { |
| 4651 | 4644 | if (board[pos + delta[k]] == EMPTY |
| … |
… |
|
| 4664 | 4657 | mark_string(pos2, owl->neighbors, 1); |
| 4665 | 4658 | } |
| 4666 | 4659 | } |
| 4667 | | } |
| | 4660 | ) |
| 4668 | 4661 | |
| 4669 | 4662 | /* First find all boundary strings (including those adjacent not to |
| 4670 | 4663 | * the goal dragon, but one of its neighbors). |
| 4671 | 4664 | */ |
| 4672 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| | 4665 | scan_board(pos, |
| 4673 | 4666 | if (board[pos] == other && !owl->boundary[pos]) { |
| 4674 | 4667 | for (k = 0; k < 8; k++) |
| 4675 | 4668 | if (ON_BOARD(pos + delta[k]) |
| … |
… |
|
| 4677 | 4670 | mark_string(pos, owl->boundary, 1); |
| 4678 | 4671 | break; |
| 4679 | 4672 | } |
| 4680 | | } |
| | 4673 | } |
| | 4674 | ) |
| 4681 | 4675 | |
| 4682 | 4676 | /* Upgrade the mark of a boundary string if it adjoins a safe |
| 4683 | 4677 | * friendly dragon. |
| 4684 | 4678 | */ |
| 4685 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| | 4679 | scan_board(pos, |
| 4686 | 4680 | if (owl->boundary[pos] == 1) { |
| 4687 | 4681 | for (k = 0; k < 8; k++) { |
| 4688 | 4682 | int pos2 = pos + delta[k]; |
| … |
… |
|
| 4695 | 4689 | break; |
| 4696 | 4690 | } |
| 4697 | 4691 | } |
| 4698 | | } |
| | 4692 | } |
| | 4693 | ) |
| 4699 | 4694 | |
| 4700 | 4695 | /* During the owl reading, stones farther away may become parts of |
| 4701 | 4696 | * the boundary. We mark those strings neighboring some other |
| 4702 | 4697 | * friendly dragon with boundary value 2 right away, since we have |
| 4703 | 4698 | * no mechanism for detecting this later. |
| 4704 | 4699 | */ |
| 4705 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| | 4700 | scan_board(pos, |
| 4706 | 4701 | if (board[pos] == other && owl->boundary[pos] == 0) { |
| 4707 | 4702 | /* If a lunch has been amalgamated into a larger dragon, we |
| 4708 | 4703 | * have to back out now. |
| … |
… |
|
| 4729 | 4724 | break; |
| 4730 | 4725 | } |
| 4731 | 4726 | } |
| 4732 | | } |
| | 4727 | } |
| | 4728 | ) |
| 4733 | 4729 | } |
| 4734 | 4730 | |
| 4735 | 4731 | /* Add the stone just played to the goal dragon if same_dragon is |
| … |
… |
|
| 4981 | 4977 | /* Now put each goal string to the component to which it has the |
| 4982 | 4978 | * smallest distance. |
| 4983 | 4979 | */ |
| 4984 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 4980 | scan_board(pos, |
| 4985 | 4981 | int closest_dist = HUGE_CONNECTION_DISTANCE; |
| 4986 | 4982 | int closest_component = -1; |
| 4987 | 4983 | if (board[pos] != color || !goal[pos]) |
| … |
… |
|
| 4999 | 4995 | mark_string(pos, component2, closest_component); |
| 5000 | 4996 | component_size[closest_component] += countstones(pos); |
| 5001 | 4997 | } |
| 5002 | | } |
| | 4998 | ) |
| 5003 | 4999 | |
| 5004 | 5000 | /* Now find the biggest_component. */ |
| 5005 | 5001 | { |
| … |
… |
|
| 5013 | 5009 | } |
| 5014 | 5010 | |
| 5015 | 5011 | /* Now delete everything except the biggest component from the goal. */ |
| 5016 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| | 5012 | scan_board(pos, |
| 5017 | 5013 | if (component2[pos] != biggest_component) |
| 5018 | | goal[pos] = 0; |
| | 5014 | goal[pos] = 0; |
| | 5015 | ) |
| | 5016 | |
| 5019 | 5017 | if (debug & DEBUG_SPLIT_OWL) { |
| 5020 | 5018 | gprintf("Split dragon. Biggest component is %d (of %d).\n", |
| 5021 | 5019 | biggest_component, num_components); |
| … |
… |
|
| 5065 | 5063 | goaldump(const signed char goal[BOARDMAX]) |
| 5066 | 5064 | { |
| 5067 | 5065 | int pos; |
| 5068 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 5069 | | if (ON_BOARD(pos) && goal[pos]) |
| | 5066 | scan_board(pos, |
| | 5067 | if (goal[pos]) |
| 5070 | 5068 | gprintf("%o%1m (%d) ", pos, (int) goal[pos]); |
| | 5069 | ) |
| 5071 | 5070 | gprintf("\n"); |
| 5072 | 5071 | } |
| 5073 | 5072 | |
| … |
… |
|
| 5075 | 5074 | componentdump(const signed char component[BOARDMAX]) |
| 5076 | 5075 | { |
| 5077 | 5076 | int pos; |
| 5078 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 5079 | | if (ON_BOARD(pos) && component[pos] != -1) |
| | 5077 | scan_board(pos, |
| | 5078 | if (component[pos] != -1) |
| 5080 | 5079 | gprintf("%o%1m (%d) ", pos, (int) component[pos]); |
| | 5080 | ) |
| 5081 | 5081 | gprintf("\n"); |
| 5082 | 5082 | } |
| 5083 | 5083 | |
| … |
… |
|
| 5133 | 5133 | { |
| 5134 | 5134 | int pos; |
| 5135 | 5135 | |
| 5136 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 5136 | scan_board(pos, |
| 5137 | 5137 | if (!IS_STONE(board[pos]) |
| 5138 | 5138 | || dragon[pos].origin != pos) |
| 5139 | 5139 | continue; |
| … |
… |
|
| 5316 | 5316 | "owl: %1m might defend the uncertain dragon at %1m at move %d\n", |
| 5317 | 5317 | DRAGON2(pos).owl_attack_point, pos, movenum+1); |
| 5318 | 5318 | } |
| 5319 | | } |
| | 5319 | ) |
| 5320 | 5320 | } |
| 5321 | 5321 | |
| 5322 | 5322 | /* Use the owl code to determine whether the move at (move) makes |
| … |
… |
|
| 5732 | 5732 | memset(owl->inessential, 0, sizeof(owl->inessential)); |
| 5733 | 5733 | |
| 5734 | 5734 | memset(already_checked, 0, sizeof(already_checked)); |
| 5735 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) { |
| | 5735 | scan_board(pos, |
| 5736 | 5736 | if (board[pos] == color && owl->goal[pos]) { |
| 5737 | 5737 | /* Loop over the eight neighbors. */ |
| 5738 | 5738 | for (k = 0; k < 8; k++) { |
| … |
… |
|
| 5870 | 5870 | } |
| 5871 | 5871 | } |
| 5872 | 5872 | } |
| 5873 | | } |
| | 5873 | ) |
| 5874 | 5874 | |
| 5875 | 5875 | owl->lunches_are_current = 1; |
| 5876 | 5876 | sgf_dumptree = save_sgf_dumptree; |
| … |
… |
|
| 6448 | 6448 | select_new_goal_origin(int origin, struct local_owl_data *owl) |
| 6449 | 6449 | { |
| 6450 | 6450 | int pos; |
| 6451 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| | 6451 | scan_board(pos, |
| 6452 | 6452 | if (board[pos] == owl->color && owl->goal[pos] == 1) |
| 6453 | 6453 | return find_origin(pos); |
| | 6454 | ) |
| 6454 | 6455 | |
| 6455 | 6456 | return origin; |
| 6456 | 6457 | } |
| … |
… |
|
| 6527 | 6528 | compute_escape_influence(owl->color, safe_stones, owl->goal, NULL, |
| 6528 | 6529 | escape_values); |
| 6529 | 6530 | |
| 6530 | | for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) { |
| 6531 | | if (ON_BOARD(pos2)) |
| 6532 | | dragon[pos2] = is_same_dragon(pos2, pos); |
| 6533 | | } |
| | 6531 | scan_board(pos2, |
| | 6532 | dragon[pos2] = is_same_dragon(pos2, pos); |
| | 6533 | ) |
| 6534 | 6534 | |
| 6535 | 6535 | if (dragon_escape(dragon, owl->color, escape_values) > 5) |
| 6536 | 6536 | owl->escape_values[pos] = 4; |
| … |
… |
|
| 6731 | 6731 | signed char modified_escape[BOARDMAX]; |
| 6732 | 6732 | int pos; |
| 6733 | 6733 | memcpy(modified_escape, owl->escape_values, sizeof(modified_escape)); |
| 6734 | | for (pos = BOARDMIN; pos < BOARDMAX; pos++) |
| 6735 | | if (ON_BOARD(pos) && owl->cumulative_goal[pos]) |
| | 6734 | scan_board(pos, |
| | 6735 | if (owl->cumulative_goal[pos]) |
| 6736 | 6736 | modified_escape[pos] = 0; |
| | 6737 | ) |
| 6737 | 6738 | return dragon_escape(owl->goal, owl->color, modified_escape); |
| 6738 | 6739 | } |
| 6739 | 6740 | |
| … |
… |
|
| 6863 | 6864 | for (k = 0; k < MAX_GOAL_WORMS; k++) |
| 6864 | 6865 | goal_worm[k] = NO_MOVE; |
| 6865 | 6866 | |
| 6866 | | for (pos = BOARDMIN; pos < BOARDMAX && w < MAX_GOAL_WORMS; pos++) { |
| 6867 | | if (ON_BOARD(pos) |
| 6868 | | && board[pos] |
| | 6867 | scan_board(pos, |
| | 6868 | if (w >= MAX_GOAL_WORMS) |
| | 6869 | break; |
| | 6870 | if (board[pos] |
| 6869 | 6871 | && owl->goal[pos] == 1) { |
| 6870 | 6872 | int origin = find_origin(pos); |
| 6871 | 6873 | for (k = 0; k < w; k++) |
| … |
… |
|
| 6874 | 6876 | if (k == w) |
| 6875 | 6877 | goal_worm[w++] = pos; |
| 6876 | 6878 | } |
| 6877 | | } |
| | 6879 | ) |
| 6878 | 6880 | |
| 6879 | 6881 | /* experimental: let's try to fill up the array with other neighboring |
| 6880 | 6882 | * opponent worms |
| … |
… |
|
| 6887 | 6889 | if (DRAGON(d).color != owl->color) |
| 6888 | 6890 | continue; |
| 6889 | 6891 | |
| 6890 | | for (ii = BOARDMIN; ii < BOARDMAX && w < MAX_GOAL_WORMS; ii++) |
| 6891 | | if (ON_BOARD(ii) && board[ii] && worm[ii].origin == ii |
| | 6892 | scan_board(ii, |
| | 6893 | if (w >= MAX_GOAL_WORMS) |
| | 6894 | break; |
| | 6895 | if (board[ii] && worm[ii].origin == ii |
| 6892 | 6896 | && worm[ii].size >= 3 && dragon[ii].id == d) |
| 6893 | | goal_worm[w++] = ii; |
| 6894 | | } |
| | 6897 | goal_worm[w++] = ii; |
| | 6898 | ) |
| | 6899 | } |
| 6895 | 6900 | } |
| 6896 | 6901 | |
| 6897 | 6902 | return w; |
| … |
… |
|
| 6946 | 6951 | for (k = 0; k < MAX_WORMS; k++) |
| 6947 | 6952 | goal_worm[k] = NO_MOVE; |
| 6948 | 6953 | |
| 6949 | | for (pos = BOARDMIN; pos < BOARDMAX && worms < MAX_WORMS; pos++) |
| 6950 | | if (ON_BOARD(pos) |
| 6951 | | && board[pos] |
| | 6954 | scan_board(pos, |
| | 6955 | if (worms >= MAX_WORMS) |
| | 6956 | break; |
| | 6957 | if (board[pos] |
| 6952 | 6958 | && (owl->goal)[pos]) { |
| 6953 | 6959 | int origin = find_origin(pos); |
| 6954 | 6960 | if (pos == origin) { |
| … |
… |
|
| 6957 | 6963 | } |
| 6958 | 6964 | goal_worm[worms++] = pos; |
| 6959 | 6965 | } |
| 6960 | | } |
| | 6966 | } |
| | 6967 | ) |
| 6961 | 6968 | return worms; |
| 6962 | 6969 | } |
| 6963 | 6970 | #endif |