Ejemplo n.º 1
0
        /// <summary>
        /// 駒を動かすか、または駒が動かせるか調べます。
        /// </summary>
        private bool CheckAndMakeMove(BoardMove move, MoveFlags flags)
        {
            if (move == null || !move.Validate())
            {
                throw new ArgumentNullException("move");
            }

            // 投了などの特殊な指し手がある場合はゲームが既に終了しているので
            // 指し手を進めることはできません。
            if (HasSpecialMove)
            {
                if (flags.HasFlag(MoveFlags.CheckOnly))
                {
                    // CheckOnlyの場合は、ここで失敗させません。
                }
                else if (flags.HasFlag(MoveFlags.AutoRemoveSpecialMove))
                {
                    // 特殊な指し手を取り除きます。
                    RemoveSpecialMove();
                }
                else
                {
                    return(false);
                }
            }

            using (LazyLock())
            {
                // 手番があわなければ失敗とします。
                if (EnumEx.HasFlag(flags, MoveFlags.CheckTurn))
                {
                    if (this.turn == BWType.None || this.turn != move.BWType)
                    {
                        return(false);
                    }
                }

                if (move.IsSpecialMove)
                {
                    return(CheckAndMakeSpecialMove(move, flags));
                }
                else if (move.ActionType == ActionType.Drop)
                {
                    return(CheckAndMakeDrop(move, flags));
                }
                else
                {
                    return(CheckAndMakeMoveOnly(move, flags));
                }
            }
        }
Ejemplo n.º 2
0
        private AllMoves initMoves(PieceColor colorFlags)
        {
            MoveList[] moveLists = new MoveList[64];
            for (Square startPosition = Square.A1; startPosition <= Square.H8; startPosition++)
            {
                moveLists[(byte)startPosition] = new MoveList();
                foreach (MoveDirections dir in KingDirections)
                {
                    Square    position  = startPosition;
                    MoveFlags moveFlags = MoveFlags.EitherType;

                    while (movePosition(ref position, dir))
                    {
                        moveLists[(byte)startPosition].Add(new Move(moveFlags, dir, startPosition, position, position));

                        if ((dir == MoveDirections.Move_E || dir == MoveDirections.Move_W) && !moveFlags.HasFlag(MoveFlags.Castle))
                        {
                            moveFlags |= MoveFlags.Castle;
                            moveFlags &= ~MoveFlags.Capture;
                            if ((startPosition == whiteCastlePosition && colorFlags == PieceColor.White ||
                                 startPosition == blackCastlePosition && colorFlags == PieceColor.Black))
                            {
                                continue;
                            }
                        }
                        break;
                    }
                }
            }
            return(new AllMoves(moveLists));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 駒を動かすか、または駒が動かせるか調べます。
        /// </summary>
        private bool CheckAndMakeMove(BoardMove move, MoveFlags flags)
        {
            if (move == null || !move.Validate())
            {
                throw new ArgumentNullException("move");
            }

            // 投了などの特殊な指し手がある場合はゲームが既に終了しているので
            // 指し手を進めることはできません。
            if (HasSpecialMove)
            {
                if (flags.HasFlag(MoveFlags.CheckOnly))
                {
                    // CheckOnlyの場合は、ここで失敗させません。
                }
                else if (flags.HasFlag(MoveFlags.AutoRemoveSpecialMove))
                {
                    // 特殊な指し手を取り除きます。
                    RemoveSpecialMove();
                }
                else
                {
                    return false;
                }
            }

            using (LazyLock())
            {
                // 手番があわなければ失敗とします。
                if (EnumEx.HasFlag(flags, MoveFlags.CheckTurn))
                {
                    if (this.turn == BWType.None || this.turn != move.BWType)
                    {
                        return false;
                    }
                }

                if (move.IsSpecialMove)
                {
                    return CheckAndMakeSpecialMove(move, flags);
                }
                else if (move.ActionType == ActionType.Drop)
                {
                    return CheckAndMakeDrop(move, flags);
                }
                else
                {
                    return CheckAndMakeMoveOnly(move, flags);
                }
            }
        }