/** * 引数の条件に合致した置き石を返します。 * * @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; }