Exemple #1
0
        /// <summary>
        /// 落とす駒をパースします。
        /// </summary>
        /// <remarks>
        /// 00OU など4文字形式の駒をパースします。
        /// </remarks>
        private PieceSquare ParsePiece(string str)
        {
            var file     = (int)(str[0] - '0');
            var rank     = (int)(str[1] - '0');
            var pieceStr = str.Substring(2);
            var piece    = CsaUtil.StrToPiece(pieceStr);

            if (piece == null)
            {
                throw new ShogiException(
                          str + ": CSA形式の駒を正しく読み込めませんでした。");
            }

            return(new PieceSquare
            {
                Square = new Square(file, rank),
                Piece = piece,
            });
        }
Exemple #2
0
        /// <summary>
        /// CSA形式の指し手を解析します。
        /// </summary>
        public static Move CsaToMove(this Board board, string csa)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            if (string.IsNullOrEmpty(csa))
            {
                throw new ArgumentNullException("csa");
            }

            // 特殊な指し手
            var smove = board.CsaToSpecialMove(csa);

            if (smove != null)
            {
                return(smove);
            }

            // 普通の指し手
            var m = MoveRegex.Match(csa);

            if (!m.Success)
            {
                return(null);
            }

            var c    = m.Groups[1].Value;
            var side = (
                c == "+" ? BWType.Black :
                c == "-" ? BWType.White :
                BWType.None);

            // 移動前の位置
            var srcFile   = int.Parse(m.Groups[2].Value);
            var srcRank   = int.Parse(m.Groups[3].Value);
            var srcSquare =
                (srcFile == 0 || srcRank == 0
                ? (Square)null
                : new Square(srcFile, srcRank));

            // 移動後の位置
            var dstFile   = int.Parse(m.Groups[4].Value);
            var dstRank   = int.Parse(m.Groups[5].Value);
            var dstSquare =
                (dstFile == 0 || dstRank == 0
                ? (Square)null
                : new Square(dstFile, dstRank));

            // 駒
            var piece = CsaUtil.StrToPiece(m.Groups[6].Value);

            if (piece == null || piece.PieceType == PieceType.None)
            {
                return(null);
            }

            if (srcSquare == null)
            {
                // 駒打ちの場合
                return(Move.CreateDrop(side, dstSquare, piece.PieceType));
            }
            else
            {
                // 駒の移動の場合、成りの判定を行います。
                var srcPiece = board[srcSquare];
                if (srcPiece == null || !srcPiece.Validate())
                {
                    return(null);
                }

                // CSA形式の場合、駒が成ると駒の種類が変わります。
                var isPromote = (!srcPiece.IsPromoted && piece.IsPromoted);
                if (isPromote)
                {
                    piece = new Piece(piece.PieceType, false);
                }

                return(Move.CreateMove(side, srcSquare, dstSquare, piece, isPromote));
            }
        }