예제 #1
0
        /// <summary>
        /// 現局面の指し手を進めます。
        /// </summary>
        public void DoMove(BoardMove bmove, int seconds)
        {
            var prevCurrentBoard = CurrentBoard.Clone();

            // 符号は設定されていないことがあります。
            //csaMove.Side = CurrentBoard.Turn;

            /*var bmove = CurrentBoard.ConvertCsaMove(csaMove);
             * if (bmove == null || !bmove.Validate())
             * {
             *  Log.Error("{0}手目 {1}を変換できませんでした。",
             *      CurrentBoard.MoveCount,
             *      csaMove.ToPersonalString());
             *  return;
             * }*/

            if (!CurrentBoard.DoMove(bmove))
            {
                Log.Error("{0}手目 {1}を指せませんでした。",
                          CurrentBoard.MoveCount, bmove);
                return;
            }

            // 手番側の残り時間を減らしたのち、手番を入れ替えます。
            DecBaseLeaveTime(CurrentTurn, seconds);

            InitBoard(CurrentBoard, false, false);

            WPFUtil.UIProcess(() =>
            {
                // 実際に指した手と一致する変化は残します。
                var list = VariationList
                           .Where(_ => _.MoveList.Count() >= 2)
                           .Where(_ => bmove.Equals(_.MoveList[0]))
                           .Select(_ =>
                                   new VariationInfo
                {
                    IsShowed  = false,
                    MoveList  = _.MoveList.Skip(1).ToList(),
                    Value     = _.Value,
                    NodeCount = _.NodeCount,
                })
                           .ToList();

                VariationList.Clear();
                list.ForEach(_ => VariationList.Add(_));

                // 指し手の再生を行います。
                AddDoMoveAutoPlay(prevCurrentBoard, bmove);
            });
        }