Esempio n. 1
0
        /// <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;
                }
            }
        }
Esempio n. 2
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;
                }
            }
        }
Esempio n. 3
0
        /// <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 + "段の駒数が合いません。");
            }
        }