/// <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)); } } }
/// <summary> /// 指し手をXX->YYの形式から、ZZ銀上などの形に変換します。 /// </summary> /// <remarks> /// <paramref name="useSrcSquare"/>を真にすると、差し手の後に /// 古い位置の情報が付加されるようになります。(例: 32金(22)) /// </remarks> public static Move ConvertMove(this Board board, BoardMove move, bool useSrcSquare) { if (board == null) { throw new ArgumentNullException("board"); } if (move == null || !move.Validate()) { throw new ArgumentNullException("move"); } if (move.IsSpecialMove) { return(new Move { BWType = move.BWType, SpecialMoveType = move.SpecialMoveType, }); } var fromPiece = ( move.ActionType == ActionType.Drop ? new Piece(move.DropPieceType) : move.MovePiece); if (fromPiece == null) { return(null); } // 駒の種類と最終位置から、あり得る指し手をすべて検索します。 var boardMoveList = board.ListupMoves( fromPiece, move.BWType, move.DstSquare) .ToList(); return(FilterMove( board, boardMoveList, move, fromPiece, useSrcSquare)); }