Пример #1
0
        /// <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);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 玉の数を取得します。
        /// </summary>
        private int GetGyokuCount(BWType bwType)
        {
            var list =
                from sq in Board.AllSquares()
                let piece = this[sq]
                            where piece != null
                            where piece.PieceType == PieceType.Gyoku
                            where piece.BWType == bwType
                            select sq;

            return(list.Count());
        }
Пример #3
0
        /// <summary>
        /// 局面上にある駒の数を取得します。
        /// </summary>
        public int GetPieceCount(PieceType pieceType, BWType bwType)
        {
            var list =
                from sq in Board.AllSquares()
                let piece = this[sq]
                            where piece != null
                            where piece.PieceType == pieceType
                            where piece.BWType == bwType
                            select sq;

            return(list.Count());
        }
Пример #4
0
        /// <summary>
        /// 玉のいる位置を取得します。
        /// </summary>
        public Square GetGyoku(BWType bwType)
        {
            var list =
                from sq in Board.AllSquares()
                let piece = this[sq]
                            where piece != null
                            where piece.PieceType == PieceType.Gyoku
                            where piece.BWType == bwType
                            select sq;

            return(list.FirstOrDefault());
        }
Пример #5
0
        /// <summary>
        /// 盤上の駒や持ち駒の先手・後手をすべて入れ替えます。
        /// </summary>
        public void FlipPieces()
        {
            // すべての駒の先後を入れ替えます。
            Board.AllSquares()
            .Where(_ => this[_] != null)
            .ForEach(_ => this[_].BWType = this[_].BWType.Flip());

            // 各駒の位置を入れ替えます。
            for (var rank = 1; rank <= Board.BoardSize / 2 + 1; ++rank)
            {
                // 5段目は途中の列まで交換します。
                var fileMax = Board.BoardSize / (rank == 5 ? 2 : 1);
                for (var file = 1; file <= fileMax; ++file)
                {
                    var sq1 = new Square(file, rank);
                    var sq2 = sq1.Flip();

                    var p = this[sq1];
                    this[sq1] = this[sq2];
                    this[sq2] = p;
                }
            }

            // 持ち駒の先後を入れ替えます。(数を設定し直します)
            var result =
                from bwType in new BWType[] { BWType.Black, BWType.White }
            let countList = (
                from type in EnumEx.GetValues <PieceType>()
                let count = GetHand(type, bwType)
                            select new { PieceType = type, Count = count }
                ).ToList()
                            select new { BWType = bwType, CountList = countList };

            result.ToList().ForEach(_ =>
            {
                var flipped = _.BWType.Flip();

                _.CountList.ForEach(__ =>
                                    SetHand(__.PieceType, flipped, __.Count));
            });
        }
Пример #6
0
 /// <summary>
 /// 指定の局面で指せるすべての手を取得します。
 /// </summary>
 public IEnumerable <Move> ListupMoves()
 {
     return(Board.AllSquares()
            .SelectMany(_ => ListupMoves(Turn, _)));
 }