Пример #1
0
        /// <summary>
        /// <paramref name="srcSquare"/>の駒を<paramref name="dstSquare"/>
        /// に動かすことが可能な指し手をすべて列挙します。
        /// </summary>
        private IEnumerable <BoardMove> GetAvailableMove(BWType bwType,
                                                         Square srcSquare,
                                                         Square dstSquare)
        {
            var piece = this[srcSquare];

            if (piece == null || piece.BWType != bwType)
            {
                yield break;
            }

            var move = BoardMove.CreateMove(
                bwType, srcSquare, dstSquare, piece.Piece, false);

            // 成り駒でなければ、成る可能性があります。
            if (!piece.IsPromoted)
            {
                move.IsPromote = true;
                if (CanMove(move, MoveFlags.CheckOnly))
                {
                    // yield returnなのでCloneしないとまずい。
                    yield return(move.Clone());
                }
            }

            move.IsPromote = false;
            if (CanMove(move, MoveFlags.CheckOnly))
            {
                yield return(move);
            }
        }
Пример #2
0
        /// <summary>
        /// <paramref name="srcSquare"/>の駒を<paramref name="dstSquare"/>
        /// に動かすことが可能な指し手を指してみて、なお王手されているか確認します。
        /// </summary>
        private bool IsMoveAndChecked(BWType bwType, Square srcSquare,
                                      Square dstSquare)
        {
            var piece = this[srcSquare];

            if (piece == null || piece.BWType != bwType)
            {
                return(true);
            }

            var move = BoardMove.CreateMove(
                bwType, srcSquare, dstSquare, piece.Piece, false);

            // 成り駒でなければ、成る可能性があります。
            if (!piece.IsPromoted)
            {
                move.IsPromote = true;
                if (DoMove(move))
                {
                    if (!IsChecked(bwType))
                    {
                        Undo();
                        return(false);
                    }
                    Undo();

                    return(true);
                }
            }

            move.IsPromote = false;
            if (DoMove(move))
            {
                if (!IsChecked(bwType))
                {
                    Undo();
                    return(false);
                }
                Undo();

                return(true);
            }

            return(true);
        }