示例#1
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);
            }
        }
示例#2
0
        /// <summary>
        /// 指し手がすべて着手可能かどうかを確認します。
        /// </summary>
        public static bool CanMoveList(this Board board,
                                       IEnumerable <Move> moveList)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            // 駒を動かしながら差し手を検証するため、
            // 盤の一時オブジェクトが必要になります。
            var boardTmp = board.Clone();

            foreach (var boardMove in moveList)
            {
                // 次の手を検証する必要があるため、実際に駒を動かします。
                if (!boardTmp.DoMove(boardMove))
                {
                    return(true);
                }
            }

            return(true);
        }
示例#3
0
        /// <summary>
        /// KifMoveNodeからMoveNodeへ構造を変換します。
        /// 結果は<paramref name="root"/>以下に設定されます。
        /// </summary>
        private void ConvertToMoveNode(Board board, MoveNode root,
                                       List<Exception> errors)
        {
            for (var node = this; node != null; node = node.Variation)
            {
                var cloned = board.Clone();

                // 指し手を実際に指してみます。
                var bmove = node.MakeMove(cloned, errors);
                if (bmove == null)
                {
                    continue;
                }

                var moveNode = new MoveNode
                {
                    Move = bmove,
                    MoveCount = node.MoveCount,
                    Duration = node.Duration,
                    Comment = node.Comment,
                };

                // 次の指し手とその変化を変換します。
                if (node.Next != null)
                {
                    node.Next.ConvertToMoveNode(cloned, moveNode, errors);
                }

                root.AddNext(moveNode);
            }
        }
示例#4
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);
            }
        }
示例#5
0
        /// <summary>
        /// 共通コンストラクタ
        /// </summary>
        private AutoPlay(Board board, bool isCloneBoard)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            UpdateEnumeratorFactory = () => GetUpdateEnumerator();
            StartBoard = board;
            Board = (isCloneBoard ? board.Clone() : board);
            IsCloneBoard = isCloneBoard;
            Interval = DefaultInterval;
            EffectFadeInterval = DefaultEffectFadeInterval;
            BeginningInterval = TimeSpan.Zero;
            EndingInterval = TimeSpan.Zero;
            Position = TimeSpan.Zero;
            BasePosition = TimeSpan.Zero;
            IsWaitForLastMove = true;
        }