/// <summary> /// 駒の種類と新しい位置から、可能な指し手をすべて検索します。 /// </summary> public IEnumerable <Move> ListupMoves(Piece piece, BWType bwType, Square dstSquare) { // 打てる駒をすべて列挙します。 if (!piece.IsPromoted && GetHand(piece.PieceType, bwType) > 0) { var move = Move.CreateDrop(bwType, dstSquare, piece.PieceType); // 駒打ちが可能なら、それも該当手となります。 if (CanMove(move, MoveFlags.CheckOnly)) { yield return(move); } } // 移動による指し手をすべて列挙します。 var srcRange = GetCanMoveRange(piece, dstSquare, bwType.Flip()); foreach (var srcSquare in srcRange) { var moves = GetAvailableMove(piece, bwType, srcSquare, dstSquare); foreach (var move in moves) { yield return(move); } } }
/// <summary> /// <paramref name="bwType"/>側の玉が王手されているか調べます。 /// </summary> public bool IsChecked(BWType bwType) { var gyoku = GetGyoku(bwType); if (gyoku == null || !gyoku.Validate()) { return(false); } // 玉の位置に移動できる駒があれば王手されています。 return(ListupMoves(bwType.Flip(), gyoku).Any()); }
/// <summary> /// 打ち歩詰のチェックを行います。 /// </summary> private bool IsPawnDropCheckMate(BWType bwType, Square square) { // 歩の前に敵の玉がいるか確認します。 var rankDif = (bwType == BWType.Black ? -1 : +1); var gyokuSq = new Square(square.File, square.Rank + rankDif); if (!gyokuSq.Validate()) { return(false); } var gyoku = this[gyokuSq]; if (gyoku == null || gyoku.PieceType != PieceType.Gyoku || gyoku.BWType != bwType.Flip()) { return(false); } var newPiece = new BoardPiece( PieceType.Hu, false, bwType); var oldPiece = this[square]; // 打ち歩詰の判定には、実際に歩を打ってみるのが簡単なため、 // 必要なプロパティのみ更新し、詰まされているか調べます。 this[square] = newPiece; DecHand(PieceType.Hu, bwType); Turn = Turn.Flip(); // 打ち歩詰かどうか確認します。 var mated = IsCheckMated(); this[square] = oldPiece; IncHand(PieceType.Hu, bwType); Turn = Turn.Flip(); return(mated); }
/// <summary> /// 手番の表示を行います。 /// </summary> private void UpdateTeban(BWType teban) { if (this.tebanCell != null) { Container.RemoveBanEffect(this.tebanCell); this.tebanCell = null; } if (!HasEffectFlag(EffectFlag.Teban)) { return; } // 手番なしの時はオブジェクトを消去して帰ります。 if (teban == BWType.None) { return; } // 移動可能なマスにエフェクトをかけます。 var tebanCell = EffectTable.Teban.LoadEffect(); if (tebanCell != null) { if (Container.ViewSide != BWType.Black) { teban = teban.Flip(); } tebanCell.DataContext = CreateCellContext((Square)null) .Apply(_ => _.BWType = teban); Container.AddBanEffect(tebanCell); this.tebanCell = tebanCell; } }
/// <summary> /// <paramref name="bwType"/>側の玉が王手されているか調べます。 /// </summary> public bool IsChecked(BWType bwType) { var gyoku = GetGyoku(bwType); if (gyoku == null || !gyoku.Validate()) { return false; } // 玉の位置に移動できる駒があれば王手されています。 return ListupMoves(bwType.Flip(), gyoku).Any(); }