/// <summary> /// 打ち歩詰のチェックを行います。 /// </summary> private bool IsDropPawnMate(BWType bwType, Square square) { var newPiece = new BoardPiece( PieceType.Hu, false, bwType); var oldPiece = this[square]; // 打ち歩詰の判定には、実際に歩を打ってみるのが簡単なため、 // 必要なプロパティのみ更新し、詰まされているか調べます。 this[square] = newPiece; DecCapturedPieceCount(PieceType.Hu, bwType); Turn = Turn.Flip(); // 打ち歩詰かどうか確認します。 var mated = IsCheckMated(); this[square] = oldPiece; IncCapturedPieceCount(PieceType.Hu, bwType); Turn = Turn.Flip(); return(mated); }
/// <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> public Board(bool isInitPiece) { this.board = CreatePieceMatrix(); if (isInitPiece) { this[1, 9] = new BoardPiece(PieceType.Kyo, false, BWType.Black); this[2, 9] = new BoardPiece(PieceType.Kei, false, BWType.Black); this[3, 9] = new BoardPiece(PieceType.Gin, false, BWType.Black); this[4, 9] = new BoardPiece(PieceType.Kin, false, BWType.Black); this[5, 9] = new BoardPiece(PieceType.Gyoku, false, BWType.Black); this[6, 9] = new BoardPiece(PieceType.Kin, false, BWType.Black); this[7, 9] = new BoardPiece(PieceType.Gin, false, BWType.Black); this[8, 9] = new BoardPiece(PieceType.Kei, false, BWType.Black); this[9, 9] = new BoardPiece(PieceType.Kyo, false, BWType.Black); this[2, 8] = new BoardPiece(PieceType.Hisya, false, BWType.Black); this[8, 8] = new BoardPiece(PieceType.Kaku, false, BWType.Black); for (var file = 1; file <= BoardSize; ++file) { this[file, 7] = new BoardPiece(PieceType.Hu, false, BWType.Black); } this[1, 1] = new BoardPiece(PieceType.Kyo, false, BWType.White); this[2, 1] = new BoardPiece(PieceType.Kei, false, BWType.White); this[3, 1] = new BoardPiece(PieceType.Gin, false, BWType.White); this[4, 1] = new BoardPiece(PieceType.Kin, false, BWType.White); this[5, 1] = new BoardPiece(PieceType.Gyoku, false, BWType.White); this[6, 1] = new BoardPiece(PieceType.Kin, false, BWType.White); this[7, 1] = new BoardPiece(PieceType.Gin, false, BWType.White); this[8, 1] = new BoardPiece(PieceType.Kei, false, BWType.White); this[9, 1] = new BoardPiece(PieceType.Kyo, false, BWType.White); this[2, 2] = new BoardPiece(PieceType.Kaku, false, BWType.White); this[8, 2] = new BoardPiece(PieceType.Hisya, false, BWType.White); for (var file = 1; file <= BoardSize; ++file) { this[file, 3] = new BoardPiece(PieceType.Hu, false, BWType.White); } } }
/// <summary> /// 局面をバイト列から取得します。 /// </summary> private void DeserializePieces(byte[] bytes) { // 局面の正規化(nullオブジェクトを作らない)を行います。 for (var rank = 1; rank <= BoardSize; ++rank) { for (var file = 1; file <= BoardSize; ++file) { var index = (rank - 1) * BoardSize + (file - 1); // PieceType.Noneが0のため、 // 正しいピースのシリアライズデータは0以外の // 数字となります。 BoardPiece piece = null; if (bytes[index] != 0) { piece = new BoardPiece(); piece.Deserialize(bytes[index]); } this[file, rank] = piece; } } }