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

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

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

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

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

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

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

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

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

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

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

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

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

            return(bmove);
        }
示例#3
0
        /// <summary>
        /// このノードの手を実際に指してみて、着手可能か確認します。
        /// </summary>
        private BoardMove MakeMove(Board board, List<Exception> errors)
        {
            var bmove = board.ConvertMove(Move, true);
            if (bmove == null || !bmove.Validate())
            {
                errors.Add(new FileFormatException(
                    LineNumber,
                    string.Format(
                        "{0}手目: 指し手が正しくありません。",
                        MoveCount)));
                return null;
            }

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

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