Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
                }
            }
        }
Beispiel #4
0
        /// <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;
                }
            }
        }