예제 #1
0
        /// <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);
                }
            }
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
파일: Board.cs 프로젝트: Shiiina/Ragnarok
        /// <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);
        }
예제 #4
0
        /// <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;
            }
        }
예제 #5
0
        /// <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();
        }