/// <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)); } } }
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)); }
/// <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); } } }