/** * 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; }