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