Ejemplo n.º 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);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 局面を設定し、局面に指し手がある場合はそれを指し手リストに追加します。
        /// </summary>
        /// <remarks>
        /// <paramref name="isStartBoard"/>が真の場合は開始局面のみ
        /// (手を全く指していない=手数が0)しか受け入れません。
        /// </remarks>
        public void SetBoard(Board board, bool isStartBoard)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

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

            // 念のためクローンしておきます。
            board = board.Clone();

            if (isStartBoard)
            {
                if (board.MoveCount > 0)
                {
                    throw new ShogiException(
                              "SetBoardには開始局面を設定してください。");
                }

                StartBoard = board;
            }
            else
            {
                // 開始局面でなくてもよい場合は、指し手を別に取得します。
                var moveList = new List <BoardMove>();
                for (var move = board.Undo(); move != null; move = board.Undo())
                {
                    moveList.Insert(0, move);
                }

                StartBoard = board;
                SetMoveList(moveList);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 局面を設定し、局面に指し手がある場合はそれを指し手リストに追加します。
        /// </summary>
        /// <remarks>
        /// <paramref name="isStartBoard"/>が真の場合は開始局面のみ
        /// (手を全く指していない=手数が0)しか受け入れません。
        /// </remarks>
        public void SetBoard(Board board, bool isStartBoard)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

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

            // 念のためクローンしておきます。
            board = board.Clone();

            if (isStartBoard)
            {
                if (board.MoveCount > 0)
                {
                    throw new ShogiException(
                        "SetBoardには開始局面を設定してください。");
                }

                StartBoard = board;
            }
            else
            {
                // 開始局面でなくてもよい場合は、指し手を別に取得します。
                var moveList = new List<BoardMove>();
                for (var move = board.Undo(); move != null; move = board.Undo())
                {
                    moveList.Insert(0, move);
                }

                StartBoard = board;
                SetMoveList(moveList);
            }
        }