示例#1
0
        /// <summary>
        /// 与えられた指し手が着手可能か調べ、もし着手可能な場合はそれを正式な表記に変換します。
        /// </summary>
        /// <remarks>
        /// 「正式な表記」にするとは、たとえば不要な「打」を削除したり、
        /// 右や直などの表記を正確なものに修正することです。
        /// </remarks>
        public static LiteralMove NormalizeMove(this Board board, LiteralMove lmove)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            if (!board.Validate())
            {
                throw new ArgumentException("board");
            }

            if (lmove == null)
            {
                throw new ArgumentNullException("lmove");
            }

            if (!lmove.Validate())
            {
                throw new ArgumentException("lmove");
            }

            // 投了などの特殊な指し手は常にさせることにします。

            /*if (move.IsSpecialMove)
             * {
             *  return move;
             * }*/

            // 一度、指し手の正規化を行います(打を消したり、左を追加するなど)
            // あり得る指し手が複数ある場合は失敗とします。
            var move = board.ConvertMoveFromLiteral(lmove, true);

            if (move == null || !board.CanMove(move))
            {
                return(null);
            }

            // 指し手を表記形式に再度変換します。
            // 移動元の情報は使いません。("65銀(55)"という表記にはしません)
            var newLMove = board.ConvertLiteralFromMove(move, false);

            if (newLMove == null)
            {
                return(null);
            }

            // 最後に元の文字列を保存して返します。
            newLMove.OriginalText = lmove.OriginalText;
            return(newLMove);
        }
示例#2
0
        /// <summary>
        /// このノードの手を実際に指してみて、着手可能か確認します。
        /// </summary>
        private Move MakeMove(Board board, List <Exception> errors)
        {
            var move = board.ConvertMoveFromLiteral(LiteralMove, true);

            if (move == null || !move.Validate())
            {
                errors.Add(new FileFormatException(
                               LineNumber,
                               $"{MoveCount}手目: 指し手が正しくありません。"));
                return(null);
            }

            // 局面を進めます。
            if (!board.DoMove(move))
            {
                errors.Add(new FileFormatException(
                               LineNumber,
                               $"{MoveCount}手目の手を指すことができませんでした。"));
                return(null);
            }

            return(move);
        }
示例#3
0
 /// <summary>
 /// 文字列から得られた指し手から、移動前の情報も含むような
 /// 指し手情報を取得します。
 /// </summary>
 public static Move ConvertMoveFromLiteral(this Board board, LiteralMove move,
                                           bool multipleIsNull = false)
 {
     return(board.ConvertMoveFromLiteral(move, board.Turn, multipleIsNull));
 }