/**
   * 指定したサイズ、手番で詰碁の{@link RootGameTree}を作成します。
   *
   * @param sgfSize 碁盤の大きさ
   * @param playerToPlay 次の手番
   * @return 作成した詰碁。NOT NULL
   * @throws org.unitarou.lang.NullArgumentException 引数が <code>null</code>の場合
   */
  public static RootGameTree createProblem(SgfSize sgfSize, SgfColor playerToPlay) {
    ArgumentChecker.throwIfNull(sgfSize, playerToPlay);

    RootGameTree rgt = new RootGameTree();
    rgt.setSize(sgfSize);
    rgt.setFileFormat(FileFormat.VERSION_4);
    rgt.setCharset(new SgfCharset(Charset.defaultCharset()));
    rgt.setGameMode(GameMode.IGO);
    rgt.setGameType(GameType.PROBLEM);
    rgt.setStyle(Style.SIBLINGS_SHOW_VAL);

    Node node = rgt.getSequence().getFirst();
    node.addProperty(SgfId.PLAYER_TO_PLAY.makeProperty(playerToPlay));
    return rgt;
  }
  /**
   * 指定したサイズ、置石で棋譜の{@link RootGameTree}を作成します。
   *
   * @param sgfSize 碁盤の大きさ
   * @param handicap 置石の数(0:互先, 1:定先、2:二子…)
   * @return 作成した棋譜。NOT NULL
   * @throws org.unitarou.lang.NullArgumentException 引数が <code>null</code>の場合
   * @throws IllegalArgumentException sgfSizeが正方形以外でnumberが2以上の場合
   */
  public static RootGameTree createGame(SgfSize sgfSize, Handicap handicap) {
    ArgumentChecker.throwIfNull(sgfSize, handicap);

    RootGameTree rgt = new RootGameTree();
    rgt.setSize(sgfSize);
    rgt.setFileFormat(FileFormat.VERSION_4);
    rgt.setCharset(new SgfCharset(Charset.defaultCharset()));
    rgt.setGameMode(GameMode.IGO);
    rgt.setGameType(GameType.GAME);
    rgt.setStyle(Style.SIBLINGS_SHOW_VAL);

    Node node = rgt.getSequence().getFirst();
    node.addProperty(SgfId.HANDICAP.makeProperty(handicap));
    node.addProperty(
        SgfId.PLAYER_TO_PLAY.makeProperty(
            (1 < handicap.getIntValue()) ? SgfColor.WHITE : SgfColor.BLACK));

    Set<SgfPoint> handicappedStones = composeHandicapStone(sgfSize, handicap);
    if (!handicappedStones.isEmpty()) {
      node.addProperty(SgfId.ADD_BLACK.makeProperty(handicappedStones));
    }
    return rgt;
  }