/// <summary> /// 持ち駒を読み込みます。 /// </summary> private static void ParseHand(Board board, string sfen) { if (sfen[0] == '-') { // 何もする必要がありません。 return; } var count = 0; foreach (var c in sfen) { if ('0' <= c && c <= '9') { // 10と数字が並ぶ可能性があります。 count = count * 10 + (c - '0'); } else { var piece = SfenUtil.SfenToPiece(c); if (piece == null) { throw new SfenException( "SFEN形式の持ち駒'" + c + "'が正しくありません。"); } // 持ち駒の数は0以上に合わせます。 var pcount = Math.Max(count, 1); board.SetHand(piece.PieceType, piece.BWType, pcount); count = 0; } } }
/// <summary> /// 持ち駒を読み込みます。 /// </summary> private static void ParseHand(Board board, string sfen) { if (sfen[0] == '-') { // 何もする必要がありません。 return; } var count = 1; foreach (var c in sfen) { if ('1' <= c && c <= '9') { count = c - '0'; } else { var piece = SfenUtil.SfenToPiece(c); if (piece == null) { throw new SfenException( "SFEN形式の持ち駒'" + c + "'が正しくありません。"); } board.SetHand(piece.PieceType, piece.BWType, count); count = 1; } } }
/// <summary> /// 局面を読み込みます。 /// </summary> private static void ParseBoard0(Board board, string sfen) { var rank = 1; var file = 9; var promoted = false; foreach (var c in sfen) { if (rank > 9) { throw new SfenException( "局面の段数が9を超えます。"); } if (c == '/') { if (file != 0) { throw new SfenException( "SFEN形式の" + rank + "段の駒数が合いません。"); } rank += 1; file = 9; promoted = false; } else if (c == '+') { promoted = true; } else if ('1' <= c && c <= '9') { file -= (c - '0'); promoted = false; } else { if (file < 1) { throw new SfenException( "SFEN形式の" + rank + "段の駒数が多すぎます。"); } var piece = SfenUtil.SfenToPiece(c); if (piece == null) { throw new SfenException( "SFEN形式の駒'" + c + "'が正しくありません。"); } var type = piece.PieceType; if (promoted && type != PieceType.Gyoku && type != PieceType.Kin) { piece = new BoardPiece(piece.PieceType, promoted, piece.BWType); } board[file, rank] = piece; file -= 1; promoted = false; } } if (file != 0) { throw new SfenException( "SFEN形式の" + rank + "段の駒数が合いません。"); } }