Example #1
0
  /**
   * pointがこのグループに接続可能 (上下左右の何れかに近接している)な場合のみ、 pointを追加してtrueを返します。<br>
   * lifePointsはpointの活点でpointの隣接点で他に石が存在しない集合です。
   *
   * @param point
   * @param lifePoints
   * @return 隣接している場合にtrue
   */
  boolean add(SgfPoint point, Collection<SgfPoint> lifePoints) {
    ArgumentChecker.throwIfNull(point, lifePoints);

    if (!size_.equals(point.size())) {
      throw new IllegalArgumentException(
          "Bad size " + size_ + "!=" + point.size()); // $NON-NLS-1$//$NON-NLS-2$
    }

    if (!lifePoints_.contains(point) && !lifePoints_.isEmpty()) {
      return false;
    }
    stones_.add(point);

    // 同じグループの石が無ければ、隣接点として登録する。
    for (SgfPoint neighbor : point.neighbors()) {
      if (!stones_.contains(neighbor)) {
        neighbors_.add(neighbor);
      }
    }

    // 活点を更新する。
    // 石が置かれるところの活点は削除し、
    // その石の活点をこのグループに追加する。
    lifePoints_.remove(point);
    for (SgfPoint lifePoint : lifePoints) {
      if (stones_.contains(lifePoint)) {
        throw new IllegalArgumentException(
            lifePoint
                + " does not touch this group" //$NON-NLS-1$
                + BasicFormatter.format(stones_));
      }
      lifePoints_.add(lifePoint);
    }
    return true;
  }
  /**
   * 引数の条件に合致した置き石を返します。
   *
   * @param sgfSize
   * @param handicap
   * @throws IllegalArgumentException sgfSizeが正方形以外でnumberが2以上の場合
   * @return 置き石の座標。NOT NULL
   */
  private static Set<SgfPoint> composeHandicapStone(SgfSize sgfSize, Handicap handicap) {
    int hd = handicap.getIntValue();
    if (hd < 2) {
      return Collections.emptySet();
    }

    if (sgfSize.width() != sgfSize.height()) {
      throw new IllegalArgumentException();
    }

    Set<SgfPoint> pointSet = new HashSet<SgfPoint>(9);

    final int size = sgfSize.width();
    int left = size + 1, middle = size + 1, right = size + 1;

    if (size < 9) {
      left = size / 5 + 1;
      right = size - left + 1;
      middle = size / 2 + 1;

    } else if (size < 13) {
      left = 3;
      right = size - left + 1;
      middle = size / 2 + 1;
    } else {
      left = 4;
      right = size - left + 1;
      middle = size / 2 + 1;
    }

    switch (hd) {
      case 9:
        pointSet.add(SgfPoint.create(sgfSize, middle, left));
        pointSet.add(SgfPoint.create(sgfSize, middle, right));

      case 7:
        pointSet.add(SgfPoint.create(sgfSize, right, middle));
        pointSet.add(SgfPoint.create(sgfSize, left, middle));

      case 5:
        pointSet.add(SgfPoint.create(sgfSize, middle, middle));

      case 4:
        pointSet.add(SgfPoint.create(sgfSize, right, right));

      case 3:
        pointSet.add(SgfPoint.create(sgfSize, left, left));

      case 2:
        pointSet.add(SgfPoint.create(sgfSize, right, left));
        pointSet.add(SgfPoint.create(sgfSize, left, right));
        break;

      case 8:
        pointSet.add(SgfPoint.create(sgfSize, middle, left));
        pointSet.add(SgfPoint.create(sgfSize, middle, right));

      case 6:
        pointSet.add(SgfPoint.create(sgfSize, right, middle));
        pointSet.add(SgfPoint.create(sgfSize, left, middle));
        pointSet.add(SgfPoint.create(sgfSize, right, right));
        pointSet.add(SgfPoint.create(sgfSize, left, left));
        pointSet.add(SgfPoint.create(sgfSize, right, left));
        pointSet.add(SgfPoint.create(sgfSize, left, right));
    }

    return pointSet;
  }