Exemplo n.º 1
0
 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]++;
    }
  }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;   
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
      }
    }
  }
  
}