void Goban::score_area(int point_list[]) const { for (int i = 1; i <= size2; i++) { if (points[i]) { if (points[i]->get_color()) point_list[i]--; else point_list[i]++; } else { if (is_surrounded(i, WHITE)) point_list[i]--; else if (is_surrounded(i, BLACK)) point_list[i]++; } } }
float Goban::chinese_count() const { int black_score = 0, white_score = 0, eyes_result = 0; for (int i = 1; i <= size2; i++) { if (points[i]) { if (points[i]->get_color()) white_score++; else black_score++; } else { if (is_surrounded(i, BLACK)) eyes_result++; else if (is_surrounded(i, WHITE)) eyes_result--; } } return eyes_result + black_score - white_score - komi; }
bool Goban::is_virtual_eye(int point, bool color) const { if (!is_surrounded(point, color)) return false; for (int i = 0; int adj=adjacent[point][i]; i++) { if (points[adj]->has_one_liberty()) return false; } return true; }
bool Goban::is_true_eye(int point, bool color, int consider_occupied) const { int i, ncontrolled = 0; if (!is_surrounded(point, color, consider_occupied)) return false; for (i = 0; int diag=diagonals[point][i]; i++) { if (points[diag]) { if (points[diag]->get_color() == color) { ncontrolled++; } } else { if (is_surrounded(diag, color, consider_occupied)) { ncontrolled++; } } } if (i == 4) { if (ncontrolled > 2) return true; } else if (ncontrolled == i) { return true; } return false; }
bool Goban::is_virtual_eye(int point, bool color) const { if (!is_surrounded(point, color)) return false; int nopponent = 0; for (int i = 0; i < 4; i++) { if (int diag = diagonals[point][i]) { if (points[diag] && points[diag]->get_color() != color) { nopponent++; } } else { nopponent++; break; } } return nopponent < 2; }
bool GoBoard::is_virtual_eye(int point, int color) { if (!is_surrounded(point, color)) return false; int nopponent = 0; int ai = I(point); int aj = J(point); bool at_edge = false; for (int i = 0; i < 4; i++) { int bi = ai + diag_i[i]; int bj = aj + diag_j[i]; if (!on_board(bi,bj)) { at_edge = true; continue; } if( get_board(bi,bj) == OTHER_COLOR(color) ) { nopponent++; } } if(at_edge) ++nopponent; return nopponent < 2; }
void Goban::init_priors(Prior priors[]) const { const double EQUIV = size;// /2; priors[PASS].prior = 0.1*EQUIV, priors[PASS].equiv = EQUIV; for(int i = 0; i < empty_points.length(); ++i){ int p = empty_points[i]; priors[p].prior = 0.5*EQUIV, priors[p].equiv = EQUIV; } for(int i = 0; i < empty_points.length(); ++i){ int p = empty_points[i]; if(is_self_atari(p, side)){ priors[p].prior = 0.2*EQUIV, priors[p].equiv = 2*EQUIV; continue; } if(is_surrounded(p, side)){ priors[p].prior = 0.3*EQUIV, priors[p].equiv = EQUIV; continue; } priors[p].prior = 0.5*EQUIV, priors[p].equiv = EQUIV; if(size > 11){ if(distance_to_edge[p] == 0 && !stones_around(p, 4)){ priors[p].prior = 0.1*EQUIV, priors[p].equiv = EQUIV; } else if(distance_to_edge[p] == 3 && !stones_around(p, 4)){ priors[p].prior = 0.9*EQUIV, priors[p].equiv = EQUIV; } } GroupSet<4> neigh; int nneigh = neighbour_groups(p, neigh); for(int j = 0; j < nneigh; j++){ if(neigh[j]->has_one_liberty()){ if(neigh[j]->get_color() != side){ priors[p].prior = 1.4*EQUIV, priors[p].equiv = 2*EQUIV; goto endloop; } else{ priors[p].prior = 0.6*EQUIV, priors[p].equiv = EQUIV; goto endloop; } } } if(match_mogo_pattern(p, side)){ priors[p].prior = 0.9*EQUIV, priors[p].equiv = EQUIV; continue; } endloop:; } if(last_point == 0) return; PointSet<MAXSIZE2> list; capture_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 3*EQUIV, priors[list[i]].equiv += 3*EQUIV; } list.clear(); save_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 2*EQUIV, priors[list[i]].equiv += 2*EQUIV; } list.clear(); pattern_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 2*EQUIV, priors[list[i]].equiv += 2*EQUIV; } list.clear(); for(int i = 0; last_point && i < 4; i++){ for(int j = 0; j < 4*(i+1); j++){ int v = within_manhattan[last_point][i][j]; if(v) { priors[v].prior += (1.0-0.1*i)*EQUIV, priors[v].equiv += EQUIV; } } } }