/// <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, }); }
/// <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)); } }