/// <summary> /// 駒の種類にかかわりなく、指定の位置に着手可能な指し手をすべて列挙します。 /// </summary> public IEnumerable <BoardMove> ListupMoves(BWType bwType, Square dstSquare) { // 打てる駒をすべて列挙します。 foreach (var pieceType in EnumEx.GetValues <PieceType>()) { if (GetCapturedPieceCount(pieceType, bwType) <= 0) { continue; } var move = BoardMove.CreateDrop(bwType, dstSquare, pieceType); // 駒打ちが可能なら、それも該当手となります。 if (CanMove(move, MoveFlags.CheckOnly)) { yield return(move); } } // 移動による指し手をすべて列挙します。 foreach (var srcSquare in Board.AllSquares()) { var moves = GetAvailableMove(bwType, srcSquare, dstSquare); foreach (var move in moves) { yield return(move); } } }
/// <summary> /// <paramref name="square"/>に<paramref name="pieceType"/>を打ち、 /// なお王手されているか確認します。 /// </summary> private bool IsDropAndChecked(BWType bwType, PieceType pieceType, Square square) { var piece = this[square]; if (piece != null) { return(true); } var move = BoardMove.CreateDrop(bwType, square, pieceType); if (DoMove(move)) { if (!IsChecked(bwType)) { Undo(); return(false); } Undo(); return(true); } return(true); }