Beispiel #1
0
        /// <summary>
        /// 直前の相手の手を考慮して、与えられた指し手を修正します。
        /// </summary>
        private LiteralMove ModifyMove(LiteralMove move)
        {
            /*if (move == null || !move.Validate())
             * {
             *  throw new Exception("与えられた指し手が正しくありません。");
             * }*/

            using (LazyLock())
            {
                if (this.opponentMove == null)
                {
                    return(move);
                }

                var newMove = move.Clone();

                // 同○○なら、相手の直前の手と列段を合わせます。
                if (newMove.SameAsOld)
                {
                    newMove.File = this.opponentMove.File;
                    newMove.Rank = this.opponentMove.Rank;
                }
                else if (newMove.File == this.opponentMove.File &&
                         newMove.Rank == this.opponentMove.Rank)
                {
                    newMove.SameAsOld = true;
                }

                return(newMove);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 文字列から得られた指し手から、移動前の情報も含むような
        /// 指し手情報を取得します。
        /// </summary>
        public static Move ConvertMoveFromLiteral(this Board board, LiteralMove move,
                                                  BWType bwType,
                                                  bool multipleIsNull = false)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

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

            if (move.SameAsOld && board.PrevMovedSquare == null)
            {
                return(null);
            }

            if (move.IsSpecialMove)
            {
                return(Move.CreateSpecialMove(
                           bwType, move.SpecialMoveType));
            }

            // 移動後の位置を取得します。
            // 同○○なら前回の位置を使います。
            var dstSquare = move.DstSquare;

            if (move.SameAsOld)
            {
                move           = move.Clone();
                move.DstSquare = board.PrevMovedSquare;

                dstSquare = board.PrevMovedSquare;
            }

            var boardMoveList = board.ListupMoves(
                move.Piece, bwType, dstSquare)
                                .ToList();

            // 複数の指し手の中から適切な一つを選びます。
            var boardMove = FilterMoveFromLiteral(boardMoveList, move, multipleIsNull);

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

            return(boardMove);
        }